본문 바로가기

주식 데이터 모델링

LightGBM으로 주식 모델링 해보기 [머신러닝] - Regression

 머신러닝 기법에는 회귀분석, 의사결정나무 등 많은 기법이 있습니다. 데이터의 종류, 데이터의 갯수, task 종류 등을 고려해서 머신러닝 기법을 선택해야 합니다. 그 상황에 가장 적합한 머신러닝 기법을 선택하는 것이 실력 이겠죠. 

 그래도 일반적으로 사용되는 기법들이 있습니다. 회귀문제에서는 회귀분석을 가장 먼저 사용해보고, 분류 문제에서는 트리모형, Xgboost 등을 먼저 사용해봅니다. 사용하는 방법도 쉽고 좋은 성능을 보여주기 때문입니다. 

 

 오늘 주식 모델링에서 사용할 머신러닝 알고리즘은 LightGBM 입니다.  

 

 LightGBM은 2년 전에 마이크로소프트에서 논문으로 내놓은 알고리즘 입니다. 그 이전까지 분류 알고리즘의 최강자 였던 XGBoost와 비교해서 예측 성능은 비슷하거나 더 좋고, 속도도 빠르다고 알려진 알고리즘 입니다. 

 

 LightGBM의 장점은

 - 뛰어난 예측 성능

 - 그러면서도 빠른 속도 (Training, Prediction 둘다)

 - 뛰어난 과적합 방지 성능

 - 회귀, 분류 문제 적용 가능

 이라고 정리할 수 있겠네요.

 

 LightGBM을 사용한 이유는 위의 장점들 때문입니다. LightGBM은 분류 문제에 적용하는 경우가 많긴 하지만, 회귀 문제에도 적용이 가능합니다. 그래서 주식 모델링도 회귀와 분류 문제 각각으로 해결해보겠습니다. 회귀 문제는 주식의 종가를 예측 하는 문제로, 분류 문제는 주식의 종가를 이진 분류(상승 or 하락) 하여 해결해보겠습니다. 

 


 머신러닝으로 문제를 해결할 때 다음과 같은 과정(work flow)을 진행하게 됩니다.

 

 Task와 Data 파악(탐색적 데이터 분석, 시각화 등) -> 모델 선정 -> 데이터 전처리(Preprocessing) -> 평가

 

 물론 꼭 위의 순서대로 진행되지는 않고, 데이터가 필요하다면 처음부터 또는 추가로 수집을 합니다. 모델 선정, 탐색적 데이터 분석(EDA), 데이터 전처리를 해보면서 필요한 EDA를 추가로 진행한다던가, 모델을 바꾼다던가, 전처리 방법을 바꾸기도 합니다. 

 토이 모형을 만들때는 위와 같은 과정을 한번에 진행할 수 있겠죠. 주식데이터를 통해서 위의 과정을 간단하게 진행해보겠습니다.

 


 우리의 Task는 정해져있습니다. 주식의 종가를 예측하기로 했죠. T 시점의 데이터를 이용해서 T+1시점의 주식 종가를 예측 할 것입니다. 회귀문제에서는 종가를 직접적으로 예측 할 것이고, 분류 문제에서는 T 시점에 비해서 T+1 시점의 종가가 상승했는가? 하락했는가?의 이진 분류 문제로 해결해보겠습니다.

 데이터는 주식 한 종목의 데이터만 사용할 것 입니다. SK하이닉스[000660] 이고, 2010년 부터 2018년 까지의 데이터를 가지고 있습니다. 

 

 먼저 SK하이닉스의 종가를 그래프로 확인해보겠습니다.

 

보시면 1550번 row에서 부터 상승세가 시작되어서 1739번 row정도에서 그 이전 시점의 종가보다 높아지는 것을 볼 수 있습니다. 이 1739번 row를 찝은 이유는 데이터의 범위 때문 입니다. 

 보통 머신러닝에서 모델을 훈련 시킬때 과적합(Overfitting)을 막기 위해서 Data를 Train / Validation / Test Set으로 나눕니다. 이 때 Train set에 있는 데이터의 범위보다 Test set의 데이터 범위가 크다면 어떨까요? 머신러닝은 과거의 데이터의 패턴, 분포 등을 학습한다고 볼 수도 있습니다. 그래서 일반적으로 Training set에 있는 데이터 범위를 벗어나게 되면 모델의 성능이 떨어지게 됩니다. 

 그래서 이번 모델링은 Toy model 이기 때문에 데이터를 저 근처에서 잘라주도록 하겠습니다.

 

그래서 총 1740 개 데이터를 1300 / 200 / 240로 각각 Train / validation / Test set을 만들도록 하겠습니다. 얼추 Train, Val, Test Set의 데이터 범위가 비슷하게 됩니다.

 

 파라메터 튜닝은 따로 진행하지 않고, learning_rate(0.001)와 metric('l2 loss')만 설정해주었습니다. 모델 알고리즘 반복 횟수는 validation set의 loss가 더이상 떨어지지 않을때 멈추는 early stopping을 사용했습니다.

 

 데이터 전처리는 필요할까요? 보통 스케일링을 진행을 해준다던가, 시계열 데이터에서 진행하는 여러가지 전처리가 있습니다. 그러나 toy modeling 이기 때문에 생략하도록 하겠습니다. 

 예측 결과는 그림으로 보여드리겠습니다.

 멀리서 보면 굉장히 잘 예측한 것 같아 보이네요. 물론 T시점의 feature들을 이용해서 T+1 시점의 데이터를 예측한 결과 입니다. 그래서 큰 차이가 벌어지지는 않긴 합니다 보통.

 역시 멀리서 보면 희극이고 가까이서 보면 비극입니다. 45거래일 정도, 즉 두달 정도의 거리에서 실제값과 예측값을 비교해봤습니다. 크게 차이나는 경우는 천원 정도까지 차이가 나고, 잘 예측했을때는 100원 정도의 차이 밖에 나지 않습니다. 실제 거래에서 활용할 만 할까요? 라는 말에 쉽게 대답하기는 힘들겠습니다. 

 

 더 잘 예측하기 위해서는 무엇을 해야할까요? 여러가지 방법이 있겠지만 그 중에서 변수를 추가하는 방식으로 추가 모델링을 한번 해봤습니다. 블로그에 포스팅한 불린저 밴드, MACD, DMI 등을 변수에 추가한 뒤에 lightgbm 훈련을 진행했습니다.

 

 변수를 추가하지 않았을때와 같은 곳에서 비교해보았습니다. 더 잘예측한 곳도 있고 잘 예측하지 않은 곳도 있습니다.

 

 사실 모델의 성능을 제대로 비교하기 위해서는 그림을 그려보는 것도 좋지만, 보통 성능 지표로 평가합니다. 회귀에서 가장 잘 쓰이는 평가 지표 중 하나인 MSE로 평가를 해보았습니다만, 변수를 추가하지 않았을때의 loss가 더 낮았습니다. 변수를 추가했다고 성능이 좋아지지는 않았습니다. 

 

 물론 Toy modeling이기 때문에 고려해야하는 상당히 많은 부분을 생략했습니다. 그래서 위의 성능 얘기는 '대애애충 했을때 이렇게 나오는구나~' 라고 해석하시면 되겠습니다. 다음 글에서는 주식 모델링을 분류 문제로 해결해보겠습니다. 그리고 일반적인 머신러닝 기법을 주식 모델링에 적용했을때의 단점도 얘기해보겠습니다.