과최적화 — 좋은 백테스트 숫자가
좋은 전략은 아니다
4년치 데이터로 전략 아이디어 여섯 개를 시험했습니다. 여섯 개 다 버렸습니다. 버린 이유는 "수익이 적어서"가 아니었습니다. "이 숫자를 믿을 수 없어서"였습니다. 숫자가 거짓말하는 방식 다섯 가지를 정리했습니다.
01옆칸을 보면 안다
가장 흔한 착각
모든 전략에는 정해야 할 숫자가 있습니다. 얼마나 들고 있을지, 며칠치 평균을 볼지 같은 것들입니다. 보통은 여러 값을 넣어보고 제일 잘 나온 값을 씁니다.
그런데 제일 잘 나온 값이 진짜인지 어떻게 알까요. 바로 옆 값을 보면 됩니다.
빨간 줄을 보세요. 설정을 3%만 바꿔도 성적이 푹 꺼집니다. 올랐다 내렸다를 계속 반복합니다. 파란 줄은 20%를 바꿔도 완만하게 오르내립니다. 가운데가 제일 높고 양옆이 비슷합니다.
설정을 1% 바꿀 때 성적이 흔들리는 정도를 재보면 4배 차이가 납니다.
여기서 진짜 중요한 건 따로 있습니다. 빨간 줄에서 설정을 한 칸 옮겨도 거래 건수는 5%도 안 변합니다. 같은 자리에서 사서 조금 다른 때 팔았을 뿐입니다. 그런데 성적이 그만큼 흔들린다면, 그 차이는 전략이 만든 게 아닙니다. 큰 거래 몇 건이 어디서 끊겼느냐가 만든 우연입니다.
파란 줄이라면 가운데 값을 써도 됩니다. 한 칸 옆을 골랐어도 비슷했을 테니까요. 빨간 줄에서는 어떤 값을 골라도 근거가 없습니다.
뾰족한 봉우리는 우연이고, 완만한 언덕은 실력이다. 최고점만 보지 말고 바로 옆칸을 봐야 구별된다.
02최근에만 좋다면 시장이 도운 것이다
가장 그럴듯하게 속는 방식
흔히 데이터를 앞뒤로 나눕니다. 앞부분으로 전략을 만들고, 뒷부분으로 확인합니다. 뒷부분 성적이 좋으면 "검증을 통과했다"고 하죠.
어떤 조건을 하나 얹었더니 이런 결과가 나왔습니다.
| 구분 | 4년 전체 | 마지막 1년 (검증) |
|---|---|---|
| 원래 | 100 | 100 |
| 조건 추가 | 66 | 344 |
검증 부분만 보면 세 배 넘게 좋습니다. 전체로는 3분의 1이 깎였는데도요. 검증 숫자만 봤다면 이걸 골랐을 겁니다.
이유는 허탈할 만큼 단순했습니다. 그 조건은 돈이 시장에 나가 있는 시간을 4분의 1쯤 줄입니다. 그리고 마지막 1년은 시장이 크게 빠진 하락장이었습니다.
덜 나가 있었으니 덜 잃은 겁니다. 전략이 좋아서가 아니라요. 하락장에서는 "적게 매매하는 전략"이 전부 좋아 보입니다.
그래서 저는 4년을 1년씩 네 토막으로 잘라 전부 봅니다. 네 해 모두 플러스인 것만 남깁니다. 한 해만 화려한 건 그 해가 도운 겁니다.
03나도 모르게 미래를 보고 있다
코드 어디에도 안 적혀 있는 반칙
어떤 지표가 아주 낮을 때 사는 전략을 만들었습니다. "아주 낮다"의 기준은 하위 2%로 잡았고요.
여기에 반칙이 숨어 있었습니다. 하위 2%가 얼마인지를 4년치 전체를 놓고 계산한 겁니다. 2023년에 살지 말지 판단하면서 2026년 데이터까지 본 셈이죠. 실전에서는 있을 수 없는 일입니다.
그 시점까지의 과거만 보고 기준을 정하도록 고쳤습니다.
| 기준을 정한 방법 | 거래당 수익 |
|---|---|
| 4년 전체를 보고 (반칙) | 100 |
| 과거 6개월만 보고 | 52 |
| 과거 1년만 보고 | 58 |
거래당 수익의 절반이 미래를 본 값이었습니다. 코드 어디에도 "미래를 본다"고 쓰여 있지 않았습니다. 그냥 전체 데이터로 평균을 냈을 뿐인데요.
확인하는 방법은 질문 하나입니다. "이 숫자를 그때 알 수 있었나?" 평균이든, 상위 몇 %든, 기준선이든, 쓸 때마다 물어야 합니다.
04비교 대상이 없으면 아무것도 모른다
숫자가 플러스라는 것만으로는 증명되는 게 없다
자주 뜨는 신호가 하나 있었습니다. 4년에 3만 번 가까이 나오는 신호였죠. 그걸로 사고팔았더니 결과가 처참했습니다. 여기서 멈추면 "쓸모없는 신호"가 결론입니다. 그런데 아니었습니다.
같은 횟수만큼 아무 데서나 무작위로 사는 경우를 만들어 나란히 놓았습니다. 수수료를 빼기 전, 순수하게 가격만 비교하면 이렇습니다.
| 사는 방식 | 거래당 수익 |
|---|---|
| 신호를 보고 산다 | +0.040% |
| 아무 때나 산다 | +0.008% |
| 차이 = 신호의 값어치 | +0.033% |
그 신호에는 진짜로 정보가 있었습니다. 아무 때나 사는 것보다 네 배 이상 낫습니다. 문제는 그 정보가 0.033%인데, 한 번 사고팔면 수수료로 0.11%가 나간다는 것이었습니다.
신호는 진짜인데 값어치가 수수료의 4분의 1이라 쓸 수가 없습니다.
비교 대상이 없었다면 "쓸모없는 신호"로 적어뒀을 겁니다. 실제로는 "진짜지만 너무 작은 신호"였고, 이건 전혀 다른 결론입니다. 나중에 비슷한 아이디어가 나왔을 때 판단이 달라지니까요.
05승률이 오르는데 수익이 줄면 함정이다
가장 기분 좋게 속는 방식
들고 있다가 어느 선에 닿으면 파는 규칙을 더해봤습니다. "먹을 만큼 먹고 나오자"는 흔한 발상이죠.
| 구분 | 승률 | 거래당 수익 | 들고 있는 시간 |
|---|---|---|---|
| 원래 | 51% | 100 | 100 |
| 파는 규칙 추가 | 73% | 34 | 22 |
이기는 횟수는 크게 늘고, 버는 돈은 3분의 1이 됩니다. 매매 기록을 보면 기분은 훨씬 좋아집니다. 계좌는 나빠지고요.
이유는 이 전략이 돈을 버는 구조에 있습니다. 거래를 수익 순서로 줄 세우면, 딱 가운데 있는 거래는 거의 본전입니다. 수익 대부분을 소수의 크게 번 거래가 만듭니다.
어느 선에서 파는 규칙은 바로 그 소수를 잘라냅니다. 작은 이익은 그대로 챙기면서 큰 이익만 없애는 셈이죠. 이름이 뭐든(익절이든 추적 손절이든) 상단을 자르는 규칙은 전부 같은 일을 합니다.
결정적인 증거가 있었습니다. 그 규칙을 느슨하게 할수록, 다시 말해 덜 발동할수록 성적이 좋아졌습니다. 발동 횟수가 367번 → 113번 → 29번으로 줄자 성적이 계속 올라 규칙이 아예 없을 때에 수렴했습니다.
이 규칙은 작동할 때마다 손해를 보고 있었던 겁니다.
+재는 자가 틀렸을 수도 있다
이건 전략 이야기가 아니라 제 실수입니다. 파장이 커서 남겨둡니다.
거래가 21번뿐인 전략을 기존 것과 섞었더니 성적이 눈에 띄게 좋아졌습니다. 21번으로 그럴 리가 없죠. 원인은 비교하는 코드에 있었습니다.
두 전략의 성적을 겹쳐 볼 때 둘 다 값이 있는 구간만 잘라서 쓰고 있었습니다. 거래가 적은 전략은 일찍 끝나버리죠. 그래서 비교 구간에서 4개월 반이 통째로 사라졌고, 하필 그 기간이 나빴던 겁니다. 좋아진 게 아니라 나쁜 구간이 지워진 거였습니다.
거래가 없는 날은 수익 0으로 채우도록 고쳤습니다. 개선폭이 100분의 1 이하로 줄었습니다.
06그래서 어떻게 봐야 하나
수익률 숫자 하나로는 아무것도 알 수 없습니다. 제가 지금 쓰는 순서는 이렇습니다.
- 옆칸을 본다. 설정을 조금 바꿔도 비슷한가? 널뛰면 그 숫자는 우연이다.
- 기간을 쪼갠다. 1년씩 잘라도 전부 플러스인가? 한 구간만 화려하면 그 구간이 도운 것이다.
- 미래를 봤는지 확인한다. 쓰고 있는 기준을 그때 알 수 있었나?
- 아무 때나 사는 경우와 비교한다. 무작위로 사도 비슷한 숫자가 나오지는 않는가?
- 거래 한 번의 수익이 수수료보다 큰지 본다. 승률이 아니다. 자주 매매할수록 먼저 봐야 한다.
이 다섯을 통과하지 못하면 나머지 숫자는 보지 않습니다. 아이디어 여섯 개 중 다섯 개가 여기서 걸러졌습니다. 남은 하나도 더 벌어서가 아니라 덜 잃어서 남았고, 아직 실제로 쓰지는 않고 있습니다.
과최적화는 좋은 숫자를 고르는 일이 아닙니다. 왜 좋은지 모르는 채로 고르는 일입니다. 이유를 설명하지 못하면, 그 숫자는 아직 내 것이 아닙니다.


댓글 쓰기