토이 프로젝트 일지 5 : 주가 예측 신경망 만들기
1. 시작 계기
필자는 대학교 2학년 때쯤부터 프로그램을 이용한 자동화된 퀀트 투자에 관한 관심이 매우 많았었다. 인공지능을 공부하게 된 계기도 퀀트 투자에 인공지능 기술을 사용하면 더 잘 예측할 수 있지 않을까 하는 생각으로 시작했을 만큼 이쪽 종류에 있어서는 관심이 많았는데 이번에는 CNN과 RNN을 결합해서 예측할 경우 좋은 결과가 나오는지 확인해보려는 목적으로 시작하게 되었다.
참고로 이 프로젝트는 기술적인 구현에 초점이 맞춰져 있으며, 특성 데이터 부족 등의 이유로 실용성은 없음을 밝힌다.
2. 프로젝트 개요
가. 프로젝트 소개
1. 프로젝트 유형: 개인 토이 프로젝트
2. 구현 신경망 : 다음 일주일 주가 데이터의 변화율을 예측하는 신경망
3. 개발 환경 : Colab(WEB IDE)
4. 활용 기술
- 퀀트 투자 관련 지식
- 신경망 관련 라이브러리 : Pytorch, Pytorch Lightning
- 활용한 신경망 구조 : CRNN, ResNet, Self-Attention
5. 사용한 데이터 출처 : Kaggle - Huge Stock Market Datase
6. 개발 기간: 2023.3.4 ~ 2023.3.18
나. 프로젝트 목표
주가 데이터를 전처리하고 특성을 추출하는 방식을 학습하고, CRNN을 주가 데이터 예측에 활용할 수 있도록 변형시켜본다. 예측된 결과를 이용해서 실제 투자 시뮬레이션을 위한 코드를 작성해본다.
3. 프로젝트 구현
가. 주가 데이터 예측에 대한 주요 중점 사항들
가-1. 학습에 사용할 봉 차트 단위 시간 결정
봉 차트의 단위시간에는 틱봉, 분봉, 시봉, 일봉 등이 있는데, 어떤 단위시간을 사용해야 할까? 필자가 경험한 바에 의하면 단위시간의 길이마다 각각의 장단점이 확실히 있고, 절대적인 기준은 없었다.
A. 짧은 단위 시간을 결정했을 경우
* 장점
- 기술적 분석의 예측 결과가 맞을 확률이 더 높음
- 상승장, 하락장과 같은 시장 추세에 덜 민감함
- 예측 불가능한 사건으로 인한 급등, 급락에 신속하게 대처할 수 있음
가-2. 예측시킬 데이터 결정
주가 데이터 예측을 위해서 상승/하락과 같은 이진 분류가 일반적이나, 이러한 이진 분류만으로는 제대로 수익을 실현하기 어렵기 때문에 다양한 전략을 취할 수 있다. 각각에는 장단점이 있기 때문에 이를 고려해서 적절하게 사용해야 한다.
A. 상승 / 하락 이진 분류로 예측
가장 간단하고, 널리 사용되는 예측 방식이지만 0.001%만 오르거나 내려도 오름, 내림으로 예측하기 때문에 짧은 시간 단위를 이용하는 투자에서는 예측에 성공해도 손해를 보는 경우가 생길 수 있다.
B. X%를 기준으로 상승 / 보류 / 하락 분류로 예측
투자 예측 관련 논문에서 자주 쓰이는 방식이다. 특정 -X% ~ +X% 사이의 변동률은 보류로 예측해서 수수료로 인한 손해를 줄일 수 있다. 하지만, X%라는 것이 임의적이기 때문에 제대로 예측하기 어렵고, 라벨 불균형이 일어나기 쉽기 때문에 학습하기 까다로운 편이다.
C. 주가의 표준 편차를 기준으로 상승 / 보류 / 하락 분류로 예측
B 보다는 예측 성능이 개선되나, 라벨 불균형 문제와 표준 편차에서 어느 정도의 비율을 보류로 해야 할지에 대한 문제가 여전히 남아있다.
D. 삼중 베리어 기법으로 예측
삼중 베리어 기법이란 예측을 시작하는 시점에서 X% 만큼 위, 아래에 베리어를 만들고 그곳에 처음으로 닿았을 경우를 상승 / 하락으로 예측하는 기법을 말한다. 만약 K일 동안 위, 아래 베리어에 닿았지 않았을 경우 보류로 해석하거나 Y%를 기준으로 상승, 하락으로 판단한다. 실제로 구현해보니 B, C 보다도 예측하기 쉽지 않았다.
E. 선형 회귀의 계수로 예측
다음 K일 동안의 주가 데이터를 선형회귀로 학습시키고, 그것의 계수값을 사용하는 방식이다. 예측하는 값이 상당히 자연스러운 값이기 때문에 학습이 잘 되는 편이고, 실제로 예측했을 경우 수익으로 잘 이어지는 편이지만, 짧은 단위 시간에서는 추세를 타기 어렵기 때문에 이 방법으로는 수익을 실현하기 까다로웠다.
F. 회귀 문제로 예측
분류가 아닌 실제 오르거나 내리는 비율을 예측하는 방법이다. 잘 예측한다면 투자에서 여러 가지 응용법이 많이 생기기 때문에 좋겠지만 주가 데이터를 예측하는 것이 매우 까다롭기 때문에 실제로는 잘 예측하지 못해서 많이 쓰이지 않는 방법으로 알고 있다.
이번 프로젝트에서는 간단하게 다음 일주일 동안의 주가 변동성을 예측하도록 만들었다.
나. 전체적인 흐름
프로젝트는 다음과 같은 순서로 진행되었다. 특성은 현재 얻어진 OHLC 데이터에서 추출할 수 있는 기술적 지표만 사용했다. 추가적으로는 거시적 경제 지표나 텍스트 데이터들을 사용할 수 있다.
다. 신경망 흐름
예측에 사용할 주가 데이터를 Conv2d에 통과시키기 위해서 3개의 채널을 가지도록 복제했다. 그리고, Conv2d를 통과시키면서 점진적으로 다운샘플링 시켰는데, 이를 통해서 다른 주요 지표들을 조합시켜서 신경망이 지표들을 스스로 학습시킬 수 있도록 만들었다. 특성이 1개로 최종적으로 압축되면 셀프 어텐션을 통해서 순서를 학습시키고, 최종적으로 FC를 통과시켜서 다음 일주일 동안의 주가 변동률을 예측하도록 만들었다. 각각의 신경망 모듈들은 Skip Connection 기법을 통해서 기울기 소실을 방지하고, BatchNorm을 이용한 정규화를 통해서 학습이 원활하게 이루어지도록 만들었다.
라. 신경망 학습 및 테스트 결과
학습, 검증 데이터 손실 그래프는 순조롭게 감소하는 것을 보아서 두 데이터가 어느 정도의 규칙성을 가지고 있는 것으로 보였다.
4. 프로젝트 소감
5. 관련 링크
6. 참조 내용
이종민(텐초), 2022, 텐초의 파이토치 딥러닝 특강, 6장. 넷플릭스 주가 예측하기 : RNN으로 첫 시계열 학습
김태헌, 2020, 퀀트 전략을 위한 인공지능, CHAPTER 8. 딥러닝을 이용한 투자 전략
마르코스 로페즈 데 프라도, 2018, 실전 금융 머신러닝 완벽 분석, 3장. 레이블링







