백테스트는 만능이 아니다.

in #tooza7 years ago

image.png

백 테스트와 그를 통한 전략을 포스팅하게 된 이후 이런저런 이야기를 들었습니다. 백 테스트가 과적합 되었다, 절대로 백 테스트 결과만큼의 이익을 얻을 수 없다, '천하제일 백테대회', '백테빌런', 전략 글을 쓰는 사람은 해당 전략으로 얼마를 벌었는가 등 따끔한 지적들을 받았습니다.

이런 비판들 모두 올려놓은 전략을 무작정 따라 하고 추종하는 사람들을 우려하여 말하는 사려 깊은 행동이라고 생각합니다. 제가 올리는 전략들은 절대로 그대로 수익을 가져다주지 않고, 저 또한 백 테스트만큼의 성적을 거둘 것이다 라고 확신할 수 없기 때문에 충분히 우려할 수 있습니다. 저는 이것을 미리 알고 있지만, 독자분들께서는 이러한 배경지식이 없이 무작정 받아들일 수 있다는 생각이 들었습니다. 그래서, 백 테스트의 위험성을 알리는 글을 쓰는 것이 다른 무엇 보다 우선시되어야 한다고 보고 백 테스트 결과와 실제 거래의 괴리가 발생할 수 있는 지점들과 그런 우려를 부분적이나마 해소할 방법을 소개하는 글을 쓰기로 마음먹었습니다.

먼저 우리의 실제 수익이 백 테스트와는 다를 것이라는 이유가 세 가지 있습니다.


주문이 호가에 미치는 영향

주문 사이의 기간이 짧아질수록 우리의 주문은 호가에 직접적인 영향을 미칠 수 있습니다. 백 테스트의 결과에는 우리의 주문으로 받은 영향이 존재하지 않습니다. 우리의 주문이 시장가로 시행된다면 필연적으로 슬리피지가 발생하고, 설령 지정가더라도 거래비용이 존재하지 않는 것은 아닙니다.

'지정가로 시행되면 거래비용이 모두 반영된 거 아니야?'라고 생각할 수도 있지만, 그것은 사실이 아닙니다. 만약, 당신의 주문가격을 정확하게 찍고 상승해 당신의 주문이 부분체결 되거나, 미체결 되고 가격이 올라갔다고 해봅시다. 백 테스트에서는 우리가 그 가격에 맞춰 샀다고 표시가 될 겁니다. 하지만, 실제로는 우리는 사지 못했으므로 우리는 해당 주문에서 나오는 수익 또는 손해가 발생하지 않았을 겁니다.

만약 거래횟수가 많은 단기 전략을 사용하는데 우리의 자본이 전략의 자금수용력에 비해 크다면 어떨까요? 우리의 주문이 호가에 미치는 영향은 점점 더 커지고, 백 테스트와의 괴리 또한 그만큼 커질 겁니다. 이런 문제로 인해 자본이 커질수록 백 테스트 결과에 나온 누적수익률은 불가능에 가까워질 것이고, 일정 자본 이상의 규모는 수용할 수 없는 전략으로 연단리 수익률에 가까운 결과가 나오게 될 것입니다.

짧은 시계열

image.png

전 편의를 위해서 백테스트 툴로 뉴지스탁 젠포트를 사용합니다. 뉴지스탁 젠포트의 경우 2010년 1월 4일부터 현재까지의 백 테스트 데이터를 지원합니다. 모든 종류의 시장 상황을 테스트하기에는 부족한 시계열이라는 것이죠.

차트에서 나오듯이 30년 조금 넘은 역사를 가진 코스피에서 발생했던 MDD는 1994년부터 1998년까지 벌어진 약 75%였습니다. 많은 사람이 기억하는 2008년의 금융위기도 젠포트의 백 테스트에는 포함되어있지 않습니다. 과거에 닥쳤던 일이 앞으로는 닥치지 않을 것이라는 보장은 어디에도 없습니다. 따라서, 백 테스트 기간은 길수록 좋습니다. 뉴지스탁에서 테스트한 우리의 전략이 저런 금융위기나, 인터넷버블과 같은 상황에서도 robust 하게 유지된다는 보장이 없으므로 우리는 우리의 결과를 완전히 신뢰할 수 없습니다.

과적합의 우려

백 테스트 성적을 부풀리는 것은 일도 아닙니다. 팩터를 편향적으로 적용하면 됩니다. 거래 종목 수를 줄이고(부족한 샘플), 과거에 효과가 있었던 패턴들을 미리 본 뒤, 주가가 많이 오른 종목들만 검출하도록 하면 됩니다(생존자편향). 로직은 당연히 점점 복잡해질 겁니다. 이렇게 과거 데이터 속의 노이즈를 적극적으로 잡아내도록 하면, 극단적으로 높은 CAGR이나, MDD를 만들어 낼 수 있습니다. 이런 것은 사실 아무런 의미가 없는 행동입니다. 과거에 극단적으로 올랐던 종목들만 검출했다고 해서, 미래에도 과거가 반복되리라고 기대할 수는 없으니까요.


그렇다면 백 테스트는 아무런 의미 없는 행동일까?

백 테스트라는 것이 아예 쓸모없지는 않습니다. 몇 가지 방법을 통해 위의 문제점들을 부분적으로나마 해결할 수 있는 방법들이 있습니다.

주문이 호가에 미치는 영향 → 유니버스 제한, 전략의 다양화

만약 똑같은 단기전략을 사용하더라도 일일 거래대금이 큰 종목들로 유니버스를 제한한다면, 위에서 언급한 유동성 문제, 슬리피지 문제가 줄어들 겁니다. 우리의 주문이 호가에 미치는 영향이 줄어들수록 실제 투자시에 우리의 백 테스트 결과에 근접한 성과를 낼 겁니다 백 테스트에 거래비용을 포함할 수도 있습니다. 제가 올리는 모든 백 테스트 자료는 젠포트에서 0.3%의 세금과 키움증권 기준 0.015%의 수수료를 적용한 채 올리고 있습니다. 시장가 주문이 포함된 전략이라면 슬리피지 또한 백 테스트에 포함해 조금이라도 더 유사한 결과를 얻을 수 있습니다.

또 한가지는 전략을 다양화하는 것입니다. 한 전략이 수용할 수 있는 자금 규모만을 투자한 뒤에 남는 투자 가능 금액을 다른 전략에 투자해 전체 자금 수용력을 늘릴 수 있습니다. 이런 식으로 운영한다면 단기전략을 사용한다고 하더라도 어느 정도의 유동성을 확보할 수 있겠죠.

짧은 시계열 → 긴 백 테스트자료 확보, 시스템 손절매

짧은 시계열 문제를 완화하는 가장 쉬운 방법은 긴 백 테스트자료를 확보하는 것 일 겁니다. 주가 정보는 한국거래소를 포함해 여러 곳에서 다운받을 수 있습니다. 이렇게 확보한 자료를 엑셀이나 프로그래밍을 통해 가공하여 더 긴 시계열의 백 테스트를 만들어 낼 수 있습니다. 젠포트의 사용보다 당연히 오랜 시간이 걸리는 작업일 테지만, 훨씬 더 길고 정확하며 신뢰할 수 있는 자료를 얻을 수 있습니다. 조금 더 편의를 추구하자면 젠포트를 통해 간단하게 아이디어를 일차적으로 실험한 후, 효과가 있는 전략이라고 판단될 때 이러한 작업을 한다면 시간을 조금 단축할 수 있겠죠.

또 한가지 우리가 사용할 수 있는 방법은, 시스템 트레이딩에서 사용하는 시스템 손절매라는 방법입니다. 백 테스트 성적을 일정규모 이상 벗어나거나, 우리가 짰던 전략이 먹히지 않는 시장 상황이 되었을 때 시스템을 중단한 뒤 원래의 수익 곡선으로 복귀하는 것을 확인하고 전략을 다시 시행하는 방법입니다. 이러한 전략을 사용한다면 실제로 백 테스트 결과가 반복되지 않더라도 손실을 제한할 수 있습니다. 시스템 손절매에 관련된 내용은 @systrader79 님의 블로그 게시글에서 좀 더 자세히 다루고 있습니다.

과적합의 우려 → 간단한 로직 구성

과적합을 피하고자 우리는 로직을 간단하게 구성할 필요가 있습니다. 우리 전략의 구성요소 하나하나가 논리적이며 직관적이고 초등학생에게 설명할 수 있을 정도로 간단해야 합니다. 성적이 복잡한 로직에 비교해 안 좋게 나오더라도, 간단한 로직일수록 실제 결과와의 괴리가 줄어들 것입니다.


완벽한 퀀트 전략은 존재하지 않습니다. 계량투자는 미래 수익을 예측하는 행위가 아니라 시장이 비효율적이었던 패턴을 분석할 뿐입니다. 당신의 백 테스트 성적은 반복되기 어렵습니다. 이 점을 항상 기억하고 백 테스트의 결과를 보수적으로 받아들이며, 최대한 유사한 결과를 얻을 수 있도록 앞으로도 냉정하게 전략을 판단해야 합니다.

끝까지 읽어주셔서 감사합니다.

Sort:  

오 백테스트에 대해서 잘 정리해주셔서 감사합니다
과거에 맞는 결과가 미래에도 맞지 않을 수는 있겠지만 언급해주신 다양한 전략이 적용된다면 훌륭한 모델을 만들 수 있겠네요
다양한 전략의 모델을 만드는 것이 중요한 것 같습니다
좋은 글 잘 읽고 갑니다^^

그렇습니다. 위의 해결책을 통해 괴리를 완화할 수 있습니다. 하지만 위에 나열한 비판들은 제가 어떤 전략을 내놓던 앞으로도 사라지지 어려울것이라고 생각합니다. 위의 해결책 또한 부분적이고, 완전한 해결책이 아니니까요.

잘 읽고 갑니다 :)

감사합니다 :)

짱짱맨 태그 사용에 감사드립니다^^
존버앤캘리 이번편은 왠지 찡함..^^
https://steemit.com/kr/@mmcartoon-kr/20180307
[골든티켓x짱짱맨x워니프레임] 10차 옴팡이 이모티콘 증정
https://steemkr.com/kr/@goldenticket/x-x-10-100

스팀잇에는 다양한분야의 전문가들이 참 많음을 항상 느낌니다. 이해하려고 정독했네요.

Coin Marketplace

STEEM 0.19
TRX 0.17
JST 0.031
BTC 81242.61
ETH 3198.79
USDT 1.00
SBD 2.79