IDEA
이 논문은 새로운 architecuture를 만들기는 보다는 그동안 stock prediction에는 GAN모델을 사용하지 않았는데 사용해 보았더니 기존에 있던 모델들 보다 좋은 성능이 나왔다는 것이다. 모델도 실험을 위한 모델로 GAN을 어떻게 만드는냐에 따라 크게 달라질 것으로 보인다. Generator부분은 LSTM으로 구축하였는데, 사실 squential data에서 성능이 좋아보이는 것은 Transformer모델로 LSTM대신에 Transfomer모델을 썼을 경우 어떻게 되었는가에 대한 실험도 있었으면 좋겠다.
GAN이란?
GAN은 unsupervised learning을 하는 모델로 Generator, Discriminator 2가지 모듈이 있다. Generator는 uniform distribution을 통해 랜덤하게 data를 생성하고 Discriminator는 Generator의 data와 실제 data를 구별하는 모듈이다. 이 모델의 목적은 Generator가 data를 잘 생성해서 실제 데이터와 거의 똑같은 data를 생성해도록 하자이다. 결과적으로 Generator는 raw data의 분포를 학습하여 비슷한 data를 생성할 수 있게 된다.
RNN베이스로 된 모델의 output예측은 단순하게 Linear layer로 구성되어있는데, 금융 시장은 변수가 많이 있으므로 한계가 있어보이긴 한다. GAN모델을 이용하면 시계열 데이터 예측 값과 실제 값의 분포를 좀 더 세밀하게 학습할 수 있을 것이라고 볼 수 있다. 하지만 기본GAN을 사용하는 것은 비추다. WGAN에서도 말했듯이 JS divergence는 변수가 다양하고 고차원 데이터에서는 continuous하기 않기 때문에 적합하지 않다.
Model
위 그림은 이 논문에서 사용된 모델구조이다. Generator부분을 LSTM으로 $Y_{l+1}$을 예측하고, 실제 데이터는 Label로 사용하여 Discriminator를 속이겠다라는 의도이다. Discriminator는 CNN으로 구성되어있는데, time series data간의 feature를 비교하여 distance(L1-norm or L2-norm)를 구해 loss로 삼겠다는 목적이다.
Loss function
이 모델은 loss function을 계산하기 위해 여러단계를 두었다.
- cross entropy loss : cross entropy loss를 이용하여 fake data와 real data의 loss를 구한다.
$$ L_{adv}^{G} = L_{sce}(D(G(X)),1),\ \ L_{sce}(A,B) = -\sum B_{i}\log(sigmoid(A_{i})) -\sum (1-B_{i})\log(sigmoid(1-A_{i})) $$ - L1-norm or L2-norm : L1 or L2 distance를 통해 fake data와 real data간의 차를 구한다.
$$ L_{p} = ||Y_{T+1} - G(Y)||_{p} \ \ \ \ \ , 단 p = 1\ or\ 2 $$ - direction predition : T+1와 T의 차를 이용하여 fake data와 real data간의 loss를 구한다.
$$ L_{dpl} = |\sin (G(Y+1) - G(T)) - \sin (Y_{T+1} - Y_{T})| $$ - Generator loss function : 1 + 2 + 3더하여 Generator의 loss를 구한다.
$$ L_{G}(X,Y) = \lambda_{adv} L_{adv}^{G}(G(X))+\lambda_{p} L_{p}^{G}(G(X))+\lambda_{dpl} L^{G}_{dpl}(G(X)) $$ - Discriminator loss function
$$ L_{D}(X,Y) = L_{sce}(D(G(X),0)+L_{sce}(Y,1) $$
위에 나와있는 람다값은 하이퍼파라미터로 이 논문에선 1을 사용하였다. 이제 Generator의 loss는 minize하고 Discrimitor의 loss 최대화하는 쪽으로 학습시킬 것인다.
Experiment
이 논문의 핵심은 GAN을 처음써서 time-series를 처음 예측했기 때문에 실험결과가 상당히 중요하다.
일단 데이터는 13개의 지표들을 사용하고 사진에 있는 M은 training set으로 N은 testing set으로 사용하였다고 한다. 실험결과를 보기 전에 몇가지 용어를 정리하고 가자. 모델뒤에 F를 쓰는 것은 forecasting error만 사용한 모델하여 위 loss에서 $L_{dpl}$을 쓰지 않는 모델을 말하고 FD모델은 forecasting loss과 direction prediction error로 함께 사용한 것을 의미한다.
지표 정리하기
여기에서는 2가지 지표로 실험결과를 나타내었는데, 하나는 fake data와 real data간의 차를 보는 지표와 다른 하나는 T시점에서 T+1시점을 예측했을 때, 변동 방향이 같은지 다른지를 체크하는 지표이다.
1. Root Mean Squared Error(RMSRE) : 이 로스를 사용해서 예측 값과 실제 값의 차이를 보겠다는 것이다. 낮을수록 좋은 것이다.
$$ RMSRE = \sqrt {\frac{1}{T_{0}} \sum_{T+1}^{t=0}(\frac{\hat Y_{l+1} - Y_{l+1}}{Y_{l+1}})^{2}} $$
2. Direction Prediction Accuracy (DPA) : T시점에서 T+1시점으로 이동할 때, 변동 방향이 같은지 다른지를 체크한다.
$$ DPA = \frac{100}{T_{0}}\sum_{t=1}^{T_{0}}I_{t},\ \
I_{t} =
\begin{cases}
1, & \text{if }n(\hat Y_{l+1} - \hat Y_{l})(Y_{l+1} - Y_{l}) > 1 \\
0, & \text{otherwise}
\end{cases}$$
실험결과 확인해보기
결과적으로 GAN-FD가 최종적으로 좋은 모습을 보였다.
나의 결론
RNN베이스는 Sequential 데이터를 다루지만 time-series data의 feature를 다루는데 다소 불완전한 모습이 있다. 조금 더 조사하면 나만의 주식 AI를 만들 수 있을거 같다.
댓글