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 티스토리 가입하기!
'TradeStation'에 해당되는 글 22건
2018. 1. 10. 09:44

2014년 4월부터 제도권에서 트레이딩을 한지 5년이 다돼간다. 최근에는 벗어났지만 그 동안 박스권에 갇혀있던 어려운 시장에서도 마이너스 분기실적 없이 잘 견뎌냈다.


현재 사용중인 CherryPicker 는 최초에 개발했던 방향과는 많이 달라졌다(좋은쪽으로). 역시 첫 설계에서 생각했던거와 사용하면서 필요해지는 부분의 차이는 작지 않았다. 아마 이런 툴개발 경험이 없어서인거 같다. 이제는 나뿐만이 아닌 회사 동료분들의 전략 자동화에도 협조하고 있고 그 분들의 요구사항을 반영하면서 기능이 더욱 늘어났다. 특히 수동개입쪽 기능이 많이 추가됐다. 기존의 나는 수동개입은 불허하는 입장이지만 특수한 상황에서는 필요할것 같아 적극 반영을 했다.


사실 트레이딩툴 기본기능은 3년전에 거의 완성됐고 그 이후부터 최근까지는 거의 백테스트에 올인했다고 봐도 좋다. 그 중 분석하기 편하게 GUI 툴 개발과 병렬화에 집중했다. 그래서 테스트 결과를 비쥬얼하게 보여주는 Efreet 가 탄생했고, Efreet 는 결과 분석외에도 테스트 스크립트 기능도 있어서 테스트 설정 및 스케줄이 기록된 스크립트 파일을 읽어서 전략의 백테스트를 진행한다. Efreet 의 백테스트는 복수의 CPU 에 테스트 분량을 분산해서 병렬로 진행하는 기능도 있다. CPU 개수에 따라 테스트에 걸리는 시간이 대폭 줄어든다. 마지막으로 Efreet 의 중요한 기능은 백테스트에서 도출된 경우의수에서 가장 이상적인 경우의수 및 그것들의 조합을 추출하는것이다.. 이 작업 또한 백테스트만큼의 오랜 시간이 소요되는데 역시 CPU 병렬처리를 이용해서 그 시간을 단축시킬 수 있다.


CPU 병렬화는 시뮬레이션의 시간을 단축시켜준다. 위 문단에서 설명한것처럼 CPU개수분의 1의 수준으로 단축된다. 그래도 4코어 CPU 로 많으면 1주일이상의 시간이 소요되는 테스트를 3, 4일로 줄여줄 뿐이다. 물론 이것만으로도 엄청나지만 그래도 목이 마른 법. 며칠이 아닌 1,2 시간 내로 끝내고 싶었다. 언젠가는 계획하고 있지만 당장은 20코어 4프로레서보드 같은 서버를 장만할 수도 없다. 가격도 가격이거니와 최근에 터진 인텔 CPU 보안패치문제 때문에라도 지금은 별 계획이 없다. 그래서 주목하게 된것이 GPU 다.


CPU 보다 훨씬 많은 작은 코어들을 가지고 있는 GPU 의 병렬연산은 알파고의 등장하면서 주목받기 시작했다고 봐도 과언이 아니다. 그래서 나는 약 2년 전부터 이전 증권사에서 연을 맺게 된 분과 CUDA(NVIDIA 에서 개발한 GPU 병렬연산을 쉽게 해주는 언어시스템) 스터디를 시작했다.(현재는 CUDA 스터디를 어느정도 마치고 딥러닝 스터디로 전환) 이 CUDA 가 얼마나 Efreet 의 시뮬레이션 성능을 높혀줄지는 모르겠지만 알파고에서 대량으로 GPU가 운용되는것을 보면 가능성이 있어보인다. 그래서 당분간은 CUDA 프로그래밍에 집중해보려고 한다. 카테고리를 추가해서 관리하고자 한다.


추가로 예전에 올렸다가 지운 CherryPicker 엔진을 사용한 Gaia 의 스냅샷과 Efreet 의 백테스트 결과 분석화면을 올려본다.




Gaia(트레이딩툴) 운용화면






Efreet 백테스트 결과 분석화면(개인적인 부분은 책으로 가림)



2014. 1. 4. 16:05

옵션을 매매는 기초자산의 방향성보다는 기초자산의 변동성을 매매한다는 표현이 더 어울린다. 그래서 옵션을 매매하는 사람들은 기초자산의 변동성 예측에 많은 신경을 쓰게된다. 그러므로 현재 기초자산의 변동성이 어느정도 수준인지를 아는것 또한 매우 중요하다.

변동성은 높아지거나 낮아져도 평균수준으로 회귀하는 특성이 있는데, 현재 변동성이 역사적으로 최대값이나 최소값에 접근한 상태라면 평균으로 회귀할 가능성이 상당히 높다. 특정 변동성의 수준을 쉽게 알기위해 잔존만기에 따른 역사적 변동성의 최대값과 최소값을 나타내는 지표 중 하나가 변동성콘(Volatility Cone)이다.

다음 그림은 변동성콘의 예시이다. 어디서 퍼오면 저작권에 위반될것 같아 직접 그려봤다....






만약 잔존만기가 5 일이고 기초자산인 지수의 현재 변동성이 23% 라면 변동성콘의 상단 경계부분인 25% 에 근접했으므로 옵션 매수보다는 매도전략이 유리함을 알 수 있다.


만약 어떤 변수가 변동성같이 시간이 지남에 따라 회귀현상이 관측된다면 이런 Cone 차트를 적용시킬 수 있을것이다. 이 아이디어에 기초해서 만들어 본것이 총호가순건수콘과 총호가순잔량콘이다. 총호가순건수란 매수호가총건수에서 매도호가총건수를 차감한 값이고, 총호가순잔량이란 매수호가총잔량에서 매도호가총잔량을 차감한 값이다. 두 값 모두 다음과 같이 HTS 호가창에서 관찰이 가능하다.





위 화면의 최하단에 다섯 개의 숫자가 일렬로 보이는데 왼쪽부터 순서대로 각각 다음을 의미한다.


==================== HTS 호가관련 정보 설명 ====================

총매도호가건수 : 1,172

총매도호가잔량 : 5,915

총호가순잔량    : -2,154 (총매수호가잔량(5,915) - 총매도호가잔량(3,761))

총매수호가잔량 : 3,761

총매수호가건수 : 670

P.S. : 총호가순건수는 계산되어있지 않지만 총매수호가건수(670)에서 총매도호가건수(1,172)를 뺀 -502 임을 알 수 있다.

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


총호가순건수(과 총호가순잔량)는 다음과 같이 시간이 지남에 따라 0 으로 회귀하므로 cone 으로 만들어 전략에 참고할 의미가 있다. (있을지도 모른다고 믿고싶다...-_-)





본인이 만들어본 총호가순건수콘과 총호가순잔량콘이 변동성콘과 다른점이 있다면 가로축이 잔존만기가 아닌 시각이다. 측정을 위해 수집된 데이터 정보는 다음과 같다.


=============== 총호가순건수콘, 총호가순잔량콘 정보 설명 ===============

계측기간    : 2009/01/01 ~ 2013/09/30

수집데이터 : 9, 10, 11, 12, 13, 14 시 정각의 총호가순건수값, 총호가순잔략값 (KOSPI200 선물 최근월물)

계산값       : 각 시각의 총호가순건수값, 총호가순잔량값의 최대값, 최소값, 평균값

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


Cone 구성에 필요한 정보를 추출하는 코드는 대략 다음과 같다.




위에서 구한 값들로 cone 정보를 구하면 다음 표와 같다.





이를 보기좋게 그림으로 표현하면 다음과 같다.



총호가순건수 cone


총호가순잔량 cone



위의 그림과 같이 두 개의 cone 은 현재 호가건수와 호가잔량이 어느정도 수준인지 가늠할 수 있게 도와준다.



이번에는 구해놓은 두 개의 Cone 을 활용하여 간단한 전략을 테스트해보겠다. 이렇게 분석 후에 전략에 실제로 적용해보는 순간이 가장 두려운(?) 순간이다. 의미가 없다면 의미가 없다는것을 알았다는 점이 나름대로의 수확이라 말할 수 있지만 가설이 무의미하다는것을 아는 순간은 썩 기분이 좋은것은 아니기 떄문이다. 그렇다. 전략테스트가 완료되고 난 후에 이 글을 쓰고있는 것이고 가설이 무의미한 것이 입증됐기 떄문이다. 하지만 반대로 의외의 수확도 있었다. 먼저 전략의 로직부터 설명하겠다.


9시부터 14시까지 매정시의 최대값 및 최소값은 각각 유의한 차이를 보인다. 그러므로 전략에 응용할 때는 매정시마다 다른기준을 가지고 시그널을 발생시켜야 한다. 9시의 경우만 예를 들어보겠다. (참고로 이 전략에서는 호가건수만 이용한다.)


2009년 1월 2일부터 2013년 9월 30일까지 매일 9시 정각에 기록한 총호가순건수는 1159 개이다. 이 데이터들을 가지고 히스토그램을 만들어보면 다음과 같다.





가로축이 총호가순건수의 범위들이고 세로축은 그 범위 내에 포함된 건수들이다. 범위는 엑셀에서 자체적으로 지정한 것이므로 좀 지저분하게 표현됐다. 총호가순건수 최대값과 최소값은 각각 이 그래프의 최우측과 최좌측의 값 두 개의 값과 동일하다. 만약 이 두개의 값만을 이용한다면 4년 가까이 딱 두 번의 거래만 발생할 것이다. outlier 들을 제거해서 좀 더 현실적인 boundary 를 만들어야한다. 이벤트 발생이 10회 이하인 범위를 제거하면 boundary 는 다음과 같이 변경된다.


최대값 : 1408 -> 816

최소값 : -1381 -> -873


boundary 넓이가 무려 절반에 가깝게 줄어들었다. 이를 기초로 다음과 같이 전략로직을 세워봤다.


==================== 전략 로직 ====================

로직 :

총호가순건수가 boundary 에 접근하면 평균으로 회귀하려는 성향이 강하다. 총호가순건수의 움직임은 가격움직임과 양의 상관관계가 있으므로 boundary 에 접근하려 할 때 반대방향으로 주문한다.


매도주문 : 9, 10, 11, 12, 13, 14 시에 총호가순건수가 upper boundary 에 도달하면 매도

매수주문 : 9, 10, 11, 12, 13, 14 시에 총호가순건수가 lower boundary 에 도달하면 매수

로직평가 : 진입 후 한 시간동안의 진입우위성으로 평가 (진입우위성에 대한 설명 및 검증 페이지 <- 클릭)

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



전략코드는 진입코드를 제외하고 진입우위성검증 페이지에 나와있는 코드와 동일하므로 여기서는 진입코드만 게시한다.





진입우위성 검증 결과는... 참담하다. 하지만 의외의 수확이 있다. 먼저 E-ratio 결과를 보자





E-ratio 가 1.0 이면 무작위, 1.0 보다 높으면 진입조건이 수익성이 있는것이고 1.0 보다 낮으면 진입조건이 수익성이 떨어진다는 의미다. 표를 보면 E-ratio 가 모든 시간대에 걸쳐 1.0 보다 높지 않은 수치들을 보이므로 이 전략은 수익성이 없는 전략이다. 하지만 1.0 보다 유의하게 낮은 경우는 얘기가 달라진다. 먼저 매도진입과 매수진입을 바꿔서 테스트해보면 다음 표와 같다. (위의 표의 값의 역수결과가 나올것이다.)




괜찮은 결과가 나왔다. 총 거래건수는 266 건, 승률은 57% 다. 승률은 절반에 가깝지만 수익성이 높다는것은 boundary 에 다다를 경우 추세발생시에 강한 추세를 가진다는것을 의미한다. 이 현상은 9시에 발생한 거래들을 살펴보면 더 확연해진다. 9시에 발생한 거래건수는 46건, 승률은 33% 다. 그럼에도 불구하고 가장 높은 수익성을 보인다는건 장 초반에 총호가순건수가 boundary 에 다다른 경우 총호가순건수의 평균으로의 회귀및 선물손실의 가능성은 크지만 추세가 발생할 경우 선물가격은 큰 수익성을 보인다는 의미로 해석된다. 



이 상황이 쉽게 이해되도록 그림을 그려봤다.

총호가순건수가 a 점에 다다르면 b 점인 선물가격은 작은확률로 크게 상승하고 높은확률로 적게 하락한다.







결론


현재 총호가순건수, 총호가순잔량이 역사적 최고점 또는 최저점에 다다르면 평균으로 회귀한다는 가정을 세우고 전략에 응용해 봤으나 유의한 수익성과는 얻지 못했다. 하지만 장 초반에 총호가순건수가 boundary 에 다다른 상태에서 선물가격에 추세가 발생할 경우에는 높은 수익성을 보였다.

2013. 12. 16. 13:36

2011 년 3월..  TradeStation 이 아닌 자기만의 트레이딩툴을 만들고 싶었던 그 때 증권 API 의 존재를 우연히 알게되고, 하루라도 빨리 화면으로 뭔가 표현해보고 싶은 마음에 급조한 프로그램이 있다. 시스템 트레이딩툴은 아니고 종목, 주문 수량,  주문 가격, 주문 타입 등을 선택하고 거래할 수 있는 수동매매툴이다. 지금은 모든 프로젝트가 Cherry Picker 라는 이름으로 통합됐고 더 이상 GUI 는 채용하고 있지 않지만 그 당시에는 TTrader 라는 이름을 지어줬었고, 허접하지만 아래 그림과 같이 GUI 로 정보를 표현할 수 있게 했다. 이 프로그램은 증권 API 테스트를 위해 급조된것에다가 시스템 전략의 수행도 불가능하므로 당연히 현재는 사용하지 않는다. 그래도 묻혀지는 것이 아쉬워 수행되는 모습을 남겨보고자 한다.



( 참고로 현재 운용중인 트레이딩 툴인 Cherry Picker 는 GUI 가 아닌 CUI 방식이며, 로그파일에 현 상황들이 실시간으로 기록이 된다. GUI 가 있으면 화려해보이고 프로그램다운 모습이지만 데이터를 보여주기 위해 필요한 리소스(CPU 등 컴퓨터 자원)가 결코 적지 않으며 무엇보다 시스템 전략은 전적으로 미리 코딩된 로직에 의해서만 운용되어야 함으로 GUI 에 의한 조작이 애초에 필요가 없기 때문이다. 시스템 트레이딩에 특화된 헤지펀드(특히 르네상스 테크놀로지)는 트레이딩룸 자체가 없고 오직 서버실과 전략개발을 위한 회의실, 그리고 개인 사무공간만 존재한다고 어디선가 읽은 기억이 있다. ) -> 이상 GUI 를 안만들어도 된다는 변명 ;;;



사진 2 장과 시연 동영상 1 개를 만들어봤다. 수행 프로그램 이름은 Cherry Picker 로 되어있는데, 이는 어느 시점에서 진행중인 모든 프로젝트 이름을 Cherry Picker 로 통합했기 때문이다. 



서버 접속 직전의 모습 (화면을 클릭하면 크게 볼 수 있습니다.)



첫 번째 사진은 프로그램이 증권사 서버에 접속하기 이전인 프로그램 수행 직후의 모습이다. 왼쪽 검은 화면은 각종 정보메세지를 출력하는 부분이고, 오른쪽 화면이 프로그램을 조작하거나 가격, 계좌정보, 잔고 등을 표현하는 GUI 부분이다.



서버 접속 후의 프로그램 수행중인 모습 (화면을 클릭하면 크게 볼 수 있습니다.)



두 번째 사진은 증권사 서버 접속 직후의 모습이다. 직관적으로 각 버튼 또는 창들이 의미하는바를 쉽게 알 수 있다.



증권사 서버 접속 후 간단한 거래를 하는 모습 (플레이 버튼을 누르면 재생됩니다.)



위 영상은 서버에 접속을 하고 간단한 선물거래를 하는 영상이다. 시계를 보면 9시 직전에 서버에 접속을 했으며 9시00분00초가 되자 수신되기 시작한 실시간 데이터들이 화면에 보여지며, 매수 또는 매도거래가 행해지고 계좌 및 잔고상태를 확인하는 버튼을 누르면 해당 정보가 갱신됨을 알 수 있다. 보다시피 시스템전략과는 무관한 프로그램이며 그냥 편한 수동거래툴(?) 정도로 인식하는것이 좋겠다.


다음 포스팅에서는 본격 시스템 트레이딩툴인 Cherry Picker 의 수행모습을 화면에 담아볼 것이다. (이미 이전 몇몇 포스팅에서 캡쳐사진을 올린바 있지만...) GUI 가 없기 때문에 뭔가 굉장히 단순해 보일지 모르겠지만 그 내부에서는 아주 나이스하게 시스템 전략들이 관리 및 운용되고 있다.

'Cherry Picker 개발 > Cherry Picker 소개' 카테고리의 다른 글

근황  (2) 2018.01.10
Cherry Picker 와 이 블로그에 대한 설명  (0) 2013.09.27
2013. 11. 30. 09:44

Cherry Picker 는 다음 세 가지 클래스로 알고리즘 트레이딩이 가능한 라이브러리다.



1. Symbol Manager class (TradeStation 의 Chart Window 에 해당)

2. Symbol class (TradeStation 의 Symbol 에 해당)

3. Strategy class (TradeStation 의 Strategy 에 해당)



Symbol 과 Strategy 를 Symbol Manager 에 등록하면 Symbol Manager 가 이들을 관리하기 시작하고, Symbol 에 시계열 데이터를 삽입하면 Strategy 에서 주문 시그널이 나오는 구조다. 이들을 활용할 수 있는 시나리오는 다음 세 가지다.



시나리오 1.

과거 시계열 데이터 파일을 읽어들여 Symbol 에 순차적으로 삽입시킨 후, Strategy 에서 주문 시그널이 발생하면 Strategy 내부에서 손익을 계산한다. 이렇게 함으로서 전략의 시뮬레이션이 가능하다.


시나리오 2.

증권 API 를 통해 읽어들인 실시간 데이터를 Symbol 에 삽입한 후, Strategy 에서 주문 시그널이 발생하면 Strategy 내부에서 손익을 계산한다. 이렇게 함으로서 전략의 실시간 시뮬레이션이 가능하다.


시나리오 3.

증권 API 를 통해 읽어들인 실시간 데이터를 Symbol 에 삽입한 후, Strategy 에서 주문 시그널이 발생하면 증권 API 를 통해 주문을 낸다. 이렇게 함으로서 전략의 실전 운용이 가능하다.



이 블로그를 개설한 이후 현재까지 시나리오 1 과 시나리오 2 를 가능하게 만들었다. 사실 시나리오 2 가 가능하면 시나리오 3 도 가능하다. 하지만 그 동안 버그수정과 로직 검증에 많은 시간이 들었고, 이것들이 해결이 되면 시나리오 3 을 구현하는게 순서라고 생각되어 이제서야 시나리오 3 구현을 완료했다. 시나리오 3 구현의 핵심은 서버와의 통신이다. 시나리오 2 는 증권사 서버로부터의 데이터 수신에만 신경쓰면 됐으므로 비교적 구현이 간단한 반면, 시나리오 3 은 주문, 잔고확인 등 증권사 서버로 데이터를 전송하는 로직까지 구현해야 하므로 이를 관리해주는 관리자 역할이 필요하다. 이는 바로 직전 포스팅인 '실시간을 다루다' 에서 간략하게 소개했다.


시나리오 3 에서 Strategy 주문 시그널이 나오면 API 를 통해 증권사에 주문요청을 해야하는데, 이에 필요한 정보와 이를 사용하기 위한 인터페이스 조작에 대해 간략하게 설명하겠다.



주문에 필요한 정보



주문 시그널이 발생하면 이트레이드 증권 API 에서 제공하는 IXingAPI 클래스의 Request 라는 함수를 호출하게된다. 함수 파라미터를 7 개를 넣어줘야 한다. 이 함수는 주문시 뿐만 아니라 API 에서 제공하는 정보(증권가격, 잔고조회, 계롸조회 등)를 조회하고 싶을 때 사용되는데 IXingAPI 클래스에서 사용빈도가 가장 높은 함수다.


parameter 1 : 주문 요청 후 증권사에서 보내는 답장을 받을 윈도우

parameter 2 : 요청항목(이 요청이 '주문'임을 구분해주기 위한 문자열)

parameter 3 : 주문 정보를 담은 패킷

parameter 4 : 주문 정보를 담은 패킷의 크기

parameter 5 : 연속으로 다음 데이터를 요청할지 여부 (주문시에는 필요없다.)

parameter 6 : 연속으로 다음 데이터 요청시 다음 데이터 시작위치 (역시 주문시에는 필요없다.)

parameter 7 : 주문 요청후 증권사 응답을 기다릴 시간


실질적으로 주문에 필요한 모든 정보는 parameter 3 에 해당한다. 이는 다음과 같다.


* 계좌정보

    1. 계좌번호

    2. 비밀번호


* 주문정보

    3. 선물옵션 종목번호

    4. 매수/매도 여부

    5. 주문타입(시장가, 지정가 등)

    6. 주문가격

    7. 주문수량


주문을 할 떄마다 이 정보들을 빠짐없이 규칙에 맞게 패킷에 기록해서 보내야한다. '계좌정보' 는 이미 확보된 정보고, '주문정보' 의 경우 주문신호가 나올 때 알 수 있는 정보다. Request 함수를 호출하고 나면 증권사에서 응답 메세지가 오는데 그 메세지 안에 포함된 패킷에는 증권사에서 거래소에 요청된 정보들이 담겨져 있고,(Request 수행시 입력된 정보들에 문제가 없다면 그 정보들 그대로 거래소에 요청된다.) 요청한 주문을 취소 또는 정정할 때 필요한 주문번호도 담겨져 온다.



주문 interface



Strategy 클래스에서 사용되는 주문함수들은 처음 구현시에 이미 interface 방식으로 만들어졌다. interface 방식이란 리모콘의 전원, 채널, 음향 등의 버튼들과 그 개념이 같다. 다양한 리모콘들은 버튼명칭은 같지만 내부적으로는 서로 다른 TV 를 호출한다. 이 개념을 주문함수에 적용시키면 주문 방식은 똑같아도 설정에 따라 함수 내부로직은 다르게 호출되어 A 증권사의 API 를 호출할 수도 있고, B 증권사의 API 를 호출할 수도 있다. 혹은 API 를 사용하지 않고 Strategy 클래스 내부에서 주문이 됐다고 가정하는 시뮬레이션 작업을 수행할 수도 있다. 이들 중 어떤것을 수행하게 할지를 결정하기 위해서는 프로그램 구동시에 gApi 라는 변수에 특정 값을 세팅해주면 된다.


gApi = DEFAULT_API    ->    프로그램 내부에서 주문 및 체결을 가정

gApi = ETRADE_API      ->    etrade 증권 API 를 통해 주문

gApi = WOORI_API        ->    우리증권 APi 를 통해 주문(예시)



사실 증권 API 호출 및 주문 인터페이스는 시나리오 1 작업 초기에 모두 구현이 됐었다. 이번 시나리오 3 에서는 증권 API 를 호출하는 함수들을 주문 인터페이스 함수 안에 연결시키는 작업을 진행한 것이고, 추가로 클라이언트로(Cherry Picker)로부터의 요청과 서버(이트레이드증권)로부터의 응답처리를 관리하는 로직을 심어놓은 것이다.


다음 화면은


1. Strategy 에서 주문 시그널 발생

2. 증권사에 주문 요청

3. 증권사에서 거래소로 주문 요청

4. 거래소에서 주문 접수

5. 거래소에서 주문 체결

6. 증권사에 잔고정보 조회 요청

7. 증권사로부터 잔고정보 수신


하는 과정을 보여준다. 각 요청이 있거나 수신이 발생할 때마다 로그파일에 기록 및 화면에 해당내용이 출력된다. 중간중간 봉 생성이 됐다는 메세지('>>>' 로 시작)와 접수된 주문이 모두 체결됐다는 메세지([1/1] - full closing), 그리고 주문을 관리하는 queue 정보도 보인다. 아이맥이라 빛반사가 심하다;;;










2013. 9. 27. 07:58

Cherry Picker 란?


정의 :

'증권 API 를 이용한 실시간 알고리즘 트레이딩' 및 '과거 틱데이터, 분데이터를 이용한 알고리즘 전략 시뮬레이션'을 수행하기 위해 개발된 라이브러리 (LIB 또는 DLL 형태)


이해하기 쉬운 정의 :

전략 아이디어만 몇 줄의 코드로 작성하면 나머지 모든 귀찮고 복잡한 처리들을 알아서 수행시켜주는 똘똘한 녀석. 여기서 말하는 '나머지' 일들이란...

(1) 증권사에 접속

(2) 전략에서 요구하는 어떠한 데이터든지 수량에 관계없이 실시간으로 자동연결

(3) 전략을 실시간으로 감시하다가 주문조건이 맞으면 자동으로 증권사에 주문

(4) 포지션 관리는 물론 복수의 전략을 포트폴리오로 단위로 묶어서 관리가 가능

(5) 실제 운용뿐 아니라 과거의 성과를 알아보기 위한 가상테스트가 가능

정도...


개발 시작 날짜 :

2011년 2월부터 현재까지


개발 언어 :

첫 반 년은 Java 로 개발하다가 그 후로 C++ 로 전환


기능(2013년 12월 12일 현재) :

* 데이터

    * 증권사 API 에서 제공하는 모든 실시간 정보 이용 가능 (알고리즘 트레이딩 카테고리의 '심볼리스트' 참조)

    * 과거데이터를 이용한 가상거래에서도 모든 데이터를 사용 가능

    * 전략에 사용되는 데이터 형태는 틱, 분, 시간, 일 등 모든 형태로 가공이 가능

* 함수

    * 모든 금융공학 관련 함수 이용 가능

    * 사용자 정의함수 추가 기능

    * 함수 내부에서 과거데이터 참조기능(average(close, 5) 형태)

    * 함수 내부에서 다른 함수의 재귀호출 가능

* 전략

    * 전략이란 전략에 사용되는 정보가 갱신될 때마다 수행되는 부분을 의미(TradeStation 과 동일한 형태)

    * 전략의 기본형태는 데이터 처리 -> 조건분석 -> 진입 or 청산

    * 같은 포트폴리오에 포함된 전략끼리는 포트폴리오 정보를 공유

    * 복수의, 다양한 형태(틱, 분 등)의 데이터를 하나의 전략에서 사용 가능

* 주문

    * 증권사 API 를 통해 복수의 종목을 동시에 주문 가능

    * 과거데이터를 이용한 가상거래시에는 프로그램 내부에서 주문 및 체결을 가정함

    * 포트폴리오 내부의 전략들의 주문이 상쇄되는 주문일 경우 무효처리되도록 감지

* 조회 및 전략 모니터링

    * CUI 형태로 전략 및 포트폴리오 상황 모니터링이 가능

    * CUI 형태로 체결, 미체결, 잔고, 손익결과 조회 가능


사용자 인터페이스 :

아래 5 개의 클래스가 사용자가 취급해야하는 클래스의 전부다.


Symbol : 이 클래스에 데이터를 등록한다.

Strategy : 이 클래스를 파생시킨 후 'run' 함수를 재정의 하면 재정의된 함수는 특정 타이밍마다 수행된다.

SymbolMgr : Symbol 과 Strategy 를 이 클래스에 등록시켜 관리한다.

TFile : 백테스트시 과거데이터 파일의 경로를 이 클래스에 세팅 후, Symbol 에 등록한다.

XingManager : 증권사와 데이터 통신을 담당한다.


블로그를 만든 이유


이 블로그는 제가 현재 개발하고 있는 Cherry Picker 라는 트레이딩 및 분석툴의 개발과정과 Cherry Picker 를 이용한 시장분석 및 트레이딩 성과 등을 포스팅하므로서 저와 같이 시스템 트레이딩 및 트레이딩툴 개발에 관심이 있는분들과 정보를 공유하는 목적을 가지고 있습니다.


블로그 메뉴 소개


* 알고리즘 트레이딩 -> Cherry Picker 를 이용한 알고리즘 트레이딩 및 분석 예제

    * 전략구현 프로세스 -> 빠른 전략 구현을 위한 전략구현 프레임(전략 구현 가이드)

    * 심볼 리스트 -> 현재 Cherry Picker 에서 전략 구현 시 사용 가능한 심볼 정보

    * (1) 알고리즘 트레이딩 전략 1

    * (2) 알고리즘 트레이딩 전략 2

    * (3) ...

* Cherry Picker 란? -> Cherry Picker 에 대한 설명

    * Cherry Picker 소개 -> Cherry Picker 및 블로그에 대한 소개

    * Cherry Picker 샘플 -> Cherry Picker 의 사용 예

* Cherry Picker 개발 -> Cherry Picker 개발 정보

    * 일정 -> Cherry Picker 의 개발 일정

    * 개발노트 -> Cherry Picker 개발에 관련된 내용

* TSimulator 개발 -> Cherry Picker 이전명칭으로 그에 대한 개발 정보 (업데이트 종료)

    * TSimulator 소개 -> TSimulator 에 대한 설명

    * 일정 -> TSimulator 의 개발 일정 (업데이트 종료)

    * 개발노트 -> TSimulator 개발에 관련된 내용 (업데이트 종료)

* 전략 시스템 성과 -> TradeStation 및 Cherry Picker 를 이용하여 테스트한 실제 운용전략 성과

    * 전략 pool -> 수익여부와 관계없이 백테스트한 모든 전략들의 특징과 성과를 모아뒀다.

    * 실거래를 위한 성과기준 -> 전략 pool 에서 실거래 가능한 전략을 추출하기 위한 성과기준

    * 실거래 전략 xxx -> 실거래를 위한 성과기준을 통과한 전략들의 상세 성과를 보고

    * 실거래 전략 포트폴리오 -> 실거래 전략들로 구성된 포트폴리오의 성과

* 일기 -> 가끔 생각하는 이야기들

* 잡동사니 -> 개인적인 관심사

    * 기타 -> 기타정보

2013. 9. 24. 08:10

Cherry Picker 에서 전략, 심볼, 심볼 매니저를 사용하는 방법은 다음과 같다.

각 과정의 설명과 함께 소스코드를 넣어봤다.


1. SymbolManager 객체 생성

2. SymbolManager 에 MaxBarsBack, 최초자본금, 결과파일저장경로 등을 세팅

3. Symbol 객체 생성 및 속성을 초기화

4. SymbolManager 에 Symbol 을 추가

5. Strategy 객체 생성

6. SymbolManager 에 Strategy 를 추가

=== 데이터 수신 대기상태 ===

7. 데이터를 수신하면 Symbol 에 업데이트

8. SymbolManager 의 메서드인 run 을 수행시키면 세팅된 Strategy 들이 한 번의 루프를 수행


소스코드는 대략 다음과 같다.


/* SymbolManager 객체 생성 및 세팅 */

SymbolManager sSymbolMgr;

sSymbolMgr.setResPath( "C:\res\..." );

sSymbolMgr.setResName( "File Name" );

sSymbolMgr.setMaxBarsBack( 500 );

sSymbolMgr.setBarsCnt4Loop( 50 );

sSymbolMgr.setInitialCapitlal( 10000000 );


/* Symbol 객체 생성 및 초기화 (Tick Symbol 두 개 생성)*/

Symbol sSymbolOne( KOSPI200_FUT, ETRADE, TICK, 1 );

Symbol sSymbolTwo( KOSPI200, ETRADE, TICK, 1 );


/* SymbolManager 에 Symbol 을 추가 */

sSymbolMgr.addSymbol( &sSymbolOne );

sSymbolMgr.addSymbol( &sSymbolTwo );


/* Strategy 객체 생성 */

TrendStrategy       sStrategyOne;

ArbitragteStrategy sStrategyTwo;


/* SymbolManager 에 Strategy 를 추가 */

sSymbolMgr.addStrategy( &sStrategyOne );

sSymbolMgr.addStrategy( &sStrategyTwo );


.

.

.


KOSPI200 선물 데이터 수신시 수행되는 CallBack 함수 (위에서 생성한 객체들은 클래스의 멤버변수라고 가정)

void CallBackFunction( ... )

{

    /* 수신된 가격 및 기타 정보를 세팅 */

    sSymbolOne.setPrice( 111 );

    sSymbolOne.setCVolume( 222 );

    .

    .

    .

    sSymbolOne.updateBar();


    /* Symbol 이 Bar 를 생성할 타이밍인지 체크 (분봉의 경우 Symbol 정보세팅 이전에 수행되어야 함)*/

    if( sSymbolOne.isBarOver() == true )

    {

        /* Tick 봉 생성 및 틱 count 초기화 */

        sSymbolOne.createBar();

        sSymbolOne.reset();


        /* Symbol 이 업데이트 됐으므로 전략 수행 (기타 처리들을 해줘야 하지만 여기선 간략화 했다) */

        sSymbolMgr.run();

    }

}



수도코드는 대략 위와 같다. 여기서 sSymbolMgr 객체에 추가된 전략들(sStrategyOne, sStrategyTwo)로 포트폴리오를 구성했다고 가정하고 통계값이 갱신될 때마다 sSymbolMgr 객체 내부에서는 포트폴리오 통계값을 파일에 기록한다. 현재 기록되고 있는 통계값은 다음과 같으며 얼마든지 필요에 의해 확장될 수 있다.


전략 포트폴리오 관련 통계값

* PfoNetProfit : 포트폴리오 총 순수익

* PfoGrossProfit : 포트폴리오 총 수익

* PfoGrossLoss : 포트폴리오 총 손실

* PfoInitialCapital : 포트폴리오 최초 자본금(고정)

* PfoCurrentCapital : 포트폴리오 자본금 잔고

* PfoMaxCapital : 포트폴리오 최고 자본금

* PfoDrawDown : 포트폴리오 DD

* PfoMaxDrawDown : 포트폴리오 MDD

* PfoPercentDrawDown : 포트폴리오 % DD

* PfoPercentMaxDrawDown : 포트폴리오 % MDD


위의 통계값들은 포트폴리오 관점 뿐만 아니라 개개 전략 관점에서도 각각 전략 객체들이 자신의 값을 가지고 있다. 


여기서 의문점이 들 수 있다. 서로 다른 SymbolManager 들의 전략들끼리 포트폴리오를 구성하고 싶을 때도 분명 있을 것이다. 아니 반드시 있다. 그럴 경우에는 다음 함수를 사용하면 된다.


double sPfoNetProdit;


sSymbolMgrOne.setPfoNetProfit( &sPfoNetProfit );

sSymbolMgrTwo.setPfoNetProfit( &sPfoNetPfofit );


위와 같이 통계값을 저장하고자 하는 변수를 생성하고 각 SymbolManager 에 세팅을 해주면 SymbolManager 들은 내부 변수가 아닌 외부 변수에 통계값을 저장하기 시작한다.


이상으로 전략 포트폴리오 개념 도입에 대한 개발노트를 마치겠다.

2013. 9. 23. 16:50

CherryPicker 가 기본 기능을 하기 시작함에 따라 시장분석 작업도 동시에 진행하고 있다. 시장 데이터를 분석하고 결론을 내는 작업에 푹 빠진 탓에 새로운 기능이 추가됐음에도 불구하고 포스팅을 게을리 해왔다... 밀린 일정보고를 하겠다.


이전 일정보고에서 완료되지 않은 목록 중 다음 두 가지가 있었다.


1. 멀티 틱 심볼 데이터를 이용한 HFT 전략 분석

2. 틱데이터와 분데이터를 결합한 멀티 심볼을 사용하는 전략 테스트


'Cherry Picker 시장분석' 카테고리에 '테스트 전략' 이라는 하위 카테고리를 만들었는데 위 두 가지를 그 카테고리에서 테스트할 예정이다. 이미 1 번은 '테스트 전략 - 1' 에서 테스트를 진행했다.


'테스트 전략' 카테고리는 최소 일주일에 한 번 이상 업데이트할 생각이다.


일정보고를 시작하겠다.


전략 포트폴리오 개념의 도입


Cherry Picker 에서는 Symbol Manager 에 Symbol 을 추가하고 Strategy 를 추가한다. Symbol Manager 가 TradeStation 의 Chart Window 와 같은 개념이고 Symbol, Strategy 는 TradeStation 과 명칭과 의미가 같다. 전략 포트폴리오는 아무런 설정이 없다면 Symbol Manager 에 포함된 Strategy 들이 그 구성원이 된다. 하지만 따로 성정을 해주면 서로 다른 Symbol Manager 의 Strategy 들끼리도 하나의 전략 포트폴리오로 엮을 수가 있다. 이렇게 전략 포트폴리오의 개념을 도입했고, Strategy 집단의 관리를 할 틀을 만들었다.


전략 포트폴리오의 통계값 기록 시작


개개의 전략의 성과는 당연하고 포트폴리오 단위의 성과를 파일로 기록하는 로직을 넣었다. '테스트 전략' 카테고리에 '테스트 전략 - 3' 에는 이를 활용한 분석이 있으니 참고하면 된다. 이로서 순수익 뿐만이 아니라 MDD 나 변동성 같은 성질들을 조합해서 포트폴리오를 만들 수 있게 되어 더 나은 종합 성과를 낼 기반이 마련됐다.


최근월물 선물 호가 정보를 기록하기 시작


현재 수신 및 기록하고 있는 데이터는


    a. KOSPI 200 지수 정보 (9시 1분부터 2초마다 수신)

    b. KOSPI 200 최근월물 선물 체결정보 (9시부터 체결이 발생할 때마다 수신)


인데, 굳이 '정보' 라고 표현한 이유는 증권사 API 에서 보내주는 데이터는 여러 정보들이 같이 딸려오기 때문이다. 예를 들어 KOSPI 200 최근월물 선물 체결정보에는 체결 가격 뿐만 아니라 수량, 매수 1호가, 매도 1호가, 전날대비 상승폭, 당일 시고저가 등 여러 체결관련 정보들이 포함돼서 온다. 이 정보들을 모두 기록하고 있다.

추가로 최근월물 선물 호가정보를 기록하기 시작했다. 이 정보는 매수 또는 매도 1~5 호가의 정보를 포함하며 호가 정보가 하나라도 바뀌면 바뀐 정보를 포함한 모든 정보가 통째로 수신된다. 체결정보의 몇 배의 양이 된다. 


2013년 9월 이내에 최근월물, 선물 뿐만이 아닌 KOSPI 200 지수를 기초자산으로 하는 모든 현존 파생상품의 데이터를 기록하기 시작할 것 같다.


옵션 전략을 위한 전략 프레임의 디자인 시작


현재 전략 프레임은 첫 번째 심볼이 거래대상이 되는 한 가지 상품을 사고파는 전략 프레임이다. 이는 TradeStation 과 동일하다. 선물 거래를 뛰어넘어 옵션 거래, 선물 + 옵션 거래도 가능한 프레임을 디자인해야한다. 인터페이스는 Buy/Sell 함수 인자에 종목코드를 추가로 집어넣는 방법으로 생각하고 있다. 


전략에 활용 가능한 Symbol 정보 카테고리 추가


현재 Cherry Picker 에서 사용 가능한 Symbol 정보를 게시하려고 한다. 현재는 KOSPI 200 지수, 최근월 선물 관련정보밖에 없지만 점차 확대해 나가고 10월 중으로 선물 옵션 관련 모든 정보를 추가할 것이고 올해 안으로 API 에서 얻을 수 있는 모든 정보를 추가할 예정이다.

'TSimulator 개발(종료) > 일정(종료)' 카테고리의 다른 글

TSimulator 일정 종료  (0) 2013.09.23
2013. 9. 19. 21:05

시스템 전략이 완성되면 성능을 알아보기위해 과거데이터를 이용한 백테스트를 수행한다. 트레이드 스테이션에서 백테스트를 수행하면 Performance Report 가 만들어지는데 다음과 같이 생겼다.





이런 화면 외에도 아주 많은 화면들을 통해서 백테스트된 전략의 성과를 여러 측면에서 평가할 수 있다.


여러 성과측정 도구들이 있지만 가장 먼저 눈에 들어오는건 Total Net Profit 이다. 시스템 전략의 제 1 의 목적이 수익을 발생시키는 것이기 때문이다. 이 외에도 중요한 성능지표로서 Percent Profitable, Profit Factor, 등 다른 여러 측정도구도 함께 참조한다. 그리고 다음과 같은 항목이 있다.





수익의 최근 고점에서부터의 손실폭 중 최대치(Max Draw Down... 줄여서 MDD)을 아주 중요하게 보는데, 쉽게 풀이하자면 이 전략에서 수익없이 손실이 나는 최대 금액이라고 얘기할 수 있다. 그 최대 손실액이 발생하기 시작하는 시점이 해당 전략을 이용한 시스템 트레이딩의 시작시점이 될 수도 있는데, 이 경우 투자자는 트레이딩을 시작하자마자 MDD 만큼의 손실을 입다는 말이된다. 당연히 최초자본금액이 MDD 보다 작다면 파산을 하게되므로 큰 MDD 는 트레이딩 내내 불안감을 떨칠 수 없으며 작은 MDD 는 비교적 여유를 가질 수 있는 심리적 요인이 된다. MDD 를 줄이려는 노력은 성공적인 전략을 개발하기 위해 반드시 필요하다.


이번 테스트에서는 복수의 전략으로 포트폴리오를 구성할 경우 각 전략들의 상관관계가 포트폴리오의 MDD 에 미치는 영향을 분석해본다.


실증분석에 앞서 간단하고 극단적인(?) 예를 들어 테스트 시나리오를 설명하겠다. '전략 a' 가 있고 최초자본금은 10 이고 다음과 같이 잔고의 변화가 있다고 가정한다.


 잔고

시간 1 

시간 2 

시간 3 

시간 4 

시간 5 

전략 a

10

11 (고점 갱신)

10


이 경우 DD(Draw Down) 값은 다음과 같이 변한다. (DD 공식 : 최근 최고 잔고에서 현재 잔고를 차감)


 Draw Down

 시간 1

시간 2 

시간 3 

시간 4 

시간 5 

 전략 a

0

0 (고점 갱신) 

3 (MDD)

1


위 두 표를 그래프로 보면 다음과 같다.




(X출 : 기간, Y축 : 잔고 및 DD)


시간 1 ~ 5 까지의 MDD 는 '3' 이다. 이 경우 잔고가 11 까지 상승한 후 MDD 가 발생하여 잔고가 8 까지 하락했지만 '시간 1' 에 MDD 가 발생했다면 잔고가 7 까지 하락하게된다.


이제 전략을 하나 더 추가하여 총 2 개의 전략으로 구성된 전략 포트폴리오를 만들 것이다. 추가할 후보전략 2 개는 다음과 같은 잔고흐름을 가진다.


잔고

시간 1 

시간 2 

시간 3 

시간 4 

시간 5 

전략 b 

10

8

11 (고점 갱신)

8

10

전략 c 

10 

11 (고점 갱신)

12 (고점 갱신) 

10


'전략 b' 는 '전략 a' 와 완전히 같은 움직임을 보인다. '전략 c' 는 완전히 반대의 움직임을 보인다. 상관관계 분석결과는 다음과 같다. (로그수익률의 상관관계)


상관계수 

전략 a

전략 b 

전략 c 

전략 a

1

 

 

전략 b 

1

1

 

전략 c 

-0.96

-0.96

1


포트폴리오 이론에 따르면 안정적인(표준편차가 낮은) 주식 포트폴리오를 구성하기 위해 기존 포트폴리오와의 상관계수가 높은, 즉 포트폴리오와 같은 움직임을 가진 주식 종목의 편입을 피하고 상관계수가 낮은 주식을 편입해야한다. 어느 시점의 수익률 부호가 반대라면 포트폴리오의 변동성이 커지는것을 막을 수 있기 때문이다.

마찬가지로 어떤 시스템 전략 포트폴리오가 낮은 수익률 상관관계를 가진 전략들로 이루어져있다고 가정하자. 어떤 시점에 한 전략이 손실을 입어 DD 가 발생하는 상황일 때 다른 전략은 수익을 내어 DD 발생을 억제시킬 수 있기때문에 결과적으로 각 전략의 MDD 의 합보다는 낮은 포트폴리오 MDD 를 기대할 수 있다. 전략 a, b 로 구성된 포트폴리오와 전략 a, c 로 구성된 포트폴리오의 잔고흐름과 MDD 는 다음과 같다.


포트폴리오 잔고 

시간 1 

시간 2 

시간 3 

시간 4 

시간 5 

전략 a + b

20

16

22

16

20

전략 a + c

20

19

19

20

20


포트폴리오 DD

시간 1 

시간 2 

시간 3 

시간 4 

시간 5 

전략 a + b

0

4

0

6 (MDD)

2

전략 a + c

0

(MDD)

1

0


그래프로 표현하면 다음과 같다.


(X축 : 기간, Y축 : 잔고 및 DD)


상관계수가 최대값인 1인 전략과 포트폴리오를 구성한 경우 포트폴리오 MDD 는 각 전략 MDD 의 단순 합인 6(= 3 + 3) 이 됐고 상관계수가 낮은(-0.96) 전략과 포트폴리오를 구성한 경우 포트폴리오 MDD 는 1 로 낮아졌다. 상관계수 최소값인 -1 일경우 포트폴리오 MDD 는 0 이 될것이다. 


실증분석을 시작하겠다.


위 예제에서 '전략 a' 에 해당하는 전략을 먼저 선정해야한다. 이전 글인 '테스트 전략 - 2' 편에서 사용했던 필터가 있는 이동평균 전략을 다시 사용하겠다. 전략구현 프로세스는 2 번째 version 을 따른다.


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

1. 전략을 구현할 때 필요한 데이터(symbol)는 무엇인가?

  • KOSPI200 선물

2. 필요한 데이터 중 실시간으로 변하는 데이터와 그렇지 않은 데이터는 무엇인가?

  • 실시간으로 변하는 데이터

        Symbol Data 1 : KOSPI200 선물

  • 실시간으로 변하지 않는 데이터

        없음

3. 기초자본금은 얼마인가?

  • 10,000,000 원

4. (백테스트인 경우) 테스트 기간은?

  • 2004년 08월 02일 ~ 2005년 03월 02일 (120일)

5. 전략에서 사용될 symbol 은 분봉인가 틱봉인가?


    Minute Bar


6. 전략에서 사용될 symbol 의 time interval 은?


    Symbol Data 1 : KOSPI200 선물 (5 Minute Bar)


7. 첫 전략루프를 수행할 때 필요한 과거봉 개수는?


    50 개


8. 최근 몇 개까지의 과거봉을 참조할 수 있나?


    300 개


=== Strategy Flow ===


1. 장 시작 후 바로 전략을 수행시킬 것인가? 일정하거나 상황에 따라 다른 term 을 두고 수행시킬 것인가?


    바로 시작


2. 장 종료시까지 전략을 수행시킬 것인가? 일정하거나 상황에 따라 다르게 전략을 중지시킬 것인가?


    장 종료까지 수행


3. 거래대상은 무엇인가?


    Symbol Data 1


4. 거래계약수는 몇 개인가?


    1 개


5. 매수(매도) 준비신호는?


    5 이동평균이 10 이동평균을 상회(하회) 할 때


6. 매수(매도) 신호는?


    3 이동평균이 5 이동평균을 상회(하회) 할 때


7. 환매도(환매수) 신호는?


    진입 후 10 개 봉이 지나면 청산

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




먼저 이 전략의 수익과 DD 그리고 MDD 를 그래프로 표현해보겠다.


(X축 : 기간, Y 축 : 잔고, DD, MDD)


'전략 a' 의 MDD 는 7,500,000 원이다. 이제 전략 포트폴리오를 구성하기 위해 이번에는 5 개의 후보전략을 사용하겠다. 후보전략들의 잔고는 다음과 같다.


(X축 : 기간, Y 축 : 잔고)


하나하나 구별하기는 힘들지만 다양한 수익률 곡선을 그리는 전략들이며 마지막에는 잔고가 10,000,000 원을 넘어 결국 수익으로 끝나는 전략들임을 알 수 있다. 각 전략들의 DD 를 그래프로 그려보면 다음과 같다.


(X축 : 기간, Y 축 : DD)


역시 알아보기는 힘들다. 각 선의 최고점이 해당 전략의 MDD 이다.


이제 본격적인 분석을 위해 각 전략의 로그수익률의 상관관계를 분석해보겠다.



 상관계수

 전략 a 

 전략 b

 전략 c

 전략 d

 전략 e

 전략 f

 전략 a 

 1

 

 

 

 

 

 전략 b

 0.195

 1

 

 

 

 

 전략 c

 -0.063

 -0.051

 1

 

 

 

 전략 d

 0.147

 0.652

 -0.147

 1

 

 

 전략 e

 0.233

 0.411

 -0.028

 0.437

 1

 

 전략 f

 -0.006

 0.531

 -0.069

 0.401

 0.178

 1


파란색으로 칠해진 부분이 '전략 a' 와의 상관관계다. 


상관관계가 높은 순으로 보면 e - b - d - f - c 순이다. 여기서는 상관관계가 높을수록 MDD 감소비율이 작을 것으로 가정했으므로,'전략 a' 와 포트폴리오를 구성했을 때 구성전략의 MDD 의 단순합에서 포트폴리오 MDD 로의 차감비율이 가장 작은 순서 역시 e - b - d - f - c 순이 되어야 한다. 다음은 각 조합의 포트폴리오 분석결과를 나타낸 표다.


전략 a 와의 상관계수

MDD 단순합

포트폴리오 MDD

MDD 차감비율

전략 a+a

1

15,000,000

15,000,000

0%

전략 a+b

0.195

13,075,000

10,500,000

19.69%

전략 a+c

-0.06

10,275,000

4,875,000

52.55%

전략 a+d

0.148

14,850,000

10,375,000

30.13%

전략 a+e

0.234

10,875,000

8,875,000

18.39%

전략 a+f

-0.007

14,150,000

8,475,000

40.10%


기대했던대로 전략 a 와의 상관관계가 작은 포트폴리오가 MDD 차감비율이 커지는 결과가 나왔다. '전략 a' 와의 상관관계를 높은 순으로 MDD 차감비율을 나타낸 그래프는 다음과 같다.



다음 그래프는 가장 많은 MDD 비율 하락을 보여준 전략 a+c 조합의 포트폴리오의 DD, MDD, 단순 DD 합, 단순 MDD 합을 보여준다.


(X축 : 기간, Y 축 : 포트폴리오 DD, MDD, 단순합 DD, MDD)


위 그래프를 보면 시간이 흐를수록 포트폴리오 MDD 와 단순 MDD 합의 차이가 커짐을 알 수 있고, DD 의 흐름을 비교해보면 (특히 마지막 부분) 단순합 DD 는 상승하는 반면 포트폴리오 DD 는 억제되고 있는듯한 움직임이 보인다.


공교롭게도 모든 부분이 예상과 일치했지만 무수히 많은 전략들을 같은 방식대로 조랍해봐야하며 그런 과정에서 이번 분석의 헛점들도 많이 발견될 것이다.



결론


전략 포트폴리오 구성시에 구성전략들의 상관계수가 높으면 포트폴리오 구성에서 오는 MDD 감소비율은 작아지는 경향이 있고 반대로 구성전략들의 상관계수가 낮으면 포트폴리오 구성에서 오는 MDD 감소비율이 커지는 경향이 있다.

대표적으로는 추세전략과 비추세전략의 포트폴리오 구성이 이런 구성에서 이득을 얻는데, 승률이 낮은 추세전략이 손실을 쌓아가는 동안 높아지는 Draw Down 을 높은 승률의 비추세전략이 상쇄시키면 포트폴리오 Draw Down 역시 낮게 유지할 수가 있다. 이상으로 전략 포트폴리오를 구성하는 전략들의 상관관계가 포트폴리오 MDD 에 미치는 영향에 대한 분석을 마치겠다.


2013. 9. 14. 15:11

주의깊게 읽었던 책 중 하나인 'Way of the TURTLE(한국제목 : 터틀의 방식)' 에 'E-ratio(Edge-Ratio)' 에 대한 소개가 있다. E-ratio 란 특정 진입이 우위성이 있는지 여부를 판단하는데 사용된다고 하는데 꽤 쓸만한 전략검증도구라 생각되어 테스트를 해봤다.

먼저 E-ratio 가 무엇인지 어떻게 구하는지 간단히 설명하겠다. (책에서 인용했다)


 


 

책을 보고 직접 그려본 그림인데 위 상황은 특정 시점에 매수진입을 한 상태이다. 매수진입 이후 일정기간이 경과할때까지의 

 

    (A) 최저가격과 진입가격의 차이가 MAE(Miniimum Favorable Excursion)

    (B) 최고가격과 진입가격의 차이가 MFE(Maximum Favorable Excursion)

 

이다. (매도의 경우 반대) 이 MFE, MAE 를 가지고 다음을 통해 E-ratio 를 구할 수 있다.

 

1. MAE 와 MFE 를 ATR 로 나눈다. (변동성을 반영하고 데이터를 정규화시킬 수 있다.)

2. 1에서 구한 값을 MAE, MFE 별로 합산하고 빈도수로 나누면,

    가격 변동성이 반영된 평균 MAE, MFE 가 구해진다.

3. 가격 변동성이 반영된 평균 MFE 를 가격 변동성이 반영된 평균 MAE 로 나눈값이

    'E-ratio' 이다.

 

E-ratio 가 크면 평균 MFE 가 평균 MAE 보다 높으므로 진입 후 가격이 유리한 방향으로 평균적으로 많이 진행된다는 해석이 가능하다.


E-ratio 분석에는 전략구현 프로세스 version 1 을 적용하겠다.


=== 전략구현 프로세스 version 1 ===


1. 전략을 구현할 때 필요한 데이터(symbol)는 무엇인가?

  • KOSPI200 선물

2. 필요한 데이터 중 실시간으로 변하는 데이터와 그렇지 않은 데이터는 무엇인가?

  • 실시간으로 변하는 데이터

        Symbol Data 1 : KOSPI200 선물

  • 실시간으로 변하지 않는 데이터

        없음

3. 전략에서 사용될 symbol 은 분봉인가 틱봉인가?


    Minute Bar


4. 전략에서 사용될 symbol 의 time interval 은?


    Symbol Data 1 : KOSPI200 선물 (5 Minute Bar)


5. 첫 전략루프를 수행할 때 필요한 과거봉 개수는?

 

    50 개


6. 최근 몇 개까지의 과거봉을 참조할 수 있나?


    300 개


=== Strategy Flow ===


1. 장 시작 후 바로 전략을 수행시킬 것인가? 일정하거나 상황에 따라 다른 term 을 두고 수행시킬 것인가?


    09:51:00 부터


2. 장 종료시까지 전략을 수행시킬 것인가? 일정하거나 상황에 따라 다르게 전략을 중지시킬 것인가?


    15:00:00 까지


3. 거래대상은 무엇인가?

 

    Symbol Data 1


4. 거래계약수는 몇 개인가?


    1개


5. 매수(매도) 준비신호는?

 

    없음


6. 매수(매도) 신호는?


    a. 무작위 종가 진입

    b. Bollinger 밴드를 상향돌파하면 종가 매수, 하향돌파하면 종가 매도

 

7. 환매도(환매수) 신호는?


    E-ratio 측정기간이 지나면 바로 청산




이 포스팅에서 분석해볼 내용은 다음과 같다.

 

1. 매수 또는 매도진입을 random 하게 수행할 경우 이론적으로는 모든 기간데 대해 E-ratio 가 1 이 나       와야한다. 이 가정이 맞는지 확인해볼 것이다.

2. 특정 전략의 E-ratio 를 기간별로 구하고 분석을 해본다.


먼저 무작위 매수 또는 매도진입이 MAE, MFE 기간에 관계없이 E-ratio 가 1 이 나오는지를 검증해볼 것이다. 

테스트 기간은 2004년 8월 2일부터 2009년 6월 30일까지로 약 5년이며 데이터는 KOSPI200 선물가격이다.


전략코드는 다음과 같다.



    



OHLC 가격이 모두 같은 지점이 있을 경우에는 ATR 이 0 이 나올 수 있으므로 (특히 side break 같이 시장이 멈춰있을 때, 분봉은 계속 OHLC 가 모두 같게 기록된다.) 그런 케이스는 누락시키는 조치를 했다. ATR 의 길이는 MAE, MFE 를 구하는 기간과 같게 했다.


봉 1 개부터 10 개까지의 MAE, MFE 구간을 구한 뒤 E-ratio 를 구해보니 다음과 같은 결과가 나왔다.



( X 축 : MAE,MFE 측정기간, Y 축 : E-ratio )


위 그림을 보면 무작위로 들어간 매도 또는 매수진입은 거의 일정하게 1.0 부근의 E-ratio 가 나온다는것을 알 수 있고, 평균은 0.99 로 무작위 진입전략의 진입 우위성은 없다고 판단할 수 있다. (E-ratio 가 1.0 을 넘는다고 볼 수 없으므로...)



( X 축 : MAE, MFE 발생횟수, Y 축 : 누적된 MAE,MFE )


위 그림은 무작위 진입전략의 MAE 와 MFE 를 ATR 로 나누어 표준화 한 값들의 누적그래프다. 하나의 선이라고 볼 수 있을 정도로 MAE 와 MFE 는 거의 같은 각도로 상향해가는 것처럼 보인다. 두 선이 정확하게 일치하면

E-ratio 는 정확히 1.0 이 나올것이고 만약 E-ratio 가 1.0 이상이라면 MFE 선이 상향될 것임을 알 수 있다.



Normalized MAE 평균 : 1.89

Normalized MFE 평균 : 1.83

( X 축 : MAE, MFE 발생횟수, Y 축 : MAE 또는 MFE )


위 그림은 표준화된 MAE 또는 MFE 의 분포를 점으로 찍은 그림이다. 눈으로 판단하기에는 무리가 있으나 육안으로는 차이가 없어보이며 각 평균이 1.89, 1.83 으로 거의 같게 나오므로 역시 무작위 진입전략은 진입우위가 존재하지 않는다고 볼 수 있다.



다음은 이동평균선을 이용한 전략을 간단하게 만들어봤다. 진입 부분의 코드는 다음과 같다.




필터없이 3 이동평균이 5 이동평균을 상향돌파하면 매수, 하향돌파하면 매도를 하는 전략이다. 코드만 봐도 성과는 나쁠거라는 느낌이 팍팍 든다...;


무작위 진입전략과 같은 분석을 해봣다.



( X 축 : MAE,MFE 측정기간, Y 축 : E-ratio )


예상대로 1.0 을 밑도는 E-ratio 값이 듬성듬성 보인다. 평균은 0.95 로 1.0 보다 낮다. 필터없는 이동평균전략은 진입 우위성이 없을 뿐더러 오히려 떨어지는 결과가 나온다.


( X 축 : MAE, MFE 발생횟수, Y 축 : 누적된 MAE,MFE )


누적된 표준 MAE, MFE 그래프를 보면 파란선인 표준 MAE 가 빨간선인 표준 MFE 를 시간이 지날수록 상회한다. 이 그래프역시 진입 우위성이 떨어지는 전략이라는걸 뒷받침한다.


Normalized MAE 평균 : 1.91

Normalized MFE 평균 : 1.78

( X 축 : MAE, MFE 발생횟수, Y 축 : MAE 또는 MFE )


분포그림은 양쪽이 비슷해보이나 평균값은 차이가 있음을 말해주고있다.



마지막으로 필터를 추가한 이동평균 전략의 E-ratio 를 알아보기로 하자.


진입전략코드는 다음과 같다.



세 개의 이동평균을 이용하며 Fast(3), Med(5), Slow(10) 이동평균이 정배열이 되는순간 매수, 역배열이 되는순간 매도를 하는 전략이다. Med 와 Slow 의 배열상태가 필터역할을 한다. 이 전략 역시 수익성 면에서는 큰 성과는 없어보이지만 필터가 있으므로 없을 때보다는 많은 노이즈가 걸러질 것이다.


그럼 분석결과를 보자. 꽤 의미있는 결과가 나왔다.



( X 축 : MAE,MFE 측정기간, Y 축 : E-ratio )


그림만 봐도 1.0 을 상회하는걸 알 수 있다. 평균 E-ratio 는 1.08 로 진입 우위성이 확실히 존재한다는걸 알 수 있다. 필터를 추가함으로서 진입 우위성에 큰 향상이 있다는게 밝혀졌다.


( X 축 : MAE, MFE 발생횟수, Y 축 : 누적된 MAE,MFE )


빨간선인 표준 MFE 의 누적값은 파란선인 표준 MAE 의 누적값을 시간이 갈 수록 상회하므로 진입 우위성이 있다고 판단된다.


Normalized MAE 평균 : 1.80

Normalized MFE 평균 : 1.91

( X 축 : MAE, MFE 발생횟수, Y 축 : MAE 또는 MFE )


분포그래프로는 차이점이 잘 보이지 않는다(괜히 넣었나;;;). 하지만 평균을 보면 MFE 가 높으므로 진입우위성이 있다고 판단할 수 있다.




결론


E-ratio 는 진입우위성을 판단하는 지표다. E-ratio 가 1.0 을 기준으로 높으면 진입우위성 존재, 낮으면 진입우위성이 없다고 판단한다. 무작위 진입전략은 E-ratio 가 0.99 로 나와 기대와 같은 결과를 내줬고, 성과가 떨어질 것으로 예상되는 이동평균전략은 E-ratio 가 0.95 로 역시 진입우위성이 없었으며, 필터를 추가함으로서 좀 더 개선된 전략인 이동평균전략은 E-ratio 가 1.08 로 진입우위성이 존재함을 확인했다.


추가정보로 MAE, MFE 측정기간이 끝날 때 청산하는 로직을 추가했을 때의 수익결과는 다음과 같다.


무작위 전략                        : 62,425,000   원 손실

이동평균 전략                     : 106,525,000 원 손실

필터가 추가된 이동평균 전략 : 35,500,000   원 수익


이로서 E-ratio 를 이용한 진입우위성 판단분석을 마치겠다.

2013. 9. 6. 01:05

처음으로 테스트 할 전략은 KOSPI200 지수와 선물 사이에 이론 베이시스와 시장 베이시스를 구하는 것이다.

거래 자체는 없고 indicator 성격의 전략이다.


전략구현 프로세스 version 1 을 적용하겠다.


=== 전략구현 프로세스 version 1 ===


1. 전략을 구현할 때 필요한 데이터(symbol)는 무엇인가?

  • KOSPI200 지수

  • KOSPI200 선물

  • CD3개월 (무위험이자율)

2. 필요한 데이터 중 실시간으로 변하는 데이터와 그렇지 않은 데이터는 무엇인가?

  • 실시간으로 변하는 데이터

        Symbol Data 1 : KOSPI200 선물

        Symbol Data 2 : KOSPI200 지수

  • 실시간으로 변하지 않는 데이터

        Rf : CD3개월

3. 전략에서 사용될 symbol 은 분봉인가 틱봉인가?


Tick Bar


4. 전략에서 사용될 symbol 의 time interval 은?


    Symbol Data 1 : KOSPI200 선물 (1 Tick Bar)

    Symbol Data 2 : KOSPI200 지수 (1 Tick Bar)


5. 첫 전략루프를 수행할 때 필요한 과거봉 개수는?


500 개


6. 최근 몇 개까지의 과거봉을 참조할 수 있나?


1000 개


=== Strategy Flow ===


1. 장 시작 후 바로 전략을 수행시킬 것인가? 일정하거나 상황에 따라 다른 term 을 두고 수행시킬 것인가?


090100 부터 (KOSPI200 틱정보 시작시간)


2. 장 종료시까지 전략을 수행시킬 것인가? 일정하거나 상황에 따라 다르게 전략을 중지시킬 것인가?


150000 까지


3. 거래대상은 무엇인가?


없음


4. 거래계약수는 몇 개인가?


0개


5. 매수(매도) 준비신호는?


없음


6. 매수(매도) 신호는?


없음


7. 환매도(환매수) 신호는?


없음





위 정보들을 기초로 2013년 09월 06일 KOSPI200 지수와 KOSPI200 선물데이터를 사용하여 베이시스 관련 정보를 분석해봤다. 다음은 선물가격과, 지수 그리고 전략코드 정보다. 참고로 여기서 사용되는 차트들의 원데이터는 전략을 수행하며 기록한 로그(CSV 파일)를 엑셀에서 로드한 것이다.




KOSPI200 선물가격 흐름 (약 45000 틱. 엑셀에서는 32000 까지 표현)




KOSPI200 지수 흐름 (약 10500 틱)




전략코드

* 만기까지의 시간을 연단위(252일)로 구한다.

* 이를 이용해서 이론 베이시스를 구한다.

* 시장 베이시스도 구한다.

지수데이터가 발생하고 나서 지수데이터 개수가 500개 쌓일 때까지 기다린다.

* 시장 베이시스의 100 이동평균과 500 이동평균을 구한다.




다음은 이 전략에서 분석한 정보다.



1. 이론 베이시스 (만기에 다다르면서 시간가치 감소에 의한 영향만 있음)



2. 시장 베이시스 (장 후반으로 갈 수록 베이시스가 콘텡고로 변하는 현상)



3. 100 이평 시장 베이시스 (파랑) (추세파악이 가능하지만 잡음이 많음)

4. 500 이평 시장 베이시스 (빨강) (베이시스의 추세를 쉽게 알 수 있음)



5. 선물가격과 시장 베이시스간의 상관관계 (선물가격과 시장 베이시스간에는 양의 상관관계가 있음)


0.60996

prev"" #1 #2 #3 next