본문 바로가기

Study Information Technology

LSTM을 이용한 주식 가격 예측 모델 구축

728x90
반응형

LSTM을 이용한 주식 가격 예측 모델 구축

Overview

주식 가격 예측은 금융 데이터 분석에서 중요한 분야입니다. 이 과정에서 LSTM(장기 단기 메모리) 네트워크는 시간에 따른 데이터의 패턴을 학습하는 데 매우 유용한 도구로 자리 잡았습니다. LSTM은 순환 신경망(RNN)의 한 종류로, 시계열 데이터의 장기 의존성을 잘 포착할 수 있는 능력을 가지고 있습니다. 이 글에서는 LSTM을 활용한 주식 가격 예측 모델을 구축하는 과정과 관련된 중요한 요소들을 상세히 설명하겠습니다.

1. 데이터 수집

주식 가격 예측 모델을 구축하기 위해 먼저 필요한 것은 역사적인 주식 데이터입니다. 이 데이터는 일반적으로 Yahoo Finance, Alpha Vantage, 또는 Quandl 같은 API를 통해 수집할 수 있습니다. 여기서는 Python의 yfinance 라이브러리를 사용하여 데이터를 수집하는 방법을 예시로 보여드리겠습니다.

import yfinance as yf

# 특정 주식의 역사적 데이터 수집
ticker = 'AAPL'  # Apple Inc.
data = yf.download(ticker, start='2010-01-01', end='2023-01-01')
print(data.head())

위 코드는 Apple Inc.의 2010년 1월 1일부터 2023년 1월 1일까지의 주가 데이터를 다운로드하는 예시입니다. 데이터는 날짜, 개장가(Open), 고가(High), 저가(Low), 종가(Close), 거래량(Volume) 등으로 구성됩니다.

2. 데이터 전처리

수집한 데이터는 LSTM 모델에 맞게 전처리해야 합니다. 주요 단계는 다음과 같습니다:

2.1. 결측치 처리

결측치가 존재할 경우, 이를 처리해야 합니다. 보통은 이전 값을 이용해 결측치를 대체하거나, 해당 행을 삭제하는 방법을 사용합니다.

data.fillna(method='ffill', inplace=True)  # 이전 값으로 결측치 대체

2.2. 스케일링

LSTM은 입력 데이터의 스케일에 민감하기 때문에, MinMaxScaler를 사용하여 데이터를 0과 1 사이로 스케일링합니다.

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data['Close'].values.reshape(-1, 1))

2.3. 데이터셋 생성

모델에 입력하기 위해 시퀀스를 생성합니다. 예를 들어, 60일 간의 데이터를 사용하여 다음 날의 종가를 예측하도록 합니다.

import numpy as np

def create_dataset(data, time_step=1):
X, y = [], []
for i in range(len(data) - time_step - 1):
a = data[i:(i + time_step), 0]
X.append(a)
y.append(data[i + time_step, 0])
return np.array(X), np.array(y)

X, y = create_dataset(scaled_data, 60)
X = X.reshape(X.shape[0], X.shape[1], 1)  # LSTM 입력에 맞게 reshape

3. LSTM 모델 구축

이제 LSTM 모델을 구축할 차례입니다. TensorFlow와 Keras를 사용하여 모델을 정의하고 학습시킵니다.

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout

model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X.shape[1], 1)))
model.add(Dropout(0.2))
model.add(LSTM(units=50, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(units=1))  # 예측 값 출력

model.compile(optimizer='adam', loss='mean_squared_error')

4. 모델 학습

모델을 학습시키는 과정입니다. 학습 데이터와 검증 데이터를 나누어 모델의 일반화 성능을 높입니다.

# 데이터를 학습용과 테스트용으로 나누기
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:]

# 모델 학습
model.fit(X_train, y_train, epochs=50, batch_size=32)

5. 예측 및 성능 평가

모델의 예측 성능을 평가하고, 실제 가격과 예측 가격을 비교하여 성능을 시각화합니다.

import matplotlib.pyplot as plt

# 예측
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)

# 예측 결과를 원래 스케일로 되돌리기
train_predict = scaler.inverse_transform(train_predict)
test_predict = scaler.inverse_transform(test_predict)

# 실제 가격과 예측 가격 시각화
plt.plot(data.index[:train_size], data['Close'][:train_size], label='Train Data')
plt.plot(data.index[train_size:], data['Close'][train_size:], label='Test Data')
plt.plot(data.index[60:train_size+60], train_predict, label='Train Predict')
plt.plot(data.index[train_size+60:], test_predict, label='Test Predict')
plt.legend()
plt.show()

6. 오류 처리 및 해결책

모델 구축 및 예측 과정에서 다양한 오류가 발생할 수 있습니다. 다음은 일반적인 오류와 그 해결책입니다.

6.1. OOM(Out Of Memory) 오류

대량의 데이터를 처리할 때 메모리 부족 문제가 발생할 수 있습니다. 이 경우, 데이터 샘플을 줄이거나, 배치 크기를 조정하여 해결할 수 있습니다.

6.2. 과적합

모델이 학습 데이터에 너무 치우치게 되면 테스트 데이터에서 성능이 떨어지는 과적합 현상이 발생할 수 있습니다. 이를 방지하기 위해 Dropout 레이어를 추가하거나, 학습 데이터를 더 늘리는 방법이 있습니다.

결론

LSTM을 활용한 주식 가격 예측 모델은 과거의 가격 데이터를 기반으로 미래 가격을 예측하는 강력한 도구입니다. 이 모델은 주식 시장의 복잡한 패턴을 이해하고 예측하는 데 도움을 줄 수 있습니다. 하지만, 예측은 항상 불확실성을 동반하므로 모델의 한계를 인지하고 다양한 추가적인 요인을 고려해야 합니다.

참고문서

728x90
반응형