카테고리 없음

10주차 TIL - ✅ 다변량 입력 기반 전체 학습 코드

게임취업하고싶은 사람 2025. 4. 1. 21:03

예측값 조졌따리... 다시 코드 짜야한다!

 

 

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")