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 티스토리 가입하기!
'symbol'에 해당되는 글 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% 를 내부로직 기능 추가에 할애하기보다 '돈'을 벌 수 있는 로직을 공부하는 시간을 절반가량 할애할 생각이다. 추가해야할 함수도 많기에 앞으로의 포스팅은 추가된 함수 및 전략을 중심으로 진행하되 간간히 내부로직 기능 추가를 포스팅할 생각이다.

2012. 7. 16. 10:57

그간 회사에서 일하다가 몇 번 개발 진도 보고를 시도해 보았는데 팀장님 눈치에 번번히 실패했다.

오늘은 팀장님이 오전반차라 조금 여유를 가지고 개발 진도 보고를 써보겠다.


직전 3월에 쓴 개발일정은 뒤로 하고 현재 생각나는 수정사항을 적어보면,


1. 데이터 타입을 새롭게 리뉴얼 했다. 데이터 타입 종류는 

    NumericSimple (input용)

    NumericSeries (variable용)

    NumericFunction (함수용)

와 같이 구성하였다. 전략 코드에서는 float 나 int 타입의 데이터 대신에 모두 NumericSimple 이나, NumericSeries 를 써야한다. 이렇게 구성하면 비용은 아~주 조금 더 들지 모르겠지만 함수 클래스 구현이나 전략 코드 상에서 계산 수행 시, 복잡하지 않고 좋다.


2. 간편한 함수 클래스 추가 :

모든 데이터를 NumericSimple, NumericSeries 로 관리하다보니 함수 추가가 아주 쉬워졌다. 프레임을 한 번 만들고 나니 왠만한 TS 에서 구현된 함수는 뚝딱 만들어 낸다. 그래서 굳이 시간날 때마다 함수 클래스를 열심히 만들 필요 없이, 필요할 때마다 만들어 내면 되겠다.


3. 전략 결과의 정확성 증대 :

처음에는 전략을 추가할 때마다 두려웠따. 왜냐? 트레이드스테이션의 결과와 불일치 하는일이 비일비재 했기 떄문이다. 그렇게 버그를 점점 수정해 나가고 현재 17개의 전략의 결과가 같아지기까지 꽤 정확도가 높아졌다. 억지로 말도안되는 주문들을 내봐도 결과가 같아지는 걸 보면 참 뿌듯하다.

얼마전에 일어난 하나의 에피소드를 얘기 해보겠다. 결과값이 -530 만원이 나와야 하는데 -590 만원으로 나왔다. TS 에서 찍어본 주문 가격들은 다 일치했다. 이렇게 되면 내부 주문 알고리즘이 잘봇 코딩되었다는 얘기가 되므로 안을 들여다봤다. 대략 3개월 만인가...? 너무 오랜만에 보는 코드들이라 한참을 들여다 보는 일이 생겨버렸다. 내가 짠 코드임에도 불구하고....  이건 능숙한 개발자들, 아니 인간이라면 누구나 쉽게 경험하는 일이다. 그래서 주석의 중요성은 몇 번 강조해도 지나치지 않은가 보다. 다행히 나의 한계를 인정하고 열심히 주석처리를 해온 덕분에 디버깅은 그리 오래 걸리지 않았다. 원인은 long 처리 코드와 short 처리 코드 작성시 copy & paste 를 하는 도중에 미처 수정하지 못한 탓이었지만;; 

결론은 현재 왠만한 전략은 같은 결과를 내어줘 신뢰성이 꽤 높은 상태에 다다랐다는 점.


4. 복수 심볼 사용 가능 :

이건 이틀 전에 추가한 기능이다. Close, CloseOfData2, CloseOfData3 와 같이 심볼을 추가하면 다른 심볼도 전략에서 참고할 수 있게 되었다. 프로그램 수행 시, 데이터만 로딩되어 있다면 매크로 한 줄로 전략에 심볼을 추가하는게 가능하다. 아직 완성되지 못한게 두 가지 있다면, 함수 자체에 다른 심볼 적용 (Average( Close, 3) of Data2 와 같이 ) 의 인터페이스를 아직 못정했고, PercentR( 30 ) of Data2 로 사용 할 경우 함수 내부에서 두 번째 심볼에 대한 정보에 접근해야 하는데, 이 알고리즘도 아직 결정을 못하였다. 이것들을 결정하려면 몇 가지 정보가 수집되어야 한다. 앞으로 구현할 전략들 중에 심볼을 가장 많이 추가할 전략은 몇 개의 심볼을 사용하는지.. 많이 사용한다면 심볼 번호를 인자로 받을 것이고 기껏해야 2,3개의 심볼이라면 일일히 AverageOfData2 와 같이 함수를 늘려갈 것이기 떄문이다. 





앞으로 추가될 기능들 (될 수 있으면 7월 안에)


1. 위 4 번의 심볼 작업 마무리

2. 타임프레임 조절 기능

3. 주문 제한 기능 (현재는 피라미드식 주문으로 주문에 제한이 전혀 없음. 예를 들어 현재 long 포지션이면 long 주문 불가)

4. 프로그램 구동 시, 데이터 파일 이름, 데이터 파일 위치 등 데이터 관련된 클래스를 만들어 관리 가능하도록


이상이다. 

prev"" #1 next