본문 바로가기

주식 데이터 모델링

LightGBM으로 주식 모델링 해보기 [머신러닝] - Classification, 머신러닝으로 모델링이 가능한가?

 이번에는 전 글에 이어서 주식 모델링을 분류 방식으로 해결해보도록 하겠습니다.

 분류 문제는 두가지 방식으로 진행하겠습니다. 

1) 전날에 비해 금일 종가가 상승 or 하락

2) 전날에 비해 금일 종가가 3% 이상 상승 or 그 외

 

 1번은 바로 이해가 되실겁니다. 2번 같은 문제를 만든 이유는, 좀더 특별한 신호를 찾아볼 수 있을까? 라는 의미에서 만들었습니다.

1741번 row 까지의 종가

 

 1번 문제의 경우에는 전체 데이터 셋에서 거의 반반으로 볼 수 있습니다. 2번째 문제의 경우에는 1700개의 row 중 184개, 즉 약 10%의 row만 해당하는 군요. 이정도면 시도는 해볼 수 있겠습니다. 위 정보를 바탕으로 label을 만들어준뒤에 모델링을 하도록 합니다.

.
label_tf = np.where(data[1:1741]["Adj"]>0, 1, 0)
label_3 = np.where(data[1:1741]["Adj"]>.03, 1, 0)

 이번에도 데이터 전처리, 그 중에서도 데이터 정규화(normalization)은 진행하지 않습니다.

 머신러닝에서 데이터 정규화는 보통 feature들 간의 range 또는 scale이 다를때 진행합니다. 위 주식 데이터 같은 경우에는 6개의 feature가 존재합니다. 각각 ['시가', '고가', '저가', '종가', '거래량', '등락률'] 입니다. 이 중에서 앞에 4개의 feature에 비해서 거래량은 보통 단위가 매우 크고, 등락률은 굉장히 작습니다. 이런 feature들의 range를 고려한다면 normalization은 진행하는게 맞습니다. 특히 회귀분석 등은 이 정규화 과정의 유무에 따라서 모델의 성능이 크게 좌우됩니다.

 하지만 lightgbm은 tree 모형이라고 불립니다. 간단히 말하자면 데이터 또는 feature를 'split' 하면서 모델을 훈련하게 됩니다. 이러한 split 과정을 통해서 데이터를 학습하게 된다면, feature의 range를 고려할 필요가 없게 됩니다. 0~100이었던 feature를 0~1 사이로 정규화 한다고 해도, split을 하게 되면 같은 feature들 끼리 분류가 되기 때문입니다.

 그래서 의사결정나무, xgboost, lightgbm 등 tree 모형으로 학습하는 모델들의 경우 데이터 정규화를 굳이 할 필요가 없다고 말하게 됩니다. [물론 데이터의 갯수가 어마어마하게 많아서, 데이터의 크기가 중요해질 수도 있겠네요.]

 


  분류 문제를 풀때도, 하이퍼 파라메터 튜닝은 따로 진행하지 않았습니다. metric과 learning rate 정도만 조절해서 훈련을 진행했습니다. 그 결과는 어땠을까요? [test sample은 240개 입니다]

 금일 종가의 상승 or 하락을 예상한 모델 입니다.

1) 정확도(Accuracy)

2) Confusion Matrix

 그 다음은 3% 이상의 상승 or 그 외 입니다.

1) 정확도(Accuracy)

 무려 90%이군요?

2) Confusion Matrix

 그런데 confusion matrix의 모양이 조금 이상합니다.

 위의 행렬은, 모델이 내일의 종가가 3% 이상 올라갈 확률을 예측한 것 입니다. 보시다시피 거의 0.1~0.11 사이 인것을 볼 수 있습니다.

 

 간단한 toy model로 주식시장을 예측할 수 있는 것으로 보이나요? 3% 이상의 상승을 하냐 못하냐를 맞추는 문제는 무려 정확도가 88%입니다.  

 정답은 당연히 아닙니다. 위의 결과들을 쭉 보여준 이유가 있습니다. 주식시장은 간단한 toy model로 예측 할 수 있는 시장이 아닙니다. 그 이유는 여러가지가 있습니다만, 크게 두가지를 얘기해보겠습니다. 

 

 첫째로 주식시장 자체가 예측을 할 수 있느냐? 입니다.

 

 랜덤워크 이론을 들어보신 분들이 있을 겁니다. 주식시장의 움직임은 말그대로 '랜덤' 이다. 라는 말입니다. 주식시장은 효율적 시장이라 과거, 현재, 미래의 모든 정보가 주가에 이미 반영이 되어있고, 그에 따라서 분석을 통해 추가적인 이익을 얻는게 불가능 하다는 말입니다. 물론 분석을 하는 사람들은 대부분 주식시장이 완전한 효율 시장이 아니다 라고 가정을 하고 분석을 진행합니다. 

 

 두번째로 주식의 움직임을 예측하기에 적합한 모델인가? 입니다.

 

 주식시장은 예측이 가능하다는 가정하에, 주식의 움직임을 예측하려고 하는 방법이 많이 있습니다. 그 중에서 이 글에는 머신러닝, 특히 lightgbm 으로 주식의 움직임을 예측하고자 했습니다. 머신러닝 알고리즘을 통해서 무언가를 예측할 때 가장 먼저 고려해야 하는 부분이 있습니다.

 모델의 capacity 입니다. 

 모델의 용량이라고 번역을 할 수도 있습니다. 예측을 하는 대상이 가지는 복잡도를 모델이 충분히 학습할 수 있는가? 입니다. 선형성을 가지고 있는 수치를 예측할 경우 회귀모델을 주로 쓰는데, 회귀모델은 이러한 수치의 복잡도를 충분히 학습한다고 볼 수 있습니다. 이러한 복잡도를 수치화 하기는 어렵지만, 주식시장이 굉장히 복잡도가 높을 것이라고 예상을 할 수 있습니다. 

 복잡한 주식시장을 예측하기 위해, 모델의 capacity를 높이거나, 주식시장 자체의 복잡도를 줄이는 시도를 할 수 있습니다. 주식시장의 복잡도를 낮추는 방법은 전처리를 통해 noise를 제거하는 방법이 있을 수 있겠습니다. 모델의 capacity를 높이는 방법으로는, 더 복잡한 모델을 사용하는 것입니다. Lightgbm은 복잡도가 사실 상당히 높은 모델이라고 할 수 있습니다. 

 하지만 머신러닝에서 capacity가 가장 높은 기법 중 하나인 lightgbm, xgboost 등으로는 주식시장을 예측하기 어렵다고 많이 알려져 있습니다. 이미 많은 사람들이 시도를 해봤지만 대부분 큰 성공을 거두지는 못한 것으로 알고 있습니다. 물론 잘 작동을 하면 public 하게 공개할 이유도 없긴 합니다만...

 

 Hyperparameter tuning을 하고, 다른 모델들과 추가로 ensemble을 하는 등의 노력을 해도 예측을 할 수 없을 것 같아서 toy modeling만 진행을 해보았습니다. [물론 의미가 있을 수 있고, 예측을 할 수도 있습니다.]

 그래서 다음 기회에는 원래 진행하던 대로 '딥러닝'을 통해서 주식을 예측해보고자 합니다. 모델의 capacity 측면에서 딥러닝을 따라올만한 머신러닝 알고리즘이 없습니다. 말그대로 deeeeeeeep 하게 layer를 쌓고, 모델의 구조를 변경해볼 수 있기 때문입니다. 그에 따라서 데이터의 양, 전처리 등 추가로 필요한 부분들도 고려를 해보도록 하겠습니다.