예측값 조졌따리... 다시 코드 짜야한다!
import pandas as pd
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt
# 1. 데이터 불러오기
df = pd.read_csv("btc_data.csv", parse_dates=["timestamp"], encoding="utf-8-sig")
# 2. 지표 계산
def compute_rsi(series, period=14):
delta = series.diff()
gain = delta.clip(lower=0)
loss = -delta.clip(upper=0)
avg_gain = gain.rolling(window=period).mean()
avg_loss = loss.rolling(window=period).mean()
rs = avg_gain / avg_loss
return 100 - (100 / (1 + rs))
def compute_bollinger_bands(series, window=20):
sma = series.rolling(window=window).mean()
std = series.rolling(window=window).std()
return sma + 2*std, sma - 2*std
df['rsi'] = compute_rsi(df['close'])
df['bb_upper'], df['bb_lower'] = compute_bollinger_bands(df['close'])
df.dropna(inplace=True)
# 3. 다변량 입력 구성
features = ['close', 'volume', 'rsi', 'bb_upper', 'bb_lower']
scaler = MinMaxScaler()
scaled = scaler.fit_transform(df[features])
lookback = 60
X, y = [], []
for i in range(lookback, len(scaled)):
X.append(scaled[i-lookback:i])
y.append(scaled[i][0]) # 'close'만 예측
X = np.array(X)
y = np.array(y)
# 4. 학습/테스트 분리
split = int(len(X) * 0.8)
X_train, X_test = X[:split], X[split:]
y_train, y_test = y[:split], y[split:]
# 5. LSTM 모델 정의 및 학습
model = Sequential([
LSTM(64, return_sequences=True, input_shape=(X.shape[1], X.shape[2])),
Dropout(0.2),
LSTM(64),
Dropout(0.2),
Dense(1)
])
model.compile(loss='mse', optimizer='adam')
model.fit(X_train, y_train, epochs=10, batch_size=16, validation_data=(X_test, y_test), verbose=1)
# 6. 예측 및 복원
preds = model.predict(X_test)
y_pred = preds.flatten() * (scaler.data_max_[0] - scaler.data_min_[0]) + scaler.data_min_[0]
y_true = y_test * (scaler.data_max_[0] - scaler.data_min_[0]) + scaler.data_min_[0]
# 7. 시각화
import matplotlib.pyplot as plt
plt.figure(figsize=(12,6))
plt.plot(y_true, label='실제 종가', color='blue')
plt.plot(y_pred, label='예측 종가', color='red')
plt.title('테스트 데이터 예측 결과')
plt.legend()
plt.show()
# 8. 모델 저장
model.save("saved_model/btc_lstm_model.h5")