※ Elliott Pattern Helper Add In
이번 글에서는 지난 글에 이어 ANFIS를 사용하여 시계열(time-series) 데이터를 분석하고 그 결과를 기반으로 향후 흐름을 예측하는 방법을 하나 더 소개하겠습니다.
지금 소개할 방법이 지난 글에 소개된 것과 조금 다른 점은 두 개의 ANFIS를 사용한다는 것입니다. 실제 예측을 수행하는 'Plant'로서의 ANFIS와 이것에 제공될 Control 신호를 생성하는 'Controller' ANFIS가 함께 사용되는 일종의 Neuro-fuzzy contol 형태를 구성하는 방법입니다.
※ 참고 논문: George S. Atsalakis, Kimon P. Valavanis, 'Forecasting stock market short-term trends using a neuro-fuzzy based methodology', 2009.
1. 모델링
지금 소개할 방법이 지난 글에 소개된 것과 조금 다른 점은 두 개의 ANFIS를 사용한다는 것입니다. 실제 예측을 수행하는 'Plant'로서의 ANFIS와 이것에 제공될 Control 신호를 생성하는 'Controller' ANFIS가 함께 사용되는 일종의 Neuro-fuzzy contol 형태를 구성하는 방법입니다.
그림 1. Neuro-fuzzy control |
※ 참고 논문: George S. Atsalakis, Kimon P. Valavanis, 'Forecasting stock market short-term trends using a neuro-fuzzy based methodology', 2009.
1. 모델링
기본적인 발상은, 주가의 흐름을 아래와 같이 descrete-time 도메인 상의 process-controller equation으로 이해하는 것입니다.
x(k+1) = f(x(k), u(k))
u(k) = g(x(k))
시간 k+1에서의 주가 x(k+1)은 시간 k에서의 주가 x(k)와 control signal u(k)에 의해 결정되며, 궁극적인 문제는 x(k)로부터 u(k)를 찾는 것입니다.
위 논문에서 사용된 controller ANFIS의 training data set은 [x(k), x(k+1); u(k)]입니다. x(k)와 x(k+1)은 각각 시간 k와 k+1에서의 주가의 변화이며, u(k)는 |x(k) - x(k+1)|입니다. Membership function은 Gaussian 2로 각각의 input에 대해 5 개, 총 25 개의 inference rule로 400 epoch 동안 training을 수행했습니다.
예측을 수행하는 plant ANFIS에서 사용할 signal u(k)의 값은 learning 이후의 controller ANFIS에서 input (x(k), xd(k+1))에 대해 계산한 output입니다. 여기서, xd(k+1)은 시간 k+1에서의 주가의 변화 x(k+1)을 미리 알 수 없기 때문에 사용한 값으로서, 시행착오 끝에 시간 k에서의 3일 이동평균 변화량을 채택했다고 합니다.
주식시장의 프로세스 모델이라고 볼 수 있는 plant ANFIS는 data set [x(k-1), x(k), u(k); x(k+1)]으로 training한 후, 예측을 수행하도록 했습니다. 각각의 input에 대해 Gaussian 2 membership function을 3 개씩, 총 27 개 rule로 100 epoch 동안 training했습니다.
2. 테스트 시스템
위 논문에 소개된 neuro-fuzzy control 모델을 그대로 적용하였으며, membership funciton만 Gaussian 2가 아닌 Gauss membership function을 사용하여 테스트했습니다.
테스트 데이터로는 680 여개의 KODEX 레버리지 지수 데이터를 사용했으며, 이를 90%와 10%로 나누어 각각 training data set과 검증용(check) data set으로 나누어 테스트를 진행했습니다.
3. 테스트 결과
아래 그림 2는 controller ANFIS에 의한 output입니다. Training data set에 대해서는 실제 u(k)와 계산된 u(k) 값이 거의 일치하는 것처럼 보입니다. 물론 마지막 input (x(k), xd(k+1))의 output은 실제 값과는 차이가 나는 것을 볼 수 있으며, 이는 당연한 결과일 것입니다.
그림 2. Controller ANFIS Output |
다음 그림은 plant ANFIS를 100 epoch 동안 training하는 과정에서의 learning error 변화를 나타낸 것입니다.
그림 3. Plant ANFIS의 epoch 별 에러 추이 |
위 결과에 따라 epoch 수를 72회로 조정하여 plant ANFIS를 다시 training했습니다. 다음은 controller ANFIS가 산출한 u(k)를 input signal로 받아 plant ANFIS가 예측한 output, 즉 x(k+1) = f(x(k-1), x(k), u(k))를 실제 주가 흐름과 대비하여 표시한 그림입니다.
그림 4. Plant ANFIS Output |
위 그림 3의 결과를 보면 '모양은 비슷해 보이지만.., 한 발 늦는군...'요. 논문에서는 4,000여 개가 넘는 data로 training한 후 60%가 넘는 'hit ratio' 결과를 얻었다고 하는데요, 위 결과는 그에 미치지 못했습니다. Training data의 양을 늘려야 할까요..?
4. 결 론
정리를 하면, 주식 시장의 프로세스 모델을 아래 식에 기반한 neuro-fuzzy control로 모델링하여 주가의 단기 흐름을 예측해 보았습니다.
x(k+1) = f(x(k-1), x(k), u(k))
u(k) = g(x(k))
Control signal u(k)는 3일 이동평균 변화량에 대한 controller ANFIS의 output입니다.
위 참고논문에서는 연구 성과를 타 연구들과 대비하여 'Hit Ratio가 조금 더 낫다'라고 스스로 평가하고 있습니다. Hit ratio 60% 정도면 'Random Walk'보다는 좋겠지요...?
물론, 제가 직접 테스트한 결과 수치는 그 정도까지 나오진 않았습니다만 training data의 양을 크게 증가시키고 동일한 membership function을 사용한다면 더 좋은 결과가 나올 수도 있을 것입니다.
댓글 없음:
댓글 쓰기