토이 프로젝트 일지 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. 짧은 단위 시간을 결정했을 경우

* 장점
    - 기술적 분석의 예측 결과가 맞을 확률이 더 높음
    - 상승장, 하락장과 같은 시장 추세에 덜 민감함
    - 예측 불가능한 사건으로 인한 급등, 급락에 신속하게 대처할 수 있음

 * 단점
    - 대부분의 지표가 일봉을 기준으로 공개하기 때문에 학습 데이터를 구하기 매우 어려움
    - 추세를 추종하기보다는 모멘텀을 따라가기 때문에 예측 결과가 맞더라도 수익을 실현하기 까다로움
    - 수수료에 영향을 많이 받기 때문에 이 부분을 고려해서 설계해야 함
    - 자동 투자를 실시간으로 구현해야 하므로 구현 난이도가 높음

B. 긴 단위 시간을 결정했을 경우

* 장점
    - 데이터를 구하기가 비교적 쉬운 편임
    - 추세를 탈 수 있기 때문에 예측이 맞을 경우 수익을 실현하기 쉬움
    - 수수료에 덜 민감하기 때문에 크게 고려하지 않아도 됨

* 단점
    - 학습 데이터의 개수가 부족하기 때문에 이로 인해서 예측률이 떨어질 수 있음
    - 예측 불가능한 사건이나 시장 상황에 영향을 많이 받게 됨

필자는 비교적 긴 시간 단위를 가진 일봉 데이터를 사용했다.

가-2. 예측시킬 데이터 결정

주가 데이터 예측을 위해서 상승/하락과 같은 이진 분류가 일반적이나, 이러한 이진 분류만으로는 제대로 수익을 실현하기 어렵기 때문에 다양한 전략을 취할 수 있다. 각각에는 장단점이 있기 때문에 이를 고려해서 적절하게 사용해야 한다.

A. 상승 / 하락 이진 분류로 예측

가장 간단하고, 널리 사용되는 예측 방식이지만 0.001%만 오르거나 내려도 오름, 내림으로 예측하기 때문에 짧은 시간 단위를 이용하는 투자에서는 예측에 성공해도 손해를 보는 경우가 생길 수 있다.

B. X%를 기준으로 상승 / 보류 / 하락 분류로 예측

투자 예측 관련 논문에서 자주 쓰이는 방식이다. 특정 -X% ~ +X% 사이의 변동률은 보류로 예측해서 수수료로 인한 손해를 줄일 수 있다. 하지만, X%라는 것이 임의적이기 때문에 제대로 예측하기 어렵고, 라벨 불균형이 일어나기 쉽기 때문에 학습하기 까다로운 편이다.

C. 주가의 표준 편차를 기준으로 상승 / 보류 / 하락 분류로 예측

B 보다는 예측 성능이 개선되나, 라벨 불균형 문제와 표준 편차에서 어느 정도의 비율을 보류로 해야 할지에 대한 문제가 여전히 남아있다.

D. 삼중 베리어 기법으로 예측

삼중 베리어 기법이란 예측을 시작하는 시점에서 X% 만큼 위, 아래에 베리어를 만들고 그곳에 처음으로 닿았을 경우를 상승 / 하락으로 예측하는 기법을 말한다. 만약 K일 동안 위, 아래 베리어에 닿았지 않았을 경우 보류로 해석하거나 Y%를 기준으로 상승, 하락으로 판단한다. 실제로 구현해보니 B, C 보다도 예측하기 쉽지 않았다.

E. 선형 회귀의 계수로 예측

다음 K일 동안의 주가 데이터를 선형회귀로 학습시키고, 그것의 계수값을 사용하는 방식이다. 예측하는 값이 상당히 자연스러운 값이기 때문에 학습이 잘 되는 편이고, 실제로 예측했을 경우 수익으로 잘 이어지는 편이지만, 짧은 단위 시간에서는 추세를 타기 어렵기 때문에 이 방법으로는 수익을 실현하기 까다로웠다.

F. 회귀 문제로 예측

분류가 아닌 실제 오르거나 내리는 비율을 예측하는 방법이다. 잘 예측한다면 투자에서 여러 가지 응용법이 많이 생기기 때문에 좋겠지만 주가 데이터를 예측하는 것이 매우 까다롭기 때문에 실제로는 잘 예측하지 못해서 많이 쓰이지 않는 방법으로 알고 있다.

이번 프로젝트에서는 간단하게 다음 일주일 동안의 주가 변동성을 예측하도록 만들었다.

나. 전체적인 흐름

그림 1. 프로젝트의 전체적인 흐름
그림 1. 프로젝트의 전체적인 흐름

프로젝트는 다음과 같은 순서로 진행되었다. 특성은 현재 얻어진 OHLC 데이터에서 추출할 수 있는 기술적 지표만 사용했다. 추가적으로는 거시적 경제 지표나 텍스트 데이터들을 사용할 수 있다.

다. 신경망 흐름

그림 2. 신경망의 전체적인 흐름
그림 2. 신경망의 전체적인 흐름

예측에 사용할 주가 데이터를 Conv2d에 통과시키기 위해서 3개의 채널을 가지도록 복제했다. 그리고, Conv2d를 통과시키면서 점진적으로 다운샘플링 시켰는데, 이를 통해서 다른 주요 지표들을 조합시켜서 신경망이 지표들을 스스로 학습시킬 수 있도록 만들었다. 특성이 1개로 최종적으로 압축되면 셀프 어텐션을 통해서 순서를 학습시키고, 최종적으로 FC를 통과시켜서 다음 일주일 동안의 주가 변동률을 예측하도록 만들었다. 각각의 신경망 모듈들은 Skip Connection 기법을 통해서 기울기 소실을 방지하고, BatchNorm을 이용한 정규화를 통해서 학습이 원활하게 이루어지도록 만들었다.

라. 신경망 학습 및 테스트 결과

그림 3. 학습 데이터 손실 그래프
그림 3. 학습 데이터 손실 그래프

그림 4. 검증 데이터 손실 그래프

그림 4. 검증 데이터 손실 그래프

학습, 검증 데이터 손실 그래프는 순조롭게 감소하는 것을 보아서 두 데이터가 어느 정도의 규칙성을 가지고 있는 것으로 보였다.

그림 5. 학습 데이터 증감율 예측 그래프
그림 5. 학습 데이터 증감율 예측 그래프(예측값, 실제값)

그림 6. 검증 데이터 증감율 예측 그래프
그림 6. 검증 데이터 증감율 예측 그래프(예측값실제값)

그림 7. 학습 데이터 투자 시뮬레이션 누적 수익 그래프
그림 7. 학습 데이터 투자 시뮬레이션 누적 수익 그래프(종가, 예측 누적 수익, 보유 누적 수익)

그림 8. 검증 데이터 투자 시뮬레이션 누적 수익 그래프
그림 8. 검증 데이터 투자 시뮬레이션 누적 수익 그래프(종가예측 누적 수익보유 누적 수익)

실제 투자 시뮬레이션에서는 예상대로 학습데이터에서는 매우 높은 예측률과 수익률을 보이지만, 검증 데이터에서는 안 좋은 결과를 보였다. 신경망의 학습 손실을 보았을 때, 학습 자체는 제대로 했기 때문에 데이터 자체에 예측성이 떨어지거나 데이터 노이즈 문제가 있는 것으로 보인다.

4. 프로젝트 소감

주가 예측 관련 프로젝트는 특히 까다로운 편이 많았던 것 같았다. 특히, 예측을 하는 데에 필요한 정보를 실수로 누수 하는 경우가 상당히 많아서 이 부분에 신경을 많이 썼다. 실제로 Kaggle에 올린 다른 코드나 투자 예측 관련 논문에서도 이러한 부분이 많기 때문에 앞으로도 조심해야 할 것 같다.
학습한 신경망이 실제로 효과가 있는지 검증하는 부분에도 까다로운 부분이 있었다. 손실값이 더 낮다고 해도, 실제 투자에 도움이 되지 않는 패턴을 학습했을 경우에는 오히려 손해를 볼 수도 있기 때문에 상당히 어려운 부분 중에 하나다.

5. 관련 링크

6. 참조 내용

이종민(텐초), 2022, 텐초의 파이토치 딥러닝 특강, 6장. 넷플릭스 주가 예측하기 : RNN으로 첫 시계열 학습

김태헌, 2020, 퀀트 전략을 위한 인공지능, CHAPTER 8. 딥러닝을 이용한 투자 전략

마르코스 로페즈 데 프라도, 2018, 실전 금융 머신러닝 완벽 분석, 3장. 레이블링

이 블로그의 인기 게시물

토이 프로젝트 일지 6 : React/SpringBoot 기술 스택으로 코딩 테스트 서비스 만들기

토이 프로젝트 일지 7 : RedKiwi와 유사한 이벤트 스토밍 기반 마이크로 서비스 만들기

토이 프로젝트 일지 2 : ChatGPT 서비스를 활용하는 크롬 플러그인 만들기