CAFE

켈리공식 실전적용

작성자joopiter|작성시간12.03.01|조회수671 목록 댓글 0

포트폴리오의 복리수익률을 최대화하는 방법은 잠시 미뤄두고, 시스템 트레이딩에서 켈리공식에 대한 실전적용문제에 대해서 써보겠습니다. 많은 분들이 문의하는 내용을 보면 일단은 단일 전략에서의 켈리비율 구하는 것에서부터 궁금증이 많이 생기시는 것 같아서요.

 

일단 실제 트레이딩에서 얻을 수 있는 수익률 분포는 두가지로써, 백테스트로 얻은 시뮬레이션 자료와 실제 운용을 하는 과정에서 얻어낸 표본외 수익률 자료입니다. 일단 백테스트로 얻은 시뮬레이션 자료는 과최적화의 문제가 발생하는 경우가 있을 것이고, 실제운용에서 얻어낸 자료는 보통 그 숫자가 너무 작은 것이 문제가 됩니다. 또 두가지 자료 모두에게 발생하는 문제로써, 여태까지 잘 맞던 전략이 시장의 구조변화 등에 의해 그 효용을 영구적으로 잃어버리게 될 경우나 기존의 수익률분포에서 충분히 긴 시간동안 이탈해버릴 경우, 이러한 수익률분포에 가정해서 구한 켈리비율의 효용성은 매우 떨어져버릴 수 밖에 없을 것이고 켈리비율이 높았다면 그 레버리지 효과로 인해 큰 타격을 받게 될 것입니다.

 

따라서 투자자들의 입장에서는 이러한 분포의 불확실성 문제로 인한 켈리비율의 과잉추정에 대한 대책이 꼭 필요합니다. 켈리비율이 과잉추정된다면 장기복리수익률은 0이 될수도 있으니까요. 블랙잭에서의 카드카운팅 전략은 그 에지가 블랙잭 룰이 바뀌지 않는 한 지속적으로 꾸준하게 유지될 것임을 알 수 있으므로 상황이 자기에게 불리하게 돌아가도 수익률분포가 바뀐 것이 아님을 알 수 있지만, 시스템트레이딩 전략에 있어서는 수익률분포가 바뀐 것인지 아니면 우연히 운이 안좋은 것인지의 판단이 쉽지는 않습니다.

 

그래서 저는 수익률분포의 값을 매일매일의 실제거래 데이터를 통해서 갱신해주는 방법을 강력히 권장합니다. 통계학에서 이런 방법을 Bayesian Approach 라고 합니다. 수익률분포를 매일매일의 거래데이터를 통해서 갱신해나간다면 상황이 안좋아질때 안좋은 수익률 데이터가 많이 추가될 것이므로 켈리비율이 자연스럽게 줄어들게 되고 혹 상황이 좋아져서 전략이 전보다 잘맞게 된다면 켈리비율이 늘어나게 될 것입니다. 극단적으로 전략의 성과가 나빠지면 켈리비율이 0이 나와서 거래가 중단되었다가 좋아졌을때 다시 베팅이 시작될 것입니다.

 

더 적극적인 방법으로는, 흔히 수익률에 추세가 있다고 보여지는 경우에 사용할 수 있는 방법인데요 최근의 데이터에 2배의 가중치를 두는 등의 방법으로 최근의 수익률분포가 보다 빠르게 반영되도록 하는 방법입니다. 또다른 방법으로는 최근 N일의 수익률분포만을 사용하여 켈리비율을 구하는 방법이 있습니다. 역시 최근의 수익률이 많이 반영되도록 하는 방법입니다.

 

이러한 적응적 켈리비율 산출방법은 일단 전략이 잘 안맞게되는 경우 자동적으로 베팅비율이 낮아져서 그 안정성이 엄청나게 높아진다는 장점이 있습니다. , 전략의 특성에 따라서는 장기간에 걸쳐 산출한 수익률분포로 구한 켈리비율보다(그 켈리비율이 정확하다 할지라도) 이렇게 적응적으로 켈리비율을 다이나믹하게 조정하는 것의 복리수익률이 더 높아질 수도 있습니다잘 안맞을떄 적게 베팅하고 잘맞을때 많이 베팅하기 때문이죠. 물론 리듬이 맞아야 그런 효과가 발생합니다선물의 경우에는 6.666 배의 레버리지 제한이 있기 때문에 이 경우에 켈리비율을 다이나믹하게 조정하면 켈리베팅보다고 복리수익률이 높아지는 경우가 많지는 않지만 가끔 있습니다. 하프켈리베팅이나 쿼터켈리베팅과 비교했을때, 전략의 궁합이 맞는다면 부분켈리베팅과 비슷한 변동성을 가지면서 더 높은 복리수익률을 올리는 경우는 꽤 많이 발생합니다.

 

이러한 켈리비율의 조절방법은 많은 사람들이 그냥 넘어가고 있는 부분이지만 상당히 중요한 전략개발의 영역이 됩니다. 전략 만들때 파라메터를 최적화하듯이 이러한 켈리비율 조절방식도 전략마다 최적화하는 노력이 필요한 것이죠. (위의 예에서는 가중치 비율과 N일을 최적화할 수 있습니다. 물론 과최적화문제도 다른 파라메터와 마찬가지로 존재합니다.) 그러나 대부분시스템 전략에 베팅액 산출에 대한 수식에 대한 고민은 별로 안하실 것입니다. 이 부분에 더 많은 신경을 써야 합니다.

 

한번쯤 피라미딩 베팅전략에 대해서 대체 어떤 전략이 피라미딩베팅을 하면 그냥 베팅하는 것보다 더 나은 수익률을 보일까라는 문제에 대해서 고민해보셨을 것입니다. 켈리비율 조절방법을 위와 같이 최적화한다면 어떤 전략은 피라미딩과 비슷한 베팅방법이 나오게 되고 그것이 복리수익률을 최대화해줄 것입니다. 또한 전략에 따라서는 결과적으로 1:2:4:8 로 피라미딩되는 등 다양하게 열려있는 결과가 나오게 될 수도 있습니다. 켈리비율의 조절방식의 선택과 최적화를 통해 그 전략에 가장 잘 맞는 베팅방식을 자연스럽게 획득하게 되는 것이지요. 피라미딩은 그 중에 하나일 뿐입니다.

 

N일의 수익률분포만을 사용하는 방법이나, 가중치를 두어 최근 데이터가 더 빨리 분포에 반영되도록 하는 방법, 모두 사용하기 비교적 쉬운 방법입니다. 그러나 통계적으로 general(그래서 더 정확한방법은 현재 얻어지는 데이터들이 기존에 내가 가지고 있는 수익률 분포에서 나올 확률이 얼마나 되는지를 계산해서 판단하는 방법입니다. 과연 내가 수익률 분포가 맞는데 내가 운이나빠서 안좋은 결과나 너무 좋은 결과가 얻어지고 있는 것인지, 그 확률을 계산해서 분포를 바꿀지 안바꿀지를 판단하겠다는 것입니다. 통계학에서 t-Value 라고 하는 것인데 현재 가지고 있는 수익률 분포에서 현재 내가 경험하고 있는 실전 수익률이 나올 확률(혹은 t-Value) 를 계산해서 이게 얼마 미만일 경우에는 분포가 바뀐 것으로 보고 기존의 수익률 분포를 최근 데이터를 통해서 업데이트 해주는 것입니다. 예를 들어 내가 경험하는 수익률이 너무 낮은것 같은데 기존 분포에서 이렇게 나올 확률이 5% 미만일 경우에는 5% (혹은 20%로 설정해도 됩니다. 하기 나름입니다.)가 되도록 최근의 데이터에 가중치를 부여하여 기존 분포를 업데이트 하겠다는 것입니다. 이런 방식으로 한다면 자기 분포의 신뢰도를 특정수준 이상으로 항상 유지할 수 있습니다.

 

너무 이론적으로만 흐르는 것 같지만 켈리비율조정의 문제에서는 전략과 다르게 이론적으로 정확할 수록 실제 퍼포먼스도 정확하게 나옵니다. 전략작성에서 로그노말분포에 따른 복잡한 계산을 통해서 통계적 차익거래를 만들고 하는 등의 시도는 그야말로 이론적인 것이고 현실과 괴리된 짓입니다. 블랙숄스모형하고 변동성 모형가지고 옵션 거래하는 것과 마찬가지이지요그러나 켈리비율 조정의 문제는 실제 데이터를 가지고 이를 확률적으로 다루는 문제이기 때문에 정확하면 정확할수록 실제 퍼포먼스도 좋아지는 영역입니다. 단순히 너무 이론적이니까 현실과는 거리가 멀것이다라는 맘편한 생각은 이 문제에 있어서는 자기위안일 뿐입니다.

 

켈리비율을 산출함에 있어 로그노말분포 등 어떠한 가정도 하지 않았고 수익률분포에 대한 신뢰문제에 대해서 통계적으로 가장 우수한 추정방법을 제시했습니다. 이러한 방법이 현실과 괴리되어있다면 다른 베팅방법의 효과는 그 이하일 것입니다. 변동성이 문제라면 변동성이 발생할 확률을 제한조건으로 걸어서 E log(1+fX)의 최적화문제를 풀면됩니다. 그러면 주어진 변동성하에서 최대의 복리수익률을 끌어낼 수 있습니다. 큰 변동성 문제때문에 켈리최적화를 포기한다는 것은 말도 안됩니다앞으로 추가적인 현금흐름(월급이나 지출)이 발생할 예정이라면 그것 역시 감안하여 E log(1+fX) 의 최적화문제를 풀 수도 있습니다. 켈리최적화는 범용 툴이고 열린 구조입니다. 그리고 설령 제한조건이 있더라도 주어진 제한조건하에서 최대의 복리수익률을 얻게 해준다는 사실은 변함이 없습니다.   

 

예스트레이더에서는 정교한 수익률분포의 관리와 이를 통한 E log(1+fX) 최적화, 그리고 위의 t-Value 방식으로 분포의 신뢰도를 특정수준이상으로 유지하는 방식의 켈리비율 조정은 구현하기가 어렵습니다. (정확히 말하면 구현은 가능하지만 계산량이 너무 많아져서 예스트레이더가 뻗습니다.) 그러나  켈리베팅의 단순화된 버전이라도 우선 경험해보시려는 분들을 위해서 예스트레이더 코드를 만들어보았습니다.

 

수익률분포는 단순화된 계산을 위해 로그노말을 따른다고 가정하구요, 따라서 켈리비율은 수익률/분산 으로 계산하고 period번의 거래를 할때마다 최근 period 번의 거래에서 켈리비율을 재계산하여 베팅하는 코드입니다. 전략에 따라서 매거래시마다 최근 period 개의 거래에서 켈리비율을 재계산하도록 고치는 것이 나을 수도 있습니다. 또 수익률분포가 다를만한 이유가 있다면 매수진입의 켈리비율과 매도진입의 켈리비율을 각기 구하도록 고쳐도 됩니다. (켈리비율에서 수익률분포를 임의적으로 분리하는 것이 아니라 수익률분포가 다르다고 볼수 있는 합리적인 이유가 있어서 분리하여 각기 구한다면 더 효율적인 켈리비율이 나오고 따라서 복리수익률도 더 높아집니다.)

 

전략의 적절한 부분에 삽입해서 사용하시면 되고전략의 코딩 방식에 따라 아래 코드를 좀 수정해서 쓰셔야될 수도 있습니다.

 

 

//켈리모듈 심플버전

var: avr(0), vari(0), sum(0), cnt(0); betc(7), flag(0), buyp(0), sellp(0);  //betc=7계약(시작시점 풀레버리지1억원으로 시작)

arrays: ProfitArr[100](0); //수익률 배열

input: period(90); //최근 90개의 거래로부터 켈리비율 도출(전략에 따라 최적화 가능)

if cnt==period then begin  sum = 0; for i=0 to period-1{  sum = sum + profitarr[i]; } avr = sum/period; //수익률 평균  sum = 0; for i=0 to period-1{ sum = sum + (profitarr[i]-avr)*(profitarr[i]-avr); }

 vari = sum/period; //수익률 분산  if avr/vari >= 1 then Begin  betc = int( (200+netProfit)*100/(c*15) ); //1이상일 경우 풀베팅, 초기자본 200pt=1억원(레버리지제한이 없을경우 이부분 제거) End else Begin  betc = int( ((200+netProfit)*100/(c*15))*avr/vari );  //아닐경우 풀베팅*켈리비율만큼 베팅 end; cnt = 0; for i=0 to period-1 {    profitarr[i] = 0;  //수익률 배열 초기화  }End;

매수거래부분에 삽입(매도포지션에서 매수진입신호나오면 기존 매도포지션은 청산되므로)if flag==-1 then Begin profit = sellp - c; profitArr[cnt] = profit/(0.15*sellp); //레버리지감안 수익률 cnt = cnt + 1;end;if flag <>1 then buyp = c; flag = 1;

매도거래부분에 삽입(매수포지션에서 매도진입신호나오면 기존 매수포지션은 청산되므로)if flag==1 then Begin profit = c-buyp; profitArr[cnt] = profit/(0.15*buyp); cnt = cnt + 1;end;if flag<> -1 then sellp = c; flag = -1;

매수청산부분에if flag==1 and 청산식 then Begin flag =0; profit = c-buyp; profitArr[cnt] = profit/(0.15*buyp); cnt = cnt+1;end;

매도청산부분에if flag==-1 and 청산식 then Begin flag = 0; profit = sellp-c; profitArr[cnt] = profit/(sellp*0.15); cnt = cnt+1;end;

 

매수함수는 산출된 betc를 활용하여

buy("L", OnClose, DEF, betc);

 

매도함수는

sell("S", OnClose, DEF, betc);

로 쓰시면 됩니다. 

 

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼