2014년 3월 19일 수요일

Forecasting using SVM 2 - Test Data & Program

※ Elliott Pattern Helper Add In
  • Download Add In for Excel 2007 
  • Download Add In for Excel 2003 

  지난 글 'Forecasting using SVM' 작성을 위해 사용했던 테스트 데이터와 테스트 프로그램을 공개합니다.
  

▶ 테스트 데이터


  테스트에 사용한 엑셀 파일은 2004년 1월부터 현재(2014년 3월 18일)까지 10년 여 동안의 2,500여 개 KOSPI 지수 일자별 데이터를 포함합니다.
  

그림 1. 테스트 데이터 (엑셀 파일)



▶ 테스트 프로그램


  테스트 프로그램은 엑셀 Add-in으로서 몇몇 Technical Indicator와 SVM SMO 알고리즘을 구현한 것입니다.

  
  테스트 프로그램 사용법을 간략히 설명하겠습니다. ※ 엑셀 Add-in 설치방법은 생략합니다.

  
  테스트 프로그램(엑셀 Add-in)을 설치한 후, 테스트 파일을 열고, 다음 그림 2와 같이 시트 위에서 컨텍스트 메뉴의 'SVM SMO wnf → SVM SMO'를 클릭합니다.
  

그림 2. SVM SMO wnf 실행 1
  
  'SVM SMO Settings' 폼이 팝업되면, 그림 3과 같이 'Use technical indices, 2 class classification' 체그박스를 체크하고, 'From' 텍스트 상자와 'Examples' 텍스트 상자에 각각 1,537과 800을 입력합니다. 테스트 데이터 중 후반부 1,000개를 사용하고, 그 중 800개를 training에 사용하겠다는 의미입니다.
  

그림 3. SVM SMO wnf 실행 2
  
  'Run' 버튼을 클릭하면, 그림 4와 같이 'Technical Indicators' 폼이 팝업됩니다. 사용할 지표들만 선택한 후 'Run' 버튼을 클릭하면 됩니다. ☞ (주의) 위에 첨부한 테스트 파일을 사용하지 않는 경우, 그림 4의 'Labels' 텍스트 상자의 값들을 수정해 주어야 합니다.
  

그림 4. SVM SMO wnf 실행 3
  
  다음 그림 5와 같이 테스트 결과를 확인할 수 있습니다.
  

그림 5. SVM SMO wnf 실행 결과
  
  

Forecasting using SVM

※ Elliott Pattern Helper Add In
  • Download Add In for Excel 2007 
  • Download Add In for Excel 2003 

☞ 안내 및 사과의 글을 올립니다.

  동일한 제목으로 2013년 1월에 올렸던 글에 심각한 오류가 있었습니다. 테스트 프로그램의 버그로 인해 크게 왜곡된 결과를 게재했음을 뒤늦게 발견하게 되었습니다.
  
  죄송합니다.
  
  그리고, 관심을 갖고 오류를 찾는데 도움을 주신 연세대학교 경영대학원 석사과정 최재호님과 친구분께 감사의 말씀을 드립니다.
  


▶ 기술적 지표 (Technical Indicators)

  대부분의 트레이더는 매매기준을 설정하거나 매수/매도시점을 판단할 때 기술적 지표들을 많이 활용합니다. 뚜렷한 추세가 있을 경우에는 추세 추종형 지표를 많이 참고하고, 그렇지 않을 경우에는 변동성 지표나 모멘텀 지표에 더 무게를 두기도 합니다. 지수(또는 주가)와 지표 사이의 divergence를 매매신호로 보기도 하죠.

  그런데 이러한 지표들은 과거의 주가(또는 지수)와 거래량 등에 의해 계산되는 후행적인 성격을 갖기 때문에, 몇몇 지표만 가지고 시시각각 변하는 집단심리의 변화와 그에 의해 결정되는 주가를 예측한다는 것은 불가능한 일이라고 보는 것이 옳을 듯 합니다.

  더군다나 트레이더들이 사용하는 HTS는 지표 몇 개만 띄워 놓아도 화면이 가득찰 뿐만 아니라, HTS를 통해 더 많은 지표를 동시에 볼 수 있다고 하더라도 그 많은 숫자(지표)들이 주가의 향후 움직임과 어떤 관계가 있을지 파악하는 것은 어리석은 일일지도 모릅니다.

  그렇다면 다음 그림을 보죠.


Fig 1. Technical Indicators

  위 Fig 1과 같이 과거 일자별 주가와 여러 종류의 기술적 지표들로부터 상승할 때의 지표 조합과 하락할 때의 지표 조합을 분리해 낼 수 있다면 어떨까요? 만약 그럴 수 있다면 오늘의 기술적 지표들만 가지고 내일의 주가 흐름을 예측해 볼 수 있지 않을까요?

  이번 글에서는 위 의문에 대해 풀어나가고자 합니다. 기술적인 배경 파악을 위해 Wikipedia에 수록된 그림을 하나 보겠습니다.


Fig 2. Separating hyperplane

  Fig 2처럼 평면에서 점들을 그 특성에 따라 분리하는 선을 긋는다고 가정합시다. H1은 제대로 분리하지 못하지만, H2와 H3는 정확히 분리합니다. 물론 Fig 2와 같이 2차원 평면의 단순한 경우라면 분리선을 쉽게 그릴 수 있을 것입니다.

  하지만 3차원 공간에서 수많은 점들을 두 개로 분리하는 2차원 평면(hyperplane)을 찾는 경우라면 어떨까요? 더 나아가 Fig 1에서처럼 (지표 8, 등락 1개) 9차원 vector 공간의 vector 수 천개를 두 개의 부류로 분리하는 경우라면요?

  Machine learning 분야에서 Perceptron이나 Support Vector Machine의 개념이 등장한 것이 이런 문제들을 해결하기 위한 것이었습니다.


▶ Support Vector Machine (SVM)

  Fig 2의 H2와 H3는 모두 분리선(separating hyperplane)의 역할을 하지만 점들과의 거리가 더 먼 것이 H3라는 사실이 명확하게 드러납니다. H3와 같이 separating hyperplane들 중에서 점들과의 거리가 가장 먼 것을 maximum-margin hyperplane이라고 하며, maximum-margin hyperplane과 가장 가까운 점들을 support vector라고 합니다.

  이와 같이 수많은 샘플 데이터로부터 maximum-margin hyperplane과 support vector를 자동으로 찾아낸 후, 새로 입력된 데이터에 대해 패턴 또는 특성을 자동으로 인식하게끔 하는 learning 모델이 바로 SVM입니다.


▶ 기술적 지표를 통한 예측 모델

  서두에 품었던 의문, 즉 축적된 기술적 지표들로부터 주가를 예측하는 것이 가능한가의 문제에 대한 접근방법이 어느정도 가시화된 느낌입니다.

  Fig 1과 같이 축적된 데이터를 가지고 Support Vector Machine을 training시킨 후 예측을 하게끔 하는 모델을 직접 테스트해 보겠습니다.


▶ 테스트 시스템

  테스트 시스템은 MS Excel과 Excel VBA 모듈로만 구성했습니다. VBA 모듈은 두 개로 작성했는데, 첫 번째는 주가(시가, 고가, 저가, 종가)와 거래량으로부터 기술적 지표를 계산하는 모듈이고, 두 번째는 SVM을 구현한 것입니다.


Fig 3. Technical indicator 모듈 Interface

  SVM 모듈은 Sequential Minimal Optimization(SMO) 알고리즘을 사용하도록 작성했는데,  SVM 또는 SMO와 관련된 구체적인 내용들을 이번 글에서는 언급하지 않도록 하겠습니다.


Fig 4. SMO 모듈 Interface


  테스트 데이터는 2009년 1월 12일부터 2013년 1월 9일까지 총 1,000개의 일별 KOSPI 지수 를 사용하였으며, 이 중 800개를 training에, 나머지 200개를 예측(검증)에 사용했습니다.


▶ 테스트 결과

  테스트 결과에 대한 검증은 실제 주가의 상승 또는 하락 여부와 training된 SVM의 output 값을 비교하는 것으로 했습니다. 즉, SVM의 output이 (+)이면 상승, (-)이면 하락이라고 가정한 후 일치하는지의 여부를 비교한 것입니다.
  
  5-34 MACD(OSCP)와 CCI, Stochastic(%K, %D, Slow %D), RSI, ROC, OBV 지표를 사용했을 때, 총 200일에 대한 Hit ratio는 47%였습니다.
  

Fig 5. 테스트 결과 1
  
  지표의 개수를 줄여서 MACD와 CCI, RSI, Williams' %R, A/D만을 사용했을 때에는 48%의 결과를 얻을 수 있었습니다.
  

Fig 6. 테스트 결과 2
  
  MACD 지표 대신 5일 및 10일 Disparity 지표를 사용한 결과는 비슷한 결과치를 보였습니다.
  

Fig 7. 테스트 결과 3
  
  Training 데이터를 800에서 900 개로 늘리고, 나머지 100개의 데이터에 대해 검증을 해보니 다음과 같은 결과가 나왔습니다.
  

Fig 8. 테스트 결과 4
  
  
  위 결과들로 판단을 한다면, 몇몇 기술적 지표만을 활용한 SVM 모델은 Random Walk와 비교해 별 차이가 나지 않는다고 말할 수 있을 듯 합니다.