[paper review] Stock Market Prediction on High-Frequency Data Using Generative Adversarial Nets - Xingyu Zhou, Zhisong Pan, Guyu Hu, Siqi Tang and Cheng Zhao (2018)
이 논문을 리뷰하게 된 이유는 주식 예측을 위해서 GAN (Generative Adversarial Nets) 을 사용했다는 점과 High-Frequency Data를 다뤘다는 점이 흥미로웠기 때문입니다.
먼저 제목과 전반적인 내용을 훑어보게 되면,
on High-Frequency Data?
분,초 단위의 주식 데이터를 의미합니다. 브라질 주식에서는 이러한 high-frequency 거래가 2009년 2.5%에서 2013년 36.5%까지 증가했다고 합니다.
Stock Market Prediction?
예측 하려고 하는 시점이 (T+1)이라고 하면, 1시점 부터 T 시점까지의 13가지 데이터 지표들(indicators)을 input으로 사용했다고 합니다. 이 T 시점을 [7, 12, 40] 등으로 설정 했던 논문들이 있지만 여기서는 T = 242로 설정하였습니다. 하루 중국 시장 데이터가 242분이라고 하네요. (특이한 점은 중국증시는 한국 시간으로 오전 10:30~ 오후 16:00까지고 점심시간 12:30~14:00은 점심시간이라 거래가 없다고 합니다)
13가지 보조지표는 다음과 같습니다.
Input : [batch_size x 242 x 13 ] , Output : [batch_size x 1]
Using Generative Adversarial Nets ?
1)GAN 모델링을 접목하여 모델 예측의 성능을 높힘.
2)Rolling segmentation 방식을 이용하여 모델의 업데이트 주기를 더 빠르게 하여 성능을 높힘.
본론으로 넘어가서, 좀 더 자세히 살펴보겠습니다.
GAN modeling for stock prediction
위 그림이 논문의 주요 핵심 내용을 담고 있습니다. 기본적인 GAN의 구조 (Discriminator VS Generator)를 크게 벗어나지 않습니다.
GAN에서는 두 개의 신경망 네트워크를 서로 적대적으로 구성합니다. Discriminator (D) 입장에서는 전체 식을 max로 만들어야합니다 [빨간색] . Generator (G)가 만들어낸 가짜 데이터를 가짜로 판단해야 하고( D(G(z)) -> 0 ) 진짜데이터에 대해서는 진짜로 판별해야합니다. (D(x)-> 1)
Generator (G) 입장에서는 전체 식을 min으로 만들어야합니다 [파란색]. Generator (G)가 만들어낸 가짜데이터를 D에서 진짜로 잘못 판단해야합니다.(D(G(z))-> 1) , 사실 이 모순 되는 관계 때문에 실제로 학습해보면 어려운 점도 많습니다. 이 학습 안정성을 위해서 많은 논문들이 나왔으나 여기서는 넘어가도록 하겠습니다.
이런식으로 GAN에서는 주식 데이터를 실제 데이터처럼 생성해내는데 목적이 있고 이를 GAN loss라고 하면 이 loss와 추가적으로 Prediction loss와 Direction Prediction loss를 사용합니다. Prediction loss는 예측값과 실제값의 절대값 차이를 계산하고 Direction Prediction loss는 T에서 T+1로 넘어갈때의 방향 (Up/Down)을 맞췄는지 틀렸는지에 대해서 계산합니다.
사실 Prediction loss , Direction Prediction loss는 기존의 stock prediction에서 많이 쓰는 기본적인 loss이고 여기에 GAN loss가 추가되었다고 보면 될 것 같습니다. Generative loss가 기존의 loss에 더해지면서 기존의 라벨로는 학습되지 않는 어떤 패턴들을 학습하게 된다고 이해하고 있습니다. 비슷한 예로 autoencoder를 사용하여 stock prediction하는 논문도 본 적이 있습니다.
Rolling Segmentation for stock prediction
일반적으로 주식 모델링을 하는 논문들은 전체 기간을 일정 비율로 나눠서 순순서를 섞지 않고 Training set과 Testing set을 사용합니다. 그에 반해, Rolling segmentation 방식은 training set의 기간을 M, testing set의 기간을 N으로 선정하고 이상태로 훈련을 한번 하고, 그 다음에 N기간 만큼 이동하면서 계속해서 전체를 학습합니다. (각 episode마다 새롭게 학습을 하여 weight를 구합니다) 트레이더들의 거래 스타일이 빠르게 변하기 때문에 해당 방식을 채택하였다고 하는데, 사실 이 부분이 새롭게 나온 Contribution이라고 하기엔 어렵지만 실제로 백테스팅을 해봤을때 일정 시점을 넘은 과거의 데이터는 크게 도움이 안되는 경우를 경험적으로 확인하였습니다.
Results
기간은 2016년 1월 1일 ~ 12월 31일, 244 거래일, 각 거래일은 242분. 그래서 총 59048분의 거래 데이터. 각 주식은 다음과 같은 기준으로 선정하였다고 합니다.
1. 중국증시 CSI 300에 속하는 주식종목들중에서
2. Not suspended during the period (주가에 큰 영향을 주는 경우를 제외, 이 부분에 대한 해석이 조금 어렵습니다. 사실 임의로 룰으로 정하지 못하는 임의의 데이터 수정은 편파적일 수 도 있습니다)
3. High-frequency exchange의 변동성(volatility)를 보장하기 위해서 첫 시작 날짜 (1월 1일)의 종가가 30위안 이상
위 조건을 만족하는 주식은 42개 종목이라고 합니다.
결과적으로 GAN-FD ( GAN loss와 Prediction loss, Direction Prediction loss를 모두 사용한 결과)가 가장 좋게 나왔고 다만 M(학습데이터 길이)가 N(테스트데이터 길이)에 비해서 상대적으로 짧은 경우 정확도가 낮게 나왔습니다.
Summary
Generative Model을 Stock Prediction에 사용한것은 의미가 있다고 생각합니다. 비교적 외적인 요인에 의해서 영향을 적게 받는 High frequency data에 대해서 실험한 점도 적합한 문제 세팅입니다.
하지만, CSI 300 데이터에서만 실험한 점이 아쉬우며 종목의 종류와 수가 너무 제한적이여서 아쉽습니다. 또한 주가의 어떤 큰 변화가 있는 경우에 데이터에 포함하지 않았기 때문에 실제로 주가의 급격한 변화가 있을 경우 대응이 어려울 수 있습니다.
paper links : https://www.hindawi.com/journals/mpe/2018/4907423/