딥러닝 입문자들이 LSTM 배우면 꼭 도전해보는 분야가 바로 주식가격 예측입니다.
LSTM은 연속된 sequence 데이터를 다룰 때 좋은 레이어라고 하지 않았습니까.
그래서 주식가격 흐름도 일종의 sequence 데이터 같으니 거기다가 집어넣어보는 겁니다.
1일~20일의 주식가격 20개를 모아서 하나의 시퀀스로 만들어서 X데이터로 만들고
21일 주식가격을 Y데이터로 만들면 딥러닝으로 학습이 가능합니다.
(작곡 AI 만들 때랑 데이터셋 만드는 방법이 비슷합니다)
그래서인지 구글에 검색해보시면 주식가격 예측하는 딥러닝 AI 만드는 칼럼들이 수백개 나옵니다.
논문도 매우 많습니다.
아마존에서 architect로 일하는 사람이 쓴 칼럼을 구경해봅시다.
https://towardsdatascience.com/aifortrading-2edd6fac689d
▲ 이 사람이 만든 주식가격 예측모델입니다.
얼핏보면 최신 딥러닝 기법들을 막 적용하고 그에 따라서 결과도 뛰어날 것 같지만
(솔직히 좀 많이 쓸데없고 과다한 것 같지만)
그냥 스크롤 쭉 내려서 예측 결과 그래프를 구경해보면
▲ 주황색이 예측가격, 파란색이 실제입니다.
"와우 정확도 지리네 부자될듯"
이라고 생각할 수 있겠으나 그러면 딥러닝 배운 사람들은 전부 부자가 되었어야합니다.
저렇게 정확한 그래프를 보면 의심부터 하셔야합니다.
그래프를 확대해보면 딥러닝 초보가 하는 전형적인 실수를 발견할 수 있습니다.
일단 학습하지 않은 새로운 test 데이터셋으로 검증안하고 올리는 것도 첫째 실수지만 더 중요한 설계상 실수가 있습니다.
흔한 실수
저런 뭔가 이상할 정도로 예측가격이 비슷한 그래프들은
살짝 확대해보면 진실을 알 수 있습니다.
▲ 다른 사람이 비슷하게 주식가격을 예측한 그래프를 가져왔는데
빨간색은 실제 가격, 파란색은 예측가격입니다.
파란색이 빨간색을 1일만큼 옆으로 이동한거랑 똑같죠?
그니까 컴퓨터에게 "28일의 주식가격 어떻게 될거같냐고" 물어보시면 "27일의 주식가격이랑 같습니다" 라고 답변한다는겁니다.
왜 이런 현상이 나온걸까요.
당연히 딥러닝돌릴 때 loss값을 최소화 하라고 시키죠?
loss값은 (예측값 - 실제값) 어쩌구를 사용하고요.
loss가 가장 적은 예측모델은
"내일 주식가격은 오늘 주식가격과 똑같을 것이다"
입니다. 컴퓨터가 딥러닝학습을 통해 이렇게 결론짓는 것입니다.
뭔가 잘못되거나 그런건 전혀 없습니다. 컴퓨터는 가장 loss가 적게나오는 효율적인 예측모델을 만들었을 뿐입니다.
근데 이런 모델은 실제 쓸모가 없을 뿐이고요.
아니면 단순히 과도한 학습으로 오버피팅된 결과일 수도 있겠군요.
▲ 그래서 위에 소개해드렸던 링크에서 진행한 딥러닝 과정은
여러가지 간지나는 분석기법을 사용했지만 결국은 실용성이 0인 모델을 만들었을 뿐입니다.
이상한 문제풀이 강의나 들으면서 딥러닝 테크닉만 주구장창 외우고 원리이해를 등한시하면 가끔 그렇습니다.
몇가지 해결책
1. 주식가격을 sequence 데이터로 간주하고 모델에 집어넣는게 맞는지 고민해봅시다.
Q. 문장의 다음 단어를 예측하는 모델은 어떻게 만들죠?
▲ 당연히 앞의 단어들을 쭉 sequence데이터로 만들어서 LSTM에 집어넣으면 됩니다.
LSTM은 '자료간의 순서와 연관성이 있을것이다' 라는 가정을 하고 사용하는 뉴럴네트워크 레이어니까요.
그러니 영어문장같은 경우 앞의 단어들을 분석하면 뒤에올 단어도 쉽게 추론할 수 있을 것입니다.
▲ 그럼 주식 가격은 어떨까요.
그니까 1~10일 주식가격이랑 11일 주식가격이랑 연관성이 있습니까?
아주 조금은 있을 것 같지만
제 생각엔 가격말고 다른 외부 요소들이 더 영향을 끼칠 것 같습니다.
그래서 주식가격만으로 다음날 가격을 예측하는 것은 한계가 명확하다는 겁니다.
그래서 시퀀스로 간주하고 분석하는게 도움이 될지 다시한번 판단해봅시다.
또한
- 주식가격은 랜덤성이 짙어서 예측할 수 없는 random walk 이다.
- 이미 모든 주식관련 정보가 주식가격에 선반영이 되어있다.
라는 가설도 한번 고려해보시면 되겠습니다. 머신러닝 불신자들이 이런 말을 자주합니다.
2. 가격이 아니라 다른 결과를 예측하는 모델은 어떨까요.
무슨 투자모델 강의같은거 하면 "그래서 수익률 얼마임?" 이런 질문이 가득합니다.
금융 분야에선 모델의 성능을 수익이 얼마나 나왔는지로 증명해야 합니다.
컴퓨터에게 가격이 아니라 Return이나 buy/sell 할지 여부를 예측하라고 시키면 어떻게될까요.
예를 들면 20일간의 가격추이를 집어넣고 다음날의 가격이 아니라 다음날 주식을 buy하는게 맞는지 sell하는게 맞는지 이것만 예측해보는겁니다.
그렇다면 컴퓨터가 위의 잘못된 예처럼 일종의 '컨닝' 또는 overfitting 하는걸 막을 수는 있겠군요.
이 경우 X 데이터는 20일간의 주식가격 sequence,
Y 데이터는 (21일 주식가격 - 20일 주식가격)해서 이게 +인지 -인지 구분해서 1과 0으로 라벨링하면 될 것 같습니다.
3. 가격말고 다른 것도 집어넣는건 어떨까요.
실제로 주식가격을 결정하는 요소는 전날 가격보다는 외부정보들이 더 중요하다고 생각합니다.
- 전날 거래량
- SNS 언급량
- 전날 나스닥지수 증감량
- 관련 업종 주가추이
등 여러가지 요소가 있을 수 있습니다.
이런 외부 데이터들도 함께 집어넣어보십시오.
아니면 그냥 주식가격은 아예 배제하고 저런 것만 집어넣어보십시오.
저렇게 많고 다양한 인풋데이터를 어떻게 집어넣냐고요?
복잡한 레이어를 구성하고 싶으면 앞선 강의에서 설명드린 Functional API를 쓰거나
집어넣을 csv 데이터가 너무 종류가 다양하면 앞으로 배울 feature column을 이용하시면
인풋이 몇개든 몇종류든 쉽게 집어넣을 수 있습니다.
4. stationary 된 데이터를 사용하자
주식가격 데이터는 흔히말하는 시계열 (time-series) 데이터입니다.
(시계열 데이터는 그냥 시간에 따라 기록된 데이터를 의미합니다)
시계열 데이터를 통계적으로 분석하거나 예측모델을 만들고 싶을 땐 이 데이터가 stationary 데이터인지 확인해야합니다.
그게 아니면 너무 무작위의 값들이라 예측모델을 애초에 만들 수가 없다고 통계학에선 판단하기도 합니다.
stationary 데이터가 뭐냐면
평균, 분산, 공분산이 비교적 일정한 데이터를 말합니다.
분명 고등학교 때 통계를 배웠을 테지만
강의들을 중학교 레벨로 설명중이니 어려운 고딩통계용어보다는 그림으로 보도록 합시다.
초록색이 stationary, 빨간색이 non-stationary 입니다.
대부분의 주식가격 그래프도 non-stationary 특징을 가집니다.
▲ 이런 non-stationary 그래프들은 예측 모델을 만들기가 힘듭니다. (그리고 테슬라 주식 화성갈듯)
그래서 우리 주식가격을 대충 stationary로 변환해서 패턴을 조금 더 찾기 쉽게 만들 수 있는데
예를 들면 이렇습니다.
주식가격 데이터를 이렇게 변환하는겁니다.
일별 주식가격이 아니라 일별 주식가격 변화량으로 바꾸는겁니다.
만드는 법은 그냥 (오늘가격 - 전날 가격) 이거 하면 됩니다.
아니면 데이터 수집을 할 때 "3% 상승" 이런 변동폭을 직접 수집하셔도 되고요. 야후에선 그런것도 제공하던거 같은데
그러면 아까 봤던 그래프처럼 약간 stationary 느낌이나죠?
그럼 딥러닝 머신러닝을 이용해 주가의 패턴을 찾는데 약간 더 도움을 줄 수 있습니다.
실은 주식가격보다는 시즌 별로 가격 추이가 변화하는 농산물가격 이런거 예측할 때 더 쓸모가 있긴합니다.
내가 사용하는 시계열 데이터가 stationary인지 아닌지 검증하는 법도 있긴 있는데
Dickey-Fuller 검증이라는 간단한 것도 있습니다. 통계 변태라면 한번 살펴보시면 되겠습니다.
(평균값만 검증하기 때문에 참고만 합시다.)
Q. Transformer 모델 쓰면 되는거 아님?
그거 써도 다음 단어 예측을 할 수 있는데
그걸 아주 잘 쓰는 모델이 현재 나와있는 GPT, Llama 같은 LLM들입니다.
하지만 그걸로 주식가격 예측해서 부자가 되었다는 사람은 아직 없는 것 같군요.