본문 바로가기

Study Information Technology

주식 가격 예측 모델 개발 결정 트리와 랜덤 포레스트를 이용한 접근법

728x90
반응형

주식 가격 예측 모델 개발: 결정 트리와 랜덤 포레스트를 이용한 접근법

Overview

주식 시장의 변동성을 예측하는 것은 투자자에게 큰 기회를 제공합니다. 머신러닝 알고리즘은 이러한 예측을 보다 정교하게 만들어 줄 수 있는데, 특히 결정 트리(Decision Trees)와 랜덤 포레스트(Random Forests) 알고리즘이 주로 사용됩니다. 이번 글에서는 이 두 알고리즘을 사용해 주식 가격 예측 모델을 개발하는 방법에 대해 자세히 설명하겠습니다.

1. 데이터 수집

모델을 개발하기 위해서는 먼저 데이터를 수집해야 합니다. 주식 가격 데이터는 Yahoo Finance, Alpha Vantage, Quandl 등의 API를 통해 쉽게 얻을 수 있습니다.

예를 들어, Python의 yfinance 라이브러리를 사용하여 데이터를 수집할 수 있습니다.

import yfinance as yf

# 특정 주식의 데이터를 다운로드
ticker = 'AAPL'  # 애플 주식
data = yf.download(ticker, start='2020-01-01', end='2023-01-01')
print(data.head())

이 코드를 실행하면 애플 주식의 2020년부터 2023년까지의 가격 데이터가 출력됩니다. 데이터는 일반적으로 다음과 같은 형식을 가집니다:

Open      High       Low     Close   Volume  Adj Close
Date
2020-01-02  296.23999  298.929993  296.0   297.429993 33870100  297.429993
2020-01-03  295.949982  296.140015  290.429993  293.649994 33870100  293.649994
...

2. 데이터 전처리

수집한 데이터를 모델에 적합하게 변환하는 과정이 필요합니다. 일반적으로는 결측치 처리, 정규화, 특성 생성 등을 수행합니다.

결측치 처리

데이터에 결측치가 있을 경우, 이를 제거하거나 평균값, 중앙값 등으로 대체할 수 있습니다.

data = data.fillna(method='ffill')  # 결측치를 앞의 값으로 대체

특성 생성

주식 예측에 사용할 특성을 생성할 수 있습니다. 예를 들어, 이동 평균(Moving Average)이나 상대 강도 지수(RSI)와 같은 지표를 추가할 수 있습니다.

data['SMA_20'] = data['Close'].rolling(window=20).mean()  # 20일 이동 평균
data['SMA_50'] = data['Close'].rolling(window=50).mean()  # 50일 이동 평균

3. 훈련 및 테스트 데이터 분할

데이터가 준비되면 모델을 훈련할 데이터와 평가할 데이터를 분리합니다. 일반적으로 70%는 훈련 데이터로, 30%는 테스트 데이터로 사용합니다.

from sklearn.model_selection import train_test_split

X = data[['SMA_20', 'SMA_50']]  # 입력 특성
y = data['Close'].shift(-1)  # 다음 날의 종가를 예측

X_train, X_test, y_train, y_test = train_test_split(X[:-1], y[:-1], test_size=0.3, random_state=42)

4. 모델 선택 및 학습

결정 트리와 랜덤 포레스트 알고리즘을 사용할 수 있습니다. 이 두 모델은 분류 및 회귀 문제에 모두 사용할 수 있으며, 특정 데이터셋에 따라 성능이 달라질 수 있습니다.

결정 트리

결정 트리는 직관적이고 해석이 용이한 모델입니다. Python의 scikit-learn 라이브러리를 사용해 모델을 학습시킬 수 있습니다.

from sklearn.tree import DecisionTreeRegressor

# 결정 트리 모델 생성
dt_model = DecisionTreeRegressor()
dt_model.fit(X_train, y_train)

랜덤 포레스트

랜덤 포레스트는 여러 결정 트리를 결합하여 예측의 정확도를 높이는 앙상블 방법입니다.

from sklearn.ensemble import RandomForestRegressor

# 랜덤 포레스트 모델 생성
rf_model = RandomForestRegressor(n_estimators=100)
rf_model.fit(X_train, y_train)

5. 모델 평가

훈련된 모델의 성능을 평가하기 위해서는 RMSE(Root Mean Square Error)와 같은 지표를 사용할 수 있습니다.

from sklearn.metrics import mean_squared_error
import numpy as np

# 예측
dt_predictions = dt_model.predict(X_test)
rf_predictions = rf_model.predict(X_test)

# RMSE 계산
dt_rmse = np.sqrt(mean_squared_error(y_test, dt_predictions))
rf_rmse = np.sqrt(mean_squared_error(y_test, rf_predictions))

print(f"결정 트리 RMSE: {dt_rmse}")
print(f"랜덤 포레스트 RMSE: {rf_rmse}")

6. 에러 처리

모델을 학습하거나 예측할 때 에러가 발생할 수 있습니다. 예를 들어, 데이터에 결측치가 남아있다면 다음과 같은 에러가 발생할 수 있습니다:

ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

이런 경우, 데이터를 확인하고 적절히 전처리해야 합니다.

7. 결과 시각화

모델의 성능을 이해하기 위해 결과를 시각화하는 것이 좋습니다. Matplotlib이나 Seaborn 라이브러리를 사용해 예측 결과를 시각화할 수 있습니다.

import matplotlib.pyplot as plt

plt.figure(figsize=(14, 7))
plt.plot(data.index[-len(y_test):], y_test, label='실제 가격', color='blue')
plt.plot(data.index[-len(y_test):], rf_predictions, label='랜덤 포레스트 예측', color='orange')
plt.legend()
plt.title('주식 가격 예측')
plt.show()

이 코드는 실제 주식 가격과 랜덤 포레스트로 예측한 가격을 비교하여 시각적으로 확인할 수 있게 해줍니다.

8. 참고 문서

이제 주식 가격 예측 모델을 개발하기 위한 기초 지식과 실습을 마쳤습니다. 이 과정을 통해 결정 트리와 랜덤 포레스트를 사용하여 실제 데이터를 다루고 예측 모델을 구축하는 방법을 익힐 수 있습니다.

728x90
반응형