AI/ML DL

[주가예측] 1. LSTM,CNN 학습부터 앙상블까지

SeokjunMan 2024. 1. 23. 22:43

 

지난 포스팅

주가예측 딥러닝 프로젝트 소개

 

https://jayindustry.tistory.com/96

 

[NLP,CNN] LSTM + CNN 주가예측모델

LSTM과 CNN을 통해 주가를 예측해보고 최종적으로 비트코인 단타매매에 실전 적용할 수 있는 모델을 개발해보겠다. [ 개념 ] LSTM은 RNN(Recurrent neural network)에서 나온 모델로 장기의존성(장기기억)에

jayindustry.tistory.com

 

 

첫 번째 스탭으로 LSTM,CNN을 각각 학습시키고 앙상블까지 진행해보았다.

 

 

- 프레임워크 : tensorflow, keras 

- 손실함수 : MSE

- 사용모델 : LSTM, CNN , CatboostRegression

- 사용기법 : Ensemble : Stacking, 가중치, 단순평균, Optuna, K-fold

 

 

 [코드 & 결과]

https://github.com/seokjunHwang/DeepLearning/tree/main/%EC%A3%BC%EA%B0%80%EC%98%88%EC%B8%A1(LSTM%2CCNN...)/Try_history

 

 

 

 

 

[ 진행 내용 ]

 

예측률을 높이기위해 여러 다양한 방법들을 시도해보았다.

 

1. LSTM, CNN 각각 학습

2. CNN 하이퍼파라미터 튜닝(옵튜나사용)

3. CNN2 : 다다음날 종가 예측

4. LSTM, CNN Ensemble : 가중치조정, 단순평균

5. LSTM, CNN Stacking Ensemble : Catboost메타모델 + 하이퍼파라미터 튜닝

 

 

 

 

 

 

[ 결과 ]

 

1. LSTM, CNN 각각 학습

 

결과는 성능자체는 비슷하였으나, CNN이 학습속도가 훨씬 빠르고(맥북에서 GPU사용가능), 손실함수도 약간 더 낮게 나왔다.

 

 

 

 

 

 

 

2. CNN 하이퍼파라미터 튜닝(옵튜나사용)

 

CNN을 카테고리컬 옵튜나를 사용하여 최상의 하이퍼파라미터 조합을 찾아 저장하였다.

 

결과는 그냥 CNN모델과 비교했을때,

학습,테스트셋에 대해서는 이전 CNN이 손실함수가 약간 더 낮았고,

다른 주가데이터들을 인풋했을때는 하이퍼파라미터 튜닝한 CNN이 손실함수가 더 낮았다.

 

 

 

 

 

 

3. CNN2 : 다다음날 종가 예측

 

예측결과가 사진과 같이 2~5일정도? 밀려나오는 것 같아서

다음날종가가 아닌 다다음날 종가를 예측해보도록 하였으나, 결과는 기존의 CNN보다(다음날 종가예측) 살짝 더 안좋았다.

 

예측 : 빨강

실제주가 : 초록

 

 

 

 

 

 

4. LSTM, CNN Ensemble : 가중치조정, 단순평균

 

  • 0.5 : 0.5로하면 그냥 단순평균앙상블과 같아진다.
  • 결과 : test셋에서는 cnn쪽으로 가중치를 올렸을때 가장성능이 좋앗지만, 최신주가데이터에 반영할떈 LSTM으로 가중치를높일수록 가장좋았다.

 

 

 

 

5. LSTM, CNN Stacking Ensemble : Catboost메타모델 + 하이퍼파라미터 튜닝

 

기대

  • lstm,cnn을 boost알고리즘과 앙상블하려면, 1. 부스팅알고리즘만 사용하던가, 2. 스태킹앙상블하던가
  • 평가차트를보면 실제주가데이터보다 며칠 밀려서(빨강선이 초록보다 약간 옆으로 밀려있음) 예측을하는데,
    그럼 스태킹앙상블해서 캣부스트로 넣으면 이러한 패턴을 읽고 어느정도 보완해서 정확히 예측할 수 있지 않을까?
  • 예를들면, 실제주가데이터가 4,3,2,3,5,7순서라면, lstm,cnn은 4,4,3,2,2,3,5,8이런식으로 한발짝 늦게가니까, 이러한 패턴을 스태킹앙상블 캣부스트가 잡아주지않을까?

결과

  • 아래처럼 기대했으나 결과는 더 안좋았다. catboost가 특정구간의 데이터셋이 부족했는지 or 특성이 부족했는지(LSTM,CNN 2개) 아래 사진처럼 특정 구간에서는 비슷한 수치의 예측물들만 출력했다.

 

 

 

 

 

 

 

 

앞으로 방향성

  • 먼저 lstm과 cnn의 최종예측 결과물에서 3일~4일 정도를 앞당겨보려고한다. 그리고 다른 테스트용 주가셋에 적용시켰을 때의 결과를 보고, 그래도 좋지 않다면 분류모델로 넘어간다.
  • 종가의 실제 수치를 예측하는 것은 어려움이 많다. 실제로 많은 기업에서도 아직 연구단계라고 한다.
    따라서, 실제 수치예측은 이쯤으로하고 주가의 상승 / 하락의 분류하는 방법으로 넘어간다.
    예를들어, 1000개의 종목을 돌렸을 때, 각 종목의 다음날 업 / 다운을 높은확률로 알려준다면 그것만으로 유용한 모델이 될 수 있을것이다.
  • 다양한 분류모델을 학습시키고 voting방법으로 앙상블한다.