BLOG main image
ddd (50)
CUDA programming (0)
알고리즘 트레이딩 (5)
Cherry Picker 개발 (23)
TSimulator 개발(종료) (11)
IT 노트 (1)
잡동사니 (2)
사진 (4)
일기 (4)
이력서 (0)
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
'멀티심볼'에 해당되는 글 3건
2013. 6. 17. 22:55

현재까지 구현이 완료된 내용을 크게 요약하면 다음과 같다.


1. 하나 또는 두 개 이상의 분봉 심볼을 이용한 전략 수행 가능.

2. 전략 수행모드는 두 가지( REAL, TEST )로 나뉜다.

    REAL 모드 : API (또는 csv 파일)에서 받은 틱데이터를 실시간으로 봉으로 만들며 전략을 수행한다.

                      TS 를 HTS 와 연동해 실제러 거래할 때를 생각하면 된다.

    TEST 모드 : csv 파일에서 추출한 데이터를 봉으로 만들어 미리 메모리에 올려놓고 전략을 수행한다.

                      TS 의 백테스트를 생각하면 되는데, REAL 모드보다 속도가 우월하다.

3. 전략 수행에 있어 신뢰성(TS 결과와의 일치성)을 높이기 위해 다음을 수행했다.

    * TS 전략 코드를 담은 '인베스트라', 'building winning trading systems with tradestation' 에 소개된

      모든 전략을 포함한 총 59 개의 전략을 TS 로 수행했고 매 봉마다 모든 변수값 및 reserved word 를

      로그로 남겼다.

    * 위와 같이 로그로 남긴 방대한 양의 데이터는 CherryPicker 에서 마찬가지로 59 개의 전략을 수행하며

      기록한 로그와 비교한다. 출력 템플릿은 두 프로그램에서 동일하게 구현했으므로 두 결과가 완벽하게

      일치해야만 신뢰성을 보장받을 수 있게된다.

    * 백테스트에 사용된 데이터는 코스피 200 선물 5년분이며

        * 하나의 심볼만 사용하는 전략은 1, 3, 5 분봉으로 각각 수행했다.

        * 두 개의 심볼을 사용하는 전략은 첫 번째 심볼은 1 분봉, 두 번째는 2 분봉으로 수행했다.

        * 세 개의 심볼을 사용하는 전략은 첫 번째 심볼은 1 분봉, 두 번째는 2 분봉, 세 번째는 3 분봉을 사용했다

        * 멀티심볼 수행시 각 심볼 데이터의 신뢰성 확보를 위해 2 개 그리고 3 개의 심볼을 사용하는 전략을

          만들고 각각의 심볼은 1, 2, 3, 5, 7, 10, 20, 30, 50 100 분봉에서 모든 경우의 수를 대입하여 수행했다.

        * 구현한 함수값의 신뢰성을 높이기 위해 매 분마다 모든 TS 함수만 수행하는 전략을 만들었다.

    * 위에 언급된 내용 이외에도 버그(로그 결과 불일치)가 발생하고 버그가 수정되면 그 즉시 테스트 케이스로

       재연시켜 다시는 같은 문제가 발생하지 않게 했다. 그리고 기능 추가 및 버그 수정시마다 전 테스트를 다시

       수행하여 다른 부분에 미치는 영향은 없는지도 체크한다.

    * 2013년 6월 17일 현재 상기 테스트는 모두 통과된 상태이며 전략 수행 로직의 완성도는 높다고 볼 수 있다.


이상이 현재까지의 CherryPicker 에 대한 설명이며 앞으로 약 한 달동안 추가할 기능은 다음과 같다.


1. tick bar 의 생성

    : tick bar 를 이용하면 intraday bar 또는 daily bar 에 비해 다이나믹한 전략 구현이 가능하다. TS 와

      마찬가지로 tick count 를 기준으로 tick bar 를 만들 수 있게 할 것이다. 기존 분봉 생성 로직을 아주

      조금만 손보면 구현이 가능하다.

2. 직전 봉에서 접수된 주문을 실시간로 체결하는 기능 추가

    : 현재는 하나의 봉이 완성되면 직전 봉에서 접수한 주문을 봉 가정에 따라 체결시키는, 즉 실제 거래에서는

      사용하지 않고 백테스트시에 사용되는 체결로직만이 존재한다. 하지만 실제 거래에서는 봉 가정은 필요없고

      직전 봉에서 접수된 주문들은 실시간 틱데이터로 만들어지는 봉에 의해 체결된다. 아무리 봉 가정이 실제와

      비슷하다고 해도 틱데이터 움직임보다 정확할 수는 없으며 이는 백테스트 결과가 부정확한 이유이기도

      하다. REAL 모드에서 정확한 주문 체결을 위해 실시간 틱데이터를 이용한 체결로직을 구현한다.

3. 두 개 이상의 tick bar 또는 tick bar 와 분봉을 한 전략에서 동시에 사용하는 기능 추가

    : TS 에서 char window 에 tick chart 를 생성했다면 더 이상의 심볼을 추가하는 것은 불가능하다. 이 기능을

      추가함으로서 비로소 본 프로젝트를 시작한 보람을 느끼게 될 것 같다. 우선적으로 구현하고 싶은 조합은

      다음과 같다.

      a. 심볼 1 : tick bar, 심볼 2 : tick bar

      b. 심볼 1 : tick bar, 심볼 2 : 1 분봉

      전략 루프는 a 의 경우 심볼 1, 2 중 어느것이 와도 수행될 것이며 매 루프에서 발생하는 모든 주문은

      유효하다. 그리고 전략변수의 값도 main symbol 여부와 관계없이 유지될 것이다.

      b 의 경우도 a 의 경우와 같은 로직을 탈 것이다. 허나 추후 필요에 의해 1 분봉이 갱신될 떄 수행되는

      전략 루프에서 생성된 주문 및 수정된 변수는 유효하지 않거나 유지되지 않게 할 수 있다.


위 기능들이 추가되면 이제 실제 거래를 해보는 단계에 나아갈 것이다. 정리해보면


1. API 에서 받아온 틱데이터를 REAL 모드 전략에 전송

2. tick 멀티심볼을 이용한 간단한 HFT 전략 수행 및 검증

3. 분봉 안에 틱데이터 정보를 넣어 봉가정 없이 정확한 분봉 백테스트가 가능하게 함


위  세 과정이 끝나면 당분간은 전략 개발에 전념할 생각이다.

2013. 5. 25. 08:41

멀티심볼 데이터를 TS 함수에서 사용할 때 주의할 점이 있다. build-in 함수를 포함하여 user-defined 함수를 만들때도 반드시 참고해야하는 사항이다. 결론부터 말하면


1. 함수 인자에 두 번째 심볼 데이터(ex. close data2)를 직접 넣으면 함수 내부적으로 사용되는 심볼 데이터는 모두 두 번째 심볼 데이터를 사용한다.

2. 함수 인자에는 두 번째 심볼 데이터, 함수 내부에서는 첫 번째 심볼 데이터가 사용되길 바란다면 두 가지 해결방법이 있다. 

    a. 별도 변수에 두 번째 심볼데이터를 대입한 후 그 변수를 함수 인자로 사용한다.

    b. 인자로 바로 두 번쨰 심볼데이터를 사용하고 function( ... ) data1 과 같이 사용한다.



이제 위에 언급한 내용들을 좀 더 자세히 설명하겠다.

예를 들어 다음 과 같은 인터페이스를 가진 함수가 존재한다고 하자.


testFunction( NumericSimple aNum );


그리고 이 함수 내부에서는 다음과 같이 심볼 데이터인 close 를 사용한다고 가정하자.


input: aNum


testFunction = close * aNum;


인자로 넘어온 aNum 이라는 변수에 종가를 곱하여 리턴해주는 단순한 함수이다. 그럼 다음과 같은 사용을 해보면 어떤 결과가 나올까? ( close 는 200, close data2 는 300 이라 가정)


Value1 = testFunction( 10 ); 


Value1 에 리턴된 값은 함수 내부계산이 10 * 200 이므로 2000 이 될것이다.


Value1 = testFunction( close );


이번엔 close * close 가 계산되어 40000 이 리턴될 것이다. 그렇다면 다음은 어떨까?


Value1 = testFunction( close data2 );


직관적으로는 300 * 200 으로 60000 이 되야하지만 실제 계산은 300 * 300 이 되어 90000 이 리턴된다.

이를 의도한대로 계산되어지게 하려면 다음과 같은 방법을 사용해야한다.


== 첫 번째 방법 ==

Value99 = close data2;

Vallue1 = testFunction( Value99 );


== 두 번째 방법 ==

Value1 = testFunction( close data2 ) data1; 


첫 번째 방법에서 사용된 Value99 는 심볼 데이터가 아니므로 함수 내부에서 사용되는 심볼 데이터는 default 인 첫 번째 심볼을 사용한다. 

두 번째 방법에서 함수 뒤에 사용된 심볼 데이터 번호(여기서는 data1)는 은 원래 함수에 사용된 인자들이 심볼 데이터인 경우, 인자들을 모두 해당 심볼 데이터 번호로 바꾸고 함수 내부에 사용된 심볼들도 마찬가지로 해당 심볼 데이터 번호로 바꾸는 기능을 한다. 하지만 이렇게 심볼 데이터 번호가 바뀌는 대상은 default 심볼 데이터를 사용한 경우이고 특정 심볼 데이터 번호가 붙어있는 심볼 데이터(ex close data2) 는 다른 심볼 데이터로 변경되지 않는다. 그러므로 두 번째 방법의 경우 인자는 다른 심볼로 변환되지 않고, 함수 내부 심볼만 변경되어 의도한 값을 얻어낼 수 있는것이다.

2013. 5. 19. 08:19

거의 반년만의 포스팅같다.


먼저 간략하게 추가된 사항을 나열하겠다.


==============================================

추가된 사항

==============================================


1. 주문입력값이 호가와 일치하지 않는 경우, (예를 들어 KOSPI200 선물은 200.22 일 때) 내부적으로 가격 조정을 하는데 이 알고리즘을 테스트 후 적용했다.


2. 멀티심볼을 적용하는데 있어 생기는 문제점들을 해결했다. 각 심볼들이 MaxBarsBack 을 채우고나서 CurrentBar 및 BarNumber 가 1로 시작을 하게되는데, 기존 가정이 틀린 부분이 있어 수정 및 테스트 완료했다.

그리고 TS 8.7 버전에서 BarNumber 증가에 관한 버그를 발견한것 같은데, 멀티심볼의 경우 두 번째 이후의 심볼은 경우에 따라 CurrentBar 와 BarNumber[0] 가 일치하지 않는다. 이런 버그까지 CherryPicker 에서 재현되도록 적용할 필요는 없을것 같다.


3. 멀티심볼을 구성하는 경우 다음 두 규칙을 따르게 했다.


(1) 거래 대상 심볼은 가장 작은 time interval 을 가지고 있어야한다.

    : 내부적으로 최소 time interval 을 가진 봉이 완성되면 주문 및 체결이 이루어지는 구조다.

(2) 큰 time interval 의 심볼의 time interval 은 작은 time interval 의 심볼의 time interval 의 배수가 되는걸 추천.

    : time interval 이 1 과 3 인 전략은 3이 1의 배수이므로 3분 봉이 완성될 때 언제나 1분봉도 같이 완성되어

      (1) 규칙을 언제나 만족시킨다. 하지만 time interval 이 3 과 5 의 심볼을 가진 전략은 5, 10, 15, 20 분에도 

      전략은 루프를 돌지만 5, 10, 20 분에는 주문 및 체결조건을 만족해도 주문 및 체결이 이루어지지 않는다.


* 위 추가된 사항 '3' 에서 설명한 '루프를 돌지만 주문 및 체결이 되지않는 상황' 에서의 로직은 단순하다. 최소 time interval 심볼이 봉을 완성되지 않은 상태에서 다른 time interval 을 가진 심볼이 봉을 완성하면 해당 상황을 만족시키게 되는데, 이 때 발생하는 주문은 그냥 무시하고, 이전에 주문한 조건이 수행되지 않게끔 한다. 그리고 해당 루프를 돌 때 전략 변수들을 조작할 수도 있는데 값 변경은 실제로 이루어지게 설계하되, 다음에 최소 time interval 을 가진 심볼이 봉을 완성하면 변경된 값을 undo 처리하여 복원한다.


4. session 이 끝나는 시간을 심볼의 time interval 크기에 따라 조절할 필요가 있다. 1, 3, 6, 30 분 심볼을 예로 들어보자. 선물 동시호가가 시작되면,


* 1 분 심볼의 경우 15:00, 15:01, 15:02, 15:03, 15:04, 15:05, 15:15 에 봉이 완성

* 3 분 심볼의 경우 15:00, 15:03, 15:06, 15:15 에 봉이 완성

* 6 분 심볼의 경우 15:00, 15:06, 15:18 에 봉이 완성

* 30 분 심볼의 경우 15:00, 15:30 에 봉이 완성


위와 같이 봉이 완성이 되는데, TS 에서 session end time 을 15:20 으로 설정을 하면 1, 3, 6 분 심볼의 경우 영향이 없지만 30분 심볼의 경우 마지막 봉이 15:30 이 아니는 15:20 으로 되어 정확한 봉 완성 시각이 설정되지 않는다. 그러므로 큰 time interval 을 사용할 경우 session end time 을 그에 따라 적절하게 늘릴 필요가 있다.




이상이다. 10 년 이상의 데이터를 이용하여 TS 에서 print로 찍어낸 로그와 일치시키는데 지금까지 가장 많은 시간이 걸렸다. 멀티심볼 적용도 테스트가 끝난 현 상황에서 필자에게 할당된 시간의 100% 를 내부로직 기능 추가에 할애하기보다 '돈'을 벌 수 있는 로직을 공부하는 시간을 절반가량 할애할 생각이다. 추가해야할 함수도 많기에 앞으로의 포스팅은 추가된 함수 및 전략을 중심으로 진행하되 간간히 내부로직 기능 추가를 포스팅할 생각이다.

prev"" #1 next