백테스트 결과가 맞는지 확인하는 5가지 방법
백테스트 수익률이 잘 나오면 제일 먼저 뭘 해야 할까?
좋아할 게 아니라 계산부터 의심해야 한다.
최근에 6개월 동안 돌린 백테스트에서 오류를 발견했다.
계산식이 처음부터 틀려 있었다.
오류를 고치고 다시 돌렸다.
수익률은 기존의 3분의 2 수준으로 내려갔다.
전에 “지수를 이긴다”고 적었던 근거도 사라졌다.
문제는 그동안 코드가 단 한 번도 멈추지 않았다는 것이다.
틀린 코드는 아주 멀쩡하게 돌아갔고, 결과도 그럴듯했다.
가장 중요한 최근 3개월이 0이었다
상대강도(RS)는 최근 네 분기의 수익률에 가중치를 줘서 계산한다.
그중 최근 분기의 가중치가 0.4로 가장 크다.
그런데 최근 분기를 뽑는 코드가 잘못돼 있었다.
이 값이 항상 0으로 계산됐다.
가장 중요한 항 하나가 통째로 빠진 것이다.
나머지 항도 문제였다.
겹치지 않는 분기별 수익률을 써야 했다.
그런데 누적 수익률을 써서 같은 기간을 여러 번 세고 있었다.
고치자 숫자가 이렇게 바뀌었다
오류를 수정하고 48개 경로를 다시 돌렸다.
| 항목 | 수정 전 | 수정 후 |
|---|---|---|
| 연복리 중앙값 | 기준 | 기준의 약 2/3 |
| 최대낙폭 중앙값 | 24.9% | 27.4% |
| 선택 종목 | 기준 | 27% 변경 |
수익률은 내려갔고 낙폭은 더 깊어졌다.
같은 기간 지수와 비교하면 수익률은 지수보다 낮고, 낙폭은 지수보다 얕았다.
좋은 결과는 아니지만 틀린 숫자를 믿고 매매하는 것보다는 낫다.
백테스트 수익률보다 먼저 볼 5가지
이번 일을 겪고 검증 순서를 아예 정했다.
1. 계산식의 각 항을 따로 출력한다
최종 점수만 보지 말고, 점수를 구성하는 값이 실제로 들어오는지 확인한다.
내 경우에도 RS 점수만 봤다면 오류를 못 찾았다. 최근 분기 수익률을 따로 출력했기 때문에 0이 반복된다는 걸 확인할 수 있었다.
2. 임의의 종목을 손으로 계산한다
종목 몇 개와 날짜 몇 개를 골라 엑셀이나 계산기로 직접 계산한다.
자동화된 결과끼리만 비교하면 같은 오류를 계속 반복할 수 있다.
3. 수정 전후 종목 목록을 비교한다
수익률만 달라졌는지 보지 말고, 어느 날짜에 어떤 종목이 새로 들어오고 빠졌는지 확인한다.
종목 목록이 크게 달라졌다면 단순한 수치 조정이 아니라 전략 자체가 달라진 것이다.
4. 다른 엔진으로 한 번 더 돌린다
같은 명세를 바탕으로 독립적인 엔진을 하나 더 만든다.
두 결과가 다르면 누가 맞는지 따지기 전에, 어디서부터 달라졌는지 추적한다.
5. 결과는 숫자 하나가 아니라 범위로 본다
같은 룰도 매수 우선순위와 슬리피지에 따라 성과가 달라질 수 있다.
연복리 18.2%처럼 한 점으로 믿기보다 여러 조건에서 나온 분포와 최악의 경우를 함께 보는 편이 안전하다.
실제 매매까지 틀리지는 않았다
다행히 실제 매매 신호를 만드는 코드는 별도 파일에 있었고 계산식도 맞았다.
200개 종목을 손으로 검산해 200개 모두 일치했다. 이 오류 때문에 바뀐 실제 매매는 없었다.
백테스트 결과만 보고 룰을 바꾼 적도 없었다.
좋은 결과가 나와도 표본이 작거나 신뢰구간에 0이 포함되면 기각했던 습관이 이번에는 사고를 막았다.
백테스트에서 가장 위험한 오류는 실행을 멈추는 오류가 아니다.
결과가 그럴듯해서 의심하지 않게 만드는 오류다.
수익률이 좋게 나왔다면, 믿기 전에 위 다섯 가지부터 확인해보는 게 좋다.