역사적 주식 가격 동향 분석을 위한 순환 신경망(RNN) 모델 생성하기
Overview
주식 시장은 데이터의 패턴을 분석하고 예측하는 데 있어 복잡한 환경입니다. 이와 같은 분석을 위해 딥러닝, 특히 순환 신경망(RNN)은 시계열 데이터에 매우 적합한 모델입니다. 이번 글에서는 RNN을 사용하여 역사적 주식 가격 동향을 분석하는 방법을 자세히 설명하겠습니다. 실제 코드 예제와 함께, 데이터 전처리, 모델 구축, 학습 과정, 평가 방법, 그리고 발생할 수 있는 에러 및 해결책도 다룰 것입니다.
1. 데이터 수집
주식 가격 데이터를 분석하기 위해 먼저 데이터를 수집해야 합니다. 주식 시장 데이터는 Yahoo Finance, Alpha Vantage와 같은 API를 통해 손쉽게 가져올 수 있습니다. 예를 들어, yfinance
라이브러리를 사용하여 Apple(AAPL) 주식 데이터를 수집할 수 있습니다.
import yfinance as yf
import pandas as pd
# Apple 주식 데이터 다운로드
data = yf.download('AAPL', start='2010-01-01', end='2023-01-01')
data.head()
이 코드로 AAPL
주식의 2010년부터 2023년까지의 데이터가 data
DataFrame에 저장됩니다.
2. 데이터 전처리
딥러닝 모델에 데이터를 입력하기 위해서는 전처리가 필요합니다. 주식 가격 데이터는 보통 결측치가 있을 수 있으며, 예측에 사용할 특성(feature)을 선택해야 합니다. 여기서는 종가(Close) 가격을 사용할 것입니다.
# 종가 데이터만 선택
close_prices = data['Close'].values
# 데이터 정규화 (0과 1 사이로)
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_prices = scaler.fit_transform(close_prices.reshape(-1, 1))
데이터를 정규화하여 학습이 더 원활하게 진행되도록 합니다.
3. 데이터셋 생성
RNN 모델은 시계열 데이터를 처리하기 때문에, 시퀀스 데이터를 생성해야 합니다. 예를 들어, 마지막 60일의 주식 가격을 바탕으로 다음 날의 가격을 예측하는 구조로 만들어 보겠습니다.
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)
# 데이터셋 생성
time_step = 60
X, y = create_dataset(scaled_prices, time_step)
X = X.reshape(X.shape[0], X.shape[1], 1) # RNN 입력 형식으로 변환
여기서 create_dataset
함수는 입력 데이터와 타겟 데이터를 생성합니다.
4. RNN 모델 구축
이제 Keras 라이브러리를 사용하여 RNN 모델을 구축하겠습니다. RNN 레이어와 함께 Dropout 레이어를 추가하여 과적합을 방지할 수 있습니다.
from keras.models import Sequential
from keras.layers import Dense, LSTM, 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')
이 모델은 두 개의 LSTM 레이어로 구성되어 있으며, 각 레이어 뒤에는 Dropout 레이어를 추가하여 과적합을 방지합니다.
5. 모델 학습
이제 데이터를 학습시키는 단계입니다. 데이터셋을 훈련 세트와 테스트 세트로 나누고 모델을 학습시켜보겠습니다.
# 데이터 나누기
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)
여기서 50 에폭 동안 학습을 진행하며, 배치 크기는 32로 설정했습니다.
6. 모델 평가
학습이 완료된 후, 모델의 성능을 평가할 차례입니다. 테스트 세트를 사용하여 예측값과 실제값을 비교합니다.
# 예측
predicted_prices = model.predict(X_test)
predicted_prices = scaler.inverse_transform(predicted_prices)
# 실제값과 예측값 비교
import matplotlib.pyplot as plt
plt.plot(scaler.inverse_transform(y_test.reshape(-1, 1)), color='red', label='Actual Stock Price')
plt.plot(predicted_prices, color='blue', label='Predicted Stock Price')
plt.title('Stock Price Prediction')
plt.xlabel('Time')
plt.ylabel('Stock Price')
plt.legend()
plt.show()
이 코드로 실제 주식 가격과 예측된 주식 가격을 시각적으로 비교할 수 있습니다.
7. 발생 가능한 에러 및 해결책
모델 학습 중 여러 가지 에러가 발생할 수 있습니다. 가장 흔한 에러는 데이터의 형태와 관련된 에러입니다.
에러 예시: ValueError: Input 0 of layer "lstm" is incompatible with the layer: expected shape=(None, 60, 1), found shape=(None, 60)
이 에러는 RNN 입력 데이터의 형태가 맞지 않을 때 발생합니다. 이 경우, 입력 데이터를 reshape
하여 (samples, time_steps, features)
형태로 맞추어야 합니다. 이를 위해 데이터 전처리 단계에서 X
를 적절히 변형해야 합니다.
8. 결론
이번 글에서는 RNN을 사용하여 역사적 주식 가격 동향을 분석하는 방법을 설명했습니다. 데이터 수집부터 전처리, 모델 구축, 학습, 평가까지의 전 과정을 다루었으며, 발생할 수 있는 에러에 대해서도 간단히 언급했습니다. 주식 시장은 복잡하고 예측이 어려운 분야이지만, RNN을 활용한 분석은 그 가능성을 높일 수 있습니다.
참고문서
'Study Information Technology' 카테고리의 다른 글
복권 번호 예측 모델을 위한 특성 공학 (0) | 2024.09.26 |
---|---|
로또 번호 데이터셋에서 주성분 분석을 통한 차원 축소 및 주요 요인 식별 (0) | 2024.09.26 |
AI 기반 트레이딩 신호 및 알림 시스템 구현하기 (0) | 2024.09.25 |
외부 데이터셋 통합을 통한 주식 가격 예측 모델 개선 (0) | 2024.09.25 |
강화 학습을 이용한 적응형 거래 전략 개발 (0) | 2024.09.25 |