본문 바로가기

주식 데이터 모델링

딥러닝으로 주식 예측하는 논문 구현 [Stock Market Prediction on High-Frequency Data Using Generative Adversarial Nets] - 2. 논문(2) - 모델

3. Forecasting with High-Frequency Data

 

 본문의 주가 되는 부분 입니다.

 

3.1. Problem Statement

 이번 논문에서는 각 주식이나 market index를 딱 one step 만큼 진행된 값만 예측한다고 합니다. 이 논문에서 말하는 one step은 분 단위 입니다.

 예측 하려고 하는 시점이 (T+1)이라고 하면, 1시점 부터 T 시점까지의 주가 데이터 + 기타 주식거래에서 사용 되는 지표들(indicators)을 input으로 사용합니다. 이 T 시점을 [7, 12, 40] 등으로 설정 했던 글들도 있지만 이번에는 T = 242로 설정 했습니다. 중국 주식 시장이 거래일당 242분의 거래 데이터가 나오기 때문입니다. 

 

3.2. Prediction Model

 

GAN-FD 모델 구조

[GAN에 대해서는 기본적으로 알고 있다고 가정하겠습니다.]

 위의 모델 구조에서 말하는 X는 historical indicators information 입니다. 사용되는 지표는 시가, 고가, 저가, MACD 등 인데 정확한 목록은 뒤에 보여드리겠습니다. Y는 분단위 주가 입니다. 

 Generative model의 데이터 흐름은 이렇습니다. 1~T 시점의 지표들을 LSTM layer에 통과 시킨다. layer output과 1~T 시점의 주가를 합쳐서 T+1 시점의 주가를 예측한다.

 보시다시피 '지표'들로 T+1 시점의 주가를 예측합니다. 이 부분이 본인들의 main intuition 이라고 말합니다. 숙련된 트레이더 들은 주가를 예측할 때 이런 '지표'를 참고하기 때문입니다. [기술적 거래를 들어보신 분들은 알겠지만, 실제로 지평선, MACD 등의 지표를 거래에 실제로 많이 활용합니다.]

 

 

 Discriminative model는 1~T 시점의 주가 + (T+1) 시점의 주가를 받았을때, 이 주가가 실제 주가인지, G모델에서 만들어낸 주가인지 맞추는 것입니다.

 

 GAN은 G모델과 D모델을 각각 번갈아가며 훈련시키죠. 각각 모델에 input을 넣어서 나온 loss 값을 optimizer를 통해 최소화 시킵니다. 이러한 훈련 방식 때문에 GAN이 특정 분야에서는 효과가 좋지만, 많은 경우 훈련이 힘들기도 합니다. 저자들은 주식 예측에 맞게 G모델과 D모델을 만들었다는 걸 강조하고 싶다고 합니다. 예측 성능을 향상시키기 위해 모델 구조를 더 바꿀수 있다고도 생각합니다.

 

3.3. Adversarial Training

 

 GAN 훈련 방식이 크게 특이하지는 않습니다. 하지만 Loss 부분에서 저자들이 만든 loss를 사용하여 훈련시킵니다. 

 

G Loss

 먼저 G Loss를 보겠습니다. 

 각 Loss 앞에 붙은 람다는 loss의 가중치를 의미합니다.

 첫번째 로스는, G 모델에서 나온 Y의 예측값을, D모델이 'True'라고 판단하도록 하기 위한 로스입니다. 아시다시피 첫번째 로스의 목적은 D 모델이 Y값이 'True' 값인지 'False' 값인지 모르게 '혼란'을 주도록 학습하라는 의미 입니다.

 두번째 로스는 G 모델에서 예측한 Y값과 실제 Y값의 차이의 절대값 입니다. 첫번째 로스만 사용을 하게되면, G 모델에서 나온 output은 D 모델에 '혼란'을 주는 것에만 초점을 맞추게 됩니다. 두번째 로스를 사용하면 G 모델의 output이 실제 Y 값과 비슷하게 출력 되도록 학습합니다. [GAN-FD의 F가 이 loss를 의미합니다.]

 

Dpl Loss

 세번째 로스는 dpl(Direction prediction loss) 입니다. 위의 두 로스는 GAN에서 기본적으로 사용하는 loss이고 이 세번째 로스는 이 논문에서 제시한 loss 입니다. sgn은 sign function 입니다. [0보다 크면 1, 작으면 -1][지금 시점보다 다음 시점에 정확한 양은 몰라도, 방향을 정확히 알 수 있다면 엄청난 정보 겠죠.][GAN-FD의 D가 이 loss를 의미합니다.]

 

D Loss

 D loss 입니다.

 일반적인 GAN의 D loss와 똑같습니다. D 모델이 실제 Y 값을 입력으로 받으면 True,  예측한 Y값을 입력으로 받으면 False를 출력하도록 학습하는 거죠.

 

 

4. Experiments

4.1 Dataset

 기간은 2016년 1월 1일 ~ 12월 31일, 244 거래일, 각 거래일은 242분. 그래서 총 59048분의 거래 데이터.

 각 주식은 다음과 같은 기준으로 선정.

   1. CSI 300에 속함. (CSI 300은 상하이와 심천 증권 거래소에서 거래되는 상위 300 개 주식의 실적을 재현)

   2. Not suspended during the period (주가와 주가 예측값에 significant한 영향을 주는 경우를 제외했다)

   3. High-frequency exchange의 변동성(volatility)를 보장하기 위해서 첫 시작 날짜 (1월 1일)의 종가가 30 이상

 위 기준을 모두 만족하는 주식은 42 종목 이고, 각 종목이 상승하는 비율, 하락하는 비율(분단위 종가가)은 거의 비슷합니다.

 Input으로는 분단위 종가(Y), 13개의 indicators(X)를 사용합니다. 많은 펀드 매니저, 투자자들은 이런 지표를 미래를 예측하는데 이미 많이 써왔습니다. 13개의 지표는 선행 연구, 전문가들과 함께 선택하였고, 지표의 parameters는 Wind Financial Terminal(저자들이 사용한 웹사이트와 프로그램)의 기본값을 사용했습니다.

사용한 지표들

 또, 각 데이터들은 Rolling segmentation 방식으로 training set과 testing set을 나누고 학습했습니다.

 

Rolling segmentation

 일반적으로 주식 모델링을 하는 논문들은 전체 기간을 일정 비율로 나눠서 training set과 testing set을 사용합니다. 그러나 Rolling segmentation 방식은 training set의 기간을 M, testing set의 기간을 N으로 선정합니다. 이상태로 훈련을 한번 하고, 그 다음에 N기간 만큼 이동해서 학습하고... 이런 식으로 전체 기간에서 일부분의 dataset 으로 계속 학습을 합니다. 그 이유는 이렇습니다. 트레이더 들의 거래 스타일이 계속 바뀌기 때문입니다. 어떨 때는 변동성이 매우 큰 주식을 선호하고, 어떤 때는 기술주를 선호하는 식 입니다. 거래 스타일이 계속 바뀌는 것에 적응하기 위해 모델 parameters를 주기적으로 업데이트 하는 방식을 택했다고 합니다. [여기서 M과 N의 값이 hyper parameters가 될텐데, 관련 실험은 뒤에 있습니다.]

 

4.2 Network Architecture

G 모델은 LSTM(121 units)을 사용했습니다. 자세한 setting은 생략하겠습니다.

D 모델은 CNN 구조 입니다. 

[D모델의 input은 주가 입니다. filter의 사이즈로 보면 4이고 strides는 2 입니다. Receptive field를 계산하면 22가 됩니다. 즉 CNN 3 layer를 거치고 나온 output은 앞선 22 거래일에 영향을 받는 다는 말이 됩니다.]

 

자세한 실험 내용은 다음 글에 이어 가도록 하겠습니다.