시계열 예측 모델 만들기 (주식 가격 예측)
1. 개요
시계열 예측(Time Series Forecasting)은 과거 데이터를 기반으로 미래 값을 예측하는 기법입니다. 주식 시장에서는 과거의 가격 변동 패턴을 학습하여 미래 가격을 예측하는 데 활용됩니다. 이번 포스팅에서는 딥러닝을 활용하여 주식 가격을 예측하는 모델을 만들어 보겠습니다.
본 튜토리얼에서는 LSTM(Long Short-Term Memory) 신경망을 활용하여 주식 가격을 예측하는 모델을 구축합니다. LSTM은 순환 신경망(RNN)의 한 종류로, 장기 의존성을 학습하는 데 강점을 가집니다.
2. 데이터 준비
주식 데이터는 Yahoo Finance에서 다운로드할 수 있으며, 이를 yfinance
라이브러리를 이용해 가져오겠습니다. 데이터 전처리 과정에서는 Pandas와 NumPy를 활용하여 데이터를 정리하고, 학습 및 테스트 세트를 나누겠습니다.
2.1. 라이브러리 설치 및 불러오기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import yfinance as yf
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
2.2. 데이터 다운로드
# 특정 주식 (예: 애플)의 가격 데이터 다운로드
stock_symbol = 'AAPL' # 애플(AAPL) 주식
start_date = '2015-01-01'
end_date = '2024-01-01'
# Yahoo Finance에서 데이터 다운로드
data = yf.download(stock_symbol, start=start_date, end=end_date)
print(data.head())
데이터는 Date
인덱스를 가지며, Open
, High
, Low
, Close
, Volume
, Adj Close
등의 컬럼을 포함합니다. 우리는 Close
가격을 예측할 것이므로, 해당 컬럼만 선택하여 활용하겠습니다.
df = data[['Close']]
3. 데이터 전처리
LSTM 모델을 학습하기 위해 데이터를 정규화하고, 입력 시퀀스를 생성해야 합니다.
3.1. 데이터 정규화
LSTM 모델의 입력 데이터는 0~1 범위로 정규화해야 학습이 안정적입니다. 이를 위해 MinMaxScaler
를 사용합니다.
scaler = MinMaxScaler(feature_range=(0, 1))
data_scaled = scaler.fit_transform(df)
3.2. 시퀀스 데이터 생성
LSTM 모델은 과거 n
일 동안의 데이터를 입력으로 받아 다음 날의 가격을 예측하도록 학습합니다. 이를 위해 create_sequences
함수를 정의합니다.
def create_sequences(data, seq_length):
sequences = []
labels = []
for i in range(len(data) - seq_length):
sequences.append(data[i:i+seq_length])
labels.append(data[i+seq_length])
return np.array(sequences), np.array(labels)
seq_length = 50 # 최근 50일 데이터를 기반으로 예측
target_col = 0 # Close 가격 기준으로 예측
X, y = create_sequences(data_scaled, seq_length)
3.3. 학습 및 테스트 데이터 분할
데이터의 80%를 학습 데이터, 20%를 테스트 데이터로 사용합니다.
train_size = int(len(X) * 0.8)
X_train, X_test = X[:train_size], X[train_size:]
y_train, y_test = y[:train_size], y[train_size:]
4. LSTM 모델 구축 및 학습
LSTM 모델을 구축하고, Adam
옵티마이저와 Mean Squared Error (MSE)
손실 함수를 사용하여 학습을 진행합니다.
4.1. 모델 정의
model = Sequential([
LSTM(50, return_sequences=True, input_shape=(seq_length, 1)),
Dropout(0.2),
LSTM(50, return_sequences=False),
Dropout(0.2),
Dense(25),
Dense(1)
])
model.compile(optimizer='adam', loss='mse')
model.summary()
4.2. 모델 학습
history = model.fit(X_train, y_train, epochs=50, batch_size=32, validation_data=(X_test, y_test))
5. 예측 및 평가
모델이 학습된 후, 테스트 데이터에 대한 예측을 수행하고 성능을 평가합니다.
5.1. 예측 수행
y_pred = model.predict(X_test)
y_pred = scaler.inverse_transform(y_pred) # 정규화 해제
y_test_actual = scaler.inverse_transform(y_test.reshape(-1, 1)) # 정규화 해제
5.2. 결과 시각화
plt.figure(figsize=(12, 6))
plt.plot(y_test_actual, label='Actual Price')
plt.plot(y_pred, label='Predicted Price', linestyle='dashed')
plt.legend()
plt.title(f'{stock_symbol} 주식 가격 예측')
plt.show()
6. 결론
이번 포스팅에서는 LSTM을 활용하여 주식 가격을 예측하는 모델을 구축해 보았습니다. 주요 내용은 다음과 같습니다:
yfinance
를 이용해 주식 가격 데이터를 다운로드하였습니다.- 데이터를 정규화하고, LSTM 모델에 적합한 형태로 변환하였습니다.
- LSTM 기반의 신경망을 설계하고, 학습을 진행하였습니다.
- 학습된 모델을 이용하여 주식 가격을 예측하고, 실제 값과 비교하였습니다.
딥러닝을 활용한 시계열 예측은 금융, 기후 예측, 에너지 수요 예측 등 다양한 분야에서 활용될 수 있습니다.
'Python DeepLearning' 카테고리의 다른 글
자연어 처리(NLP) 기반 챗봇 모델 만들기 (0) | 2025.05.04 |
---|---|
음성 인식 모델 구현 (Librosa 및 딥러닝 활용) (0) | 2025.05.02 |
얼굴 인식 모델 구현 (OpenCV 및 딥러닝 활용) (0) | 2025.04.30 |
감성 분석(Sentiment Analysis) 모델 구현 (영문 텍스트 분석) (0) | 2025.04.29 |
CIFAR-10 데이터셋을 활용한 개와 고양이 분류기 구현 (0) | 2025.04.28 |