: 먼저 학습에 사용되는 Chart Data 부터 살펴보기로 했다. 현재 학습에 사용되고 있는 Training Data는 기본적인 Chart Data에서 MA(Moving Average)를 구하고, 이에 대한 Ratio 값으로 변환을 했다. 실제 많은 차트 분석가들이 주가 차트에서 많은 지표를 추출하여 분석에 이용하지만, 본인은 처음 모델을 개발할 때, 이 부분에 대해서 신경을 써서 개발하지 못했다. (가장 중요한 부분인데도 말이다..)
이 때문에, 이번 기회에 하나씩 살펴보면서 Chart Data를 어떻게 전처리를 진행하여, Training Data로 변환할지 고민해보기로 했다.
위의 Data는 Upbit의 KRW-XRP 15분봉 차트로 일자는 9/15 ~ 10/10 차트이다. Chart Data는 해당 시점에 대해 시가, 종가, 최고가, 최저가, 거래량에 대한 정보 밖에 없기 때문에, 몇 가지 지표를 추가하여 부족한 정보를 추가해주었다.
이러한 정보를 추가하는 이유는 9월 20일의 시가, 종가, 최고가, 최저가, 거래량과 10월 1일의 것과 동일하다고 가정할 때, 해당 시점에서 차트에 대한 정보는 같지만, 실제 앞으로 벌어질 이벤트는 과거의 사건들에 따라 다르기 때문이다. 즉, 현재 시점의 데이터를 과거에 독립적인 정보를 갖는 데이터로부터, 과거의 정보를 포함하고 있는 Data로 변환하는 과정이 필요한 이유이다.
반면에.. 나중에 다시 언급하겠지만, "LSTM을 이용하여 학습할 때, <기본 Chart Data>와 <지표를 추가한 Data>에 대한 학습 성능은 어떤게 더 좋을까..?" 라는 질문을 던졌을 때, 본인은 사실 잘 모르겠다. 어차피 Network 자체 내에서 기본적으로 Feature Extraction에 대한 효과가 깔려있기 때문에, 지표를 추가한 Data를 이용하겠지만, LSTM 자체가 Time-Step에 종속적인 Network이기 때문에, 해당 시점의 Data만이 아닌 과거의 정보도 내포하고 있는 정보를 추가한다면 오히려 Noise가 될 가능성도 있기 때문이다.
예를 들어, LSTM 모델 Time Step을 60으로 했을 때, 60일 이전의 Data에 MA120 Data가 있을 경우, 이 Data는 현 시점에서 너무나 먼 과거의 정보를 담고 있는데, 이게 실제로 현재 가격에 미치는 영향이 없음에도, 해당 정보를 담고 있다면 값 자체는 Noise로 적용할 수도 있다는 점이다. 조금 더 과장을 하면, 삼성 전자 주식을 예측하려고 하는데, 10년 전의 가격까지 끌고와서 예측을 하는 것과 비슷하다고 보면 될 것 같다.
* Training Data의 중요성
먼저, 기존 모델에 적용한 방법은 "딥러닝/강화학습 주식투자" 책에서 사용한 전처리 방식이며, 이에 대해 개선해야할 부분을 이론적으로 접근하여, 살펴보기 위함이다.
실제 Chart Data의 가격 추이를 보면 변동률이 10% 내외 정도이다. 이에 대한, 추가 지표 Data를 추출하고, 분포를 살펴보았다.
가격(Price)에 대한 MA Ratio의 값은 0.00X 단위의 범위를 갖고 있으며, 거래량(Volume)에 대한 Ratio 값은 1 단위의 범위 값을 갖고 있다. 이를 다시 한 번 Re-Scaling 해서 비교해보면, 가격에 대한 값은 0~3사이 값을 가질 때, 거래량에 대한 값은 0~3000 사이 값을 갖게 된다는 것을 확인할 수 있다.
일반적으로, 위와 같이 Training Data의 각 Input Feature에 대한 상대적인 Spectrum의 차이가 클 경우, Spectrum이 큰 Feature에 Bias(편향)되어 모델이 학습될 확률이 높다. 그 이유는 보통 Model의 초기 Parameter(Weight, Bias etc)에 대해서, 초반에 학습될 때, 각 Weight의 변화량에 대해 민감하게 반응하기 때문이다.
단순하게 예를 들면, Input 값에 대해 P(Price) = 1, V(Volume) = 1000이라고 가정했을 때, 각각 동일한 Weight 1이 주어진다면 1 * W + 1000 * W = 1*1 + 1000*1 = 1001 이다. 이 값이 Activation Function = A(1001)을 통해 나오는 Output 값은 이미 다음 Layer에 넘어가면서 Volume에 상당히 편향되어 반영되어 있는 것을 알 수 있다. 물론, 지속적인 학습을 통해 Weight의 값이 조정이 되겠지만, 이러한 Specturm의 차이는 학습되는 Weight에 대한 Spectrum에도 영향을 준다. Loss 값에 대해 Backpropagation이 진행될 때, 각 Parameter에 대한 유효한 Learning Rate의 차이가 상당히 클 경우, 실제 학습 모델에서 Learning Rate를 각 Parameter에 대해 일일이 적용할 수 없기 때문에, 제대로 된 학습을 기대하기 어려울 것이다.
결론적으로, Input에 대한 Normalization, Standardization, Generalization(이건 조금 다르지만..) 등을 진행하는 가장 큰 이유는 일괄적으로 적용되는 Learning Rate에 대해 Optimal한 Point를 좀 더 찾기 쉽게 할 수 있도록 Metric Space의 Scale을 조정하는 과정이다.
towardsdatascience.com/why-data-should-be-normalized-before-training-a-neural-network-c626b7f66c7d
즉, Training Data만 가지고 모델이 어떻게 학습될 지 예측해보면, 위의 Training Data를 그대로 사용할 경우 LSTM 정책 신경망은 가격정보에 대해서 어떤 Action을 취하기 보다는 거래량에 지나치게 치우쳐서 Action을 취하는 방향으로 학습이 될 확률이 높을 것으로 예상할 수 있다. 그리고 실제로 그렇게 되었다.
위의 에피소드를 살펴보면 거래량이 가장 많았던 두 구간에서만 매도/매수를 하고 나머지 구간에서는 거래를 거의 하지 않았다. 만약, 가격 정보도 잘 반영되어 학습이 되었더라면 최저점 구간에서도 매수가 이루어지는게 나왔을 것이라고 예상한다. 참고로, 앞 쪽 구간은 에피소드 시점을 Random으로 시작하기 때문에 실제 에피소드에서 포함되지 않은 구간이라 아무런 Action이 이루어지지 않았다.
마지막으로, 학습에 이용한 Policy Network 구조는 4개의 Unit으로 이루어져 있고, Time Step은 60으로 설정했다. 그리고 Hidden Layer는 각각 (256, 128, 64, 32)로 구성했다. Network의 구조도 생각보다 깊고, 가격 정보에 대한 Data 값도 1 e-3 수준이었으니... 어찌 보면 잘 학습되기를 바랐던게 이상했을 수도 있을 것 같다.
(위의 그래프는 구조 이해를 위해 대충 그렸기 때문에, Cell State, Hidden State에 대한 Numbering이 제대로 되어 있지 않습니다...)
* 그렇다면 어떻게 해야할까?
: 우선, 1차적으로 진행해볼 사항은 가격 지표에 대한 공부이다. 사실 주식 차트에 대한 지식이 깊지가 않기 때문에, 유효한 지표가 어떤 것인지 잘 알지를 못한다. 이 때문에, 다음에는 전문가들이 주요하게 보는 지표에 대해 정리해볼 계획이다.
: 그리고 이를 바탕으로 Training Data에 대한 변환 또는 정책 신경망 Layer마다 Normalization을 추가..? 하는 방식으로 진행해보아야 할 것 같다. 사실 LSTM의 각 Layer Normalization 모델은 적용해봤지만, LSTM 성격상 Hidden 및 Cell State의 정보를 이용하여 일일이 Normalization을 해야하는데.. GPU 까지 얹히려다보니 자꾸 꼬여서 결국 해당 부분은 제외하고 진행을 했었다.
'Auto Trading > Pretreating' 카테고리의 다른 글
Chart Data 전처리 (6) : OBV / RSI / CMF (0) | 2020.10.27 |
---|---|
Chart Data 전처리 (5) : Stochastic Oscillator / CCI / 이격도 / Bollinger Band (0) | 2020.10.25 |
Chart Data 전처리 (4) : MACD / ROC & Momentum / DMI & ADX (0) | 2020.10.18 |
Chart Data 전처리 (3) : 지수이동평균 (EMA) (0) | 2020.10.16 |
Chart Data 전처리 (2) : 결측치 처리 / Normalization / Transformation (1) | 2020.10.14 |