import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
# 1. 데이터 로딩
df = pd.read_csv("btc_5min_last_60days.csv")
df = df[['close']]
df.dropna(inplace=True)
# 2. 정규화
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(df)
# 3. 시계열 샘플 구성
def create_sequences(data, seq_len=60):
x, y = [], []
for i in range(seq_len, len(data)):
x.append(data[i-seq_len:i])
y.append(data[i])
return np.array(x), np.array(y)
seq_len = 60
X, y = create_sequences(scaled_data, seq_len)
# 학습/검증 분할
train_size = int(len(X) * 0.9)
X_train, X_val = X[:train_size], X[train_size:]
y_train, y_val = y[:train_size], y[train_size:]
# 4. 모델 정의 (Keras Sequential API)
model = Sequential()
model.add(LSTM(64, return_sequences=True, input_shape=(X.shape[1], 1)))
model.add(Dropout(0.2))
model.add(LSTM(64))
model.add(Dropout(0.2))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mean_squared_error')
model.summary()
# 5. 학습
history = model.fit(X_train, y_train, epochs=20, batch_size=64, validation_data=(X_val, y_val))
# 6. 마지막 구간 예측
pred = model.predict(X_val)
pred = scaler.inverse_transform(pred)
real = scaler.inverse_transform(y_val)
# 7. 예측 결과 시각화
plt.figure(figsize=(12, 5))
plt.plot(real, label='Real')
plt.plot(pred, label='Predicted')
plt.title("BTC Price Prediction (Keras LSTM)")
plt.xlabel("Time Step")
plt.ylabel("Price (USD)")
plt.legend()
plt.tight_layout()
plt.show()