본문 바로가기

Study Information Technology

주식 가격 변동 예측 모델 개발하기

728x90
반응형

주식 가격 변동 예측 모델 개발하기

Overview

주식 시장은 다양한 요인에 의해 급격히 변동할 수 있으며, 이러한 변동은 투자자들에게 큰 영향을 미칩니다. 본 글에서는 갑작스러운 시장 이벤트나 발표를 기반으로 주식 가격의 점프(상승) 또는 드롭(하락)을 예측하는 모델을 개발하는 방법에 대해 자세히 설명하겠습니다. 이를 위해 데이터 수집, 전처리, 모델링, 그리고 평가 단계로 나누어 살펴보겠습니다.

1. 데이터 수집

주식 가격 변동을 예측하기 위해 가장 먼저 필요한 것은 관련 데이터입니다. 여기에는 주식 가격 데이터, 거래량, 그리고 외부 이벤트(예: 기업 발표, 경제 지표 발표 등)가 포함됩니다.

주식 가격 데이터 수집

주식 가격 데이터는 여러 소스에서 수집할 수 있습니다. 예를 들어, Yahoo Finance API를 사용하면 특정 주식의 가격 데이터를 쉽게 가져올 수 있습니다. 다음은 Python을 이용해 데이터를 가져오는 간단한 코드입니다.

import yfinance as yf

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

위 코드에서는 애플(AAPL) 주식의 2020년부터 2023년까지의 가격 데이터를 다운로드합니다.

외부 이벤트 데이터 수집

기업 발표나 경제 지표 발표와 같은 외부 이벤트 데이터는 금융 뉴스 웹사이트나 경제 데이터 제공 사이트에서 수집할 수 있습니다. 예를 들어, Google News API를 활용하여 특정 키워드(예: "Apple earnings report")에 대한 뉴스를 수집할 수 있습니다.

2. 데이터 전처리

수집한 데이터는 예측 모델에 사용하기 전에 전처리가 필요합니다. 주식 가격 데이터와 외부 이벤트 데이터를 결합하여 하나의 데이터셋으로 만드는 과정이 필요합니다.

결합 예시

아래는 Pandas를 사용하여 가격 데이터와 이벤트 데이터를 결합하는 간단한 예시입니다.

import pandas as pd

# 가격 데이터와 이벤트 데이터
price_data = pd.read_csv('price_data.csv')
event_data = pd.read_csv('event_data.csv')

# 날짜를 기준으로 두 데이터셋 병합
merged_data = pd.merge(price_data, event_data, on='Date', how='outer')

결측값 처리

결합 과정에서 결측값이 생길 수 있습니다. 이를 해결하기 위해서는 결측값을 제거하거나 대체할 수 있습니다.

# 결측값 제거
merged_data.dropna(inplace=True)

3. 특성 선택 및 생성

모델의 성능을 높이기 위해 적절한 특성을 선택하고 생성하는 것이 중요합니다. 주식 가격 예측에서는 다음과 같은 특성을 고려할 수 있습니다.

  • 이전 가격: 이전 일자의 주가
  • 이전 거래량: 이전 일자의 거래량
  • 이벤트 영향 변수: 특정 이벤트가 발생했는지 여부(이진 변수)

예를 들어, 다음과 같이 새로운 특성을 추가할 수 있습니다.

# 이벤트 발생 여부를 이진 변수로 추가
merged_data['Event'] = merged_data['Event'].apply(lambda x: 1 if x == 'Yes' else 0)

4. 모델 선택

주식 가격 변동 예측에 적합한 여러 모델이 있지만, 머신러닝 기법인 랜덤 포레스트(Random Forest)와 LSTM(Long Short-Term Memory) 네트워크를 추천합니다.

랜덤 포레스트 모델

랜덤 포레스트는 여러 개의 결정 트리를 조합하여 예측하는 앙상블 방법입니다. 간단한 예시는 다음과 같습니다.

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split

# 특성과 타겟 변수 설정
X = merged_data[['Previous_Price', 'Previous_Volume', 'Event']]
y = merged_data['Current_Price']

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 모델 학습
model = RandomForestRegressor(n_estimators=100)
model.fit(X_train, y_train)

# 예측
predictions = model.predict(X_test)

LSTM 모델

LSTM은 시계열 데이터에 적합한 순환 신경망(RNN)의 한 형태로, 주식 가격 예측에 특히 유용합니다. TensorFlow를 사용한 예시는 다음과 같습니다.

import numpy as np
import tensorflow as tf
from sklearn.preprocessing import MinMaxScaler

# 데이터 정규화
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(merged_data[['Current_Price']])

# LSTM 입력 형태로 변환
X, y = [], []
for i in range(60, len(scaled_data)):
X.append(scaled_data[i-60:i, 0])
y.append(scaled_data[i, 0])
X, y = np.array(X), np.array(y)

# LSTM 모델 구축
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.LSTM(units=50, return_sequences=True, input_shape=(X.shape[1], 1)))
model.add(tf.keras.layers.LSTM(units=50))
model.add(tf.keras.layers.Dense(units=1))

# 모델 컴파일
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(X, y, epochs=100, batch_size=32)

5. 모델 평가

모델의 성능을 평가하기 위해 RMSE(Root Mean Squared Error)와 같은 지표를 사용할 수 있습니다. 이는 예측 값과 실제 값 간의 차이를 측정하는 데 유용합니다.

from sklearn.metrics import mean_squared_error

# RMSE 계산
rmse = np.sqrt(mean_squared_error(y_test, predictions))
print(f"RMSE: {rmse}")

6. 에러 처리 및 개선

모델 개발 과정에서 발생할 수 있는 일반적인 에러와 그 해결책을 살펴보겠습니다.

데이터 관련 에러

  • KeyError: 데이터프레임에서 잘못된 열 이름을 참조할 때 발생합니다. 이 경우 열 이름을 확인하고 정확하게 입력해야 합니다.

  • ValueError: 입력 데이터의 크기가 맞지 않을 때 발생합니다. 이 경우 데이터의 형태를 확인하고 일관되게 맞춰야 합니다.

모델 관련 에러

  • TensorFlow 관련 에러: LSTM 모델에서 입력 데이터의 형태가 맞지 않으면 발생할 수 있습니다. 입력 데이터의 차원을 확인하여 (samples, timesteps, features) 형태로 변환해야 합니다.

참고문서

이와 같은 과정을 통해 주식 가격의 변동성을 예측하는 모델을 개발할 수 있습니다. 머신러닝 및 딥러닝 기술을 활용하여 데이터에서 패턴을 학습함으로써, 주식 시장의 예측 가능성을 높이는 데 기여할 수 있습니다.

728x90
반응형