백테스트는 지금 세운 조건을 과거 데이터에 적용해 어떤 결과가 나왔는지 확인하는 작업입니다. 조건의 동작을 이해하고 오류를 발견하는 데 유용하지만, 사용 방법에 따라 실제보다 훨씬 좋아 보이는 결과를 만들 수도 있습니다.
가장 큰 위험은 과적합입니다. 과적합은 일반적인 구조가 아니라 분석에 사용한 과거 자료의 우연한 특징까지 조건이 외워 버린 상태에 가깝습니다. 이 조건은 익숙한 과거에서는 뛰어나 보이지만 새로운 회차에서는 같은 결과가 유지되지 않을 수 있습니다.
조건을 많이 시도할수록 우연한 1등이 생깁니다.
서로 다른 필터 수백 개를 시험하면 그중 일부는 우연히 과거 결과와 잘 맞을 가능성이 커집니다. 가장 좋은 결과 하나만 남기면 매우 특별한 규칙처럼 보이지만, 실제로는 많은 시도 가운데 우연히 앞선 결과일 수 있습니다.
‘가장 잘 맞은 조건’만 보는 대신 몇 개의 조건을 시험했고, 어떤 기준으로 선택했으며, 실패한 조건이 몇 개인지 함께 기록해야 합니다.
이를 다중 비교 문제라고 설명할 수 있습니다. 비교 횟수가 늘어날수록 우연한 성과를 진짜 신호로 오해할 가능성이 커지므로, 시도한 조건의 전체 규모를 숨기지 않는 것이 중요합니다.
만드는 데이터와 확인하는 데이터를 나눕니다.
하나의 기간을 사용해 조건을 만들고 같은 기간에서 성능까지 평가하면, 이미 본 결과에 조건이 맞춰질 수 있습니다. 이를 줄이려면 과거 데이터를 역할에 따라 나눕니다.
조건 설계 구간 → 중간 검증 구간 → 최종 확인 구간- 조건 설계 구간: 아이디어를 만들고 필터의 기본 동작을 확인합니다.
- 중간 검증 구간: 기준을 조정하되 변경한 내용을 기록합니다.
- 최종 확인 구간: 앞 단계에서 확정한 조건을 바꾸지 않고 한 번 평가합니다.
최종 확인 결과를 본 뒤 다시 조건을 바꾸면 그 구간도 사실상 설계 데이터가 됩니다. 이 경우 더 최근의 아직 보지 않은 구간에서 다시 확인해야 합니다.
미래 정보가 과거 분석에 섞이지 않았는지 봅니다.
과거 시점에는 알 수 없었던 값을 조건에 사용하면 데이터 누출이 생깁니다. 예를 들어 특정 회차를 분석하면서 그 회차 이후에 계산된 전체 기간 통계를 사용하면 당시에는 이용할 수 없었던 미래 정보가 들어간 셈입니다.
올바른 순차 검증에서는 각 회차를 평가할 때 그 직전까지 알 수 있었던 데이터만 사용합니다. 회차가 진행될 때마다 분석 범위를 앞으로 이동하는 방식은 실제 사용 상황과 더 비슷한 검증을 가능하게 합니다.
평가 기준을 결과 뒤에 바꾸지 않습니다.
처음에는 일치 개수를 보다가 결과가 좋지 않으면 다른 지표로 바꾸는 식의 사후 선택도 성과를 과장할 수 있습니다. 분석 전에 주 평가 지표와 보조 지표를 정하고, 변경했다면 언제 왜 바꿨는지 기록합니다.
또한 평균 하나만 보기보다 회차별 변동, 최악의 구간, 조건이 생성하는 조합 수와 비용 부담을 함께 살펴야 합니다. 결과를 개선하기 위해 조합 수를 크게 늘렸다면 단순 일치 횟수만으로 공정하게 비교하기 어렵습니다.
실전 백테스트 점검표
- 검증 전에 조건과 기간, 평가 기준을 기록했는가?
- 조건을 만들 때 보지 않은 별도 회차가 있는가?
- 좋은 조건뿐 아니라 시험한 전체 조건 수를 남겼는가?
- 각 시점 이후의 데이터가 실수로 섞이지 않았는가?
- 조합 수와 비용 조건이 비교 대상 사이에서 같은가?
- 좋은 회차와 나쁜 회차를 모두 포함했는가?
- 결과를 본 뒤 수정했다면 새로운 검증 구간을 확보했는가?
핵심 정리
백테스트는 미래 당첨을 증명하는 절차가 아니라 조건의 과거 동작을 점검하는 절차입니다. 보지 않은 데이터에서도 확인하고, 모든 시도와 실패를 함께 기록해야 과도한 확신을 줄일 수 있습니다.