[Randomforest] 10분 수익률을 이용한 주가 예측-1
이번 포스팅에서는 간단하게 10분 단위 수익률로 갭상승/하락을 하는 랜덤포레스트 모델을 생성해 보겠습니다.
랜덤포레스트는 분류나 회귀에 쓰이는 앙상블(esemble) 모델로 다수의 의사결정나무(decision tree)를 이용한 예측모델입니다.
금융에서 주가를 예측하는 것은 수익과 직결되므로 학계나 실무 막론하고 많이 연구가 되어왔는데요, 최근에는 머신러닝, 딥러닝이 대두되면서 더욱 연구가 활발히 진행되는 것 같습니다.
이번 실험에 쓰인 데이터는 아래와 같습니다.
import pandas as pd
stock_df= pd.read_csv('10mindata.csv')
stock_df=stock_df.dropna()
stock_df.info()
첨부된 데이터를 pandas를 통해 업로드하면 아래와 같은 데이터가 나오는데요, 일별로 10분 단위 수익률과 마지막에는 당일 종가부터 다음날 시가까지의 수익률을 뜻하는 갭(gap)이 라벨링 되어있습니다.
데이터예측은 회귀(Regression)와 분류(Classification)로 나눌 수 있는데, 이 경우는 단기주가를 이진분류(binary classification)하는 것이기 때문에 갭 상승은 0 갭 하락은 1로 라벨링 하였습니다. 보통 단기데이터는 classification 장기의 시계열은 regression 한다고 합니다.
우선 학습을 위해서는 x값과 y값을 구분해주어야 합니다. y는 예측값이고 x는 y를 예측하기 위한 변수라고 생각하면 됩니다.
여기서는 9시 10분부터 15시 30분까지 각각의 10분 수익률이 x변수가 되고요, y는 다음 날의 갭이 됩니다.
x와 y를 구분하기 전에 정말로 중요한 내용이 있습니다. 예측변수인 y의 class별 데이터 개수를 맞춰줘야 한다는 점입니다!
예를 들어 y에 갭상승 70% 갭하락은 30%인 데이터로 모델을 학습한다고 칩시다. 모델은 모호한 인풋데이터에 대해 상승을 예측할 것입니다. 학습된 데이터 자체가 70%가 상승이니 확률이 높은 방향으로 찍는 것이죠.
이를 방지하기 위해 데이터수가 작은 쪽으로 랜덤샘플링하여 5:5로 데이터셋을 맞춰줄 겁니다.
관련 코드는 아래와 같습니다.
sample_df=pd.DataFrame()
#갭 개수가 작은것에 맞춰 랜덤샘플링
for i in range(0,2):
temp_df = stock_df[(stock_df['gap']==i)].sample(n=stock_df.groupby(['gap']).size().min())
sample_df = pd.concat([sample_df,temp_df])
sample_df = sample_df.reset_index(drop=True)
시계열 예측이 아니라 횡단면(crosssectional) 예측이기 때문에, 일자도 필요가 없습니다. drop함수를 통해 삭제해 줍니다.
stock_df=sample_df.drop(['logdate'],axis=1)
stock_df
이제 학습을 위해서 x값과 y값을 나눠주겠습니다. iloc와 슬라이싱(slicing)을 이용할 겁니다. iloc에서 왼쪽 변수는 rows를 나타내는데요, :는 모든 데이터를 가져오겠다는 뜻입니다.
그리고 오른쪽 변수는 슬라이싱 한 칼럼만 가져오겠다는 뜻인데, 0:-1은 910 열부터 1530열, -1은 gap 열이 됩니다.
x = stock_df.iloc[:, 0:-1].values
y = stock_df.iloc[:,-1].values
학습을 하기 위한 로데이터 작업을 마무리했는데요,
다음 포스팅에서는 학습데이터와 검증데이터로 데이터를 구분한 뒤 랜덤포레스트 모델로 갭을 예측해 보도록 하겠습니다.
감사합니다.