백테스트에서 수익률이 높게 나오면 전략이 완성된 것처럼 느껴집니다. 그러나 좋은 그래프는 규칙의 장점뿐 아니라 잘못된 체결 시점, 사라진 종목의 누락, 과거에만 맞춘 변수 선택으로도 만들어질 수 있습니다.
백테스트는 미래 수익을 약속하는 도구가 아닙니다. 정한 규칙이 과거에 어떤 손실과 거래 과정을 만들었는지 확인하고, 실제로 실행할 수 없는 가정이 들어가지 않았는지 찾는 과정입니다.
이 글의 핵심
- 신호가 확정된 뒤에만 주문할 수 있습니다. 신호 시점과 체결 시점을 분리해야 합니다.
- 현재 살아남은 종목만으로 과거를 보면 위험이 작아 보일 수 있습니다.
- 가장 높은 과거 성과보다 다른 구간과 인접 변수에서도 크게 무너지지 않는지를 확인해야 합니다.
수익률을 보기 전에 거래 한 건을 재생한다
백테스트 결과를 읽을 때는 누적수익률보다 먼저 거래 한 건의 시간 순서를 봅니다.
입력값 관측 → 신호 확정 → 주문 제출 → 체결 → 비용 반영 → 보유·청산 기록
각 단계가 언제 일어났는지 설명할 수 없으면, 결과 표의 수익률도 해석하기 어렵습니다. 아래 세 오류는 이 시간 순서, 종목군, 변수 선택이 흔들릴 때 생깁니다.
1. 미래참조 오류: 모르는 값을 이미 안 것처럼 쓰는 문제
미래참조 오류는 거래일 당시 알 수 없던 정보를 신호 또는 체결 계산에 섞는 문제입니다. 가장 눈에 띄는 경우는 내일의 고가·종가를 오늘의 규칙에 쓰는 경우지만, 실제 구현에서는 더 작게 숨어 있을 수 있습니다.
대표적인 예는 당일 장 마감 후에 확정되는 종가와 거래량으로 신호를 만들고, 같은 날 종가에 체결한 것으로 처리하는 방식입니다. 장이 끝난 뒤에야 신호를 계산할 수 있었다면 그 종가에 주문을 넣을 수 없습니다. 체결 규칙을 다음 거래일 시가로 바꾸면 거래 가격과 성과가 달라질 수 있습니다.
| 확인 항목 | 잘못된 처리 | 점검 기준 |
|---|---|---|
| 신호 | 장 마감 후 값으로 장중 주문 | 입력값이 확정된 뒤 신호 생성 |
| 체결 | 당일 종가 신호를 당일 종가에 매수 | 실제 주문 가능한 다음 시점 사용 |
| 지표 | 현재 봉 이후 값이 섞인 중심 정렬 | 각 거래일 이전 데이터만 사용 |
| 데이터 | 나중에 정정된 구성 종목을 과거에 적용 | 당시 알 수 있던 정보인지 확인 |
신호와 체결을 분리하면 수익률이 낮아질 수 있습니다. 그 차이는 전략이 나빠졌다는 뜻이 아니라, 과거 결과를 실제 조건에 가깝게 다시 읽기 시작했다는 뜻입니다.
감으로 찾던 눌림목, 파이썬 자동매매 조건식으로 바꾸는 법은 신호 확정과 주문을 분리해야 하는 이유를 규칙표로 설명합니다.
2. 생존자 편향: 남아 있는 종목만 보면 위험이 사라진다
생존자 편향은 현재 거래되는 종목 또는 현재 시가총액 상위 종목만 과거 테스트에 넣을 때 생길 수 있습니다. 과거에 상장폐지·합병·관리종목 지정 등으로 사라진 종목과 당시의 종목 구성이 빠지면, 실제 투자자가 겪었을 하락과 교체 비용이 결과에서 작아질 수 있습니다.
이 오류를 줄이려면 전략의 대상이 무엇인지 먼저 구분해야 합니다.
| 대상 방식 | 확인할 위험 |
|---|---|
| 고정 종목 | 특정 종목의 장기 생존을 시장 전체 결과처럼 해석하는 문제 |
| 현재 구성 종목 | 현재의 우량 종목을 과거 모든 시점에 적용하는 문제 |
| 시점별 종목군 | 당시 편입·상장 상태와 데이터 확보 여부를 확인해야 하는 문제 |
개인 연구 환경에서 모든 상장폐지 데이터와 당시 지수 구성 종목을 갖추기 어렵다면, 그 한계를 결과에 명시해야 합니다. 현재 거래되는 유동성 상위 종목의 사례 연구처럼 결론의 범위를 좁히는 편이, 시장 전체에 적용되는 전략처럼 말하는 것보다 낫습니다.
3. 과최적화: 과거 최고점에 맞춰 규칙을 깎는 문제
이동평균 기간, 손절 폭, 거래량 배수처럼 바꿀 수 있는 값이 많을수록 과거에서 가장 높은 조합을 찾기 쉬워집니다. 하지만 그 최고점은 전략의 원리보다 우연한 가격 경로와 잡음을 맞췄을 수 있습니다.
과최적화를 의심할 때는 한 값의 성과보다 주변을 봅니다.
- 20일선만 유난히 좋고 18일·22일에서 급격히 나빠지는가
- 선택한 구간과 보지 않은 구간의 순위가 비슷한가
- 종목이나 시장 국면을 바꾸면 거래 수·낙폭·손익 구조가 어떻게 변하는가
- 비용을 조금 높여도 결과의 성격이 유지되는가
정답처럼 보이는 숫자를 찾기보다, 조금 달라져도 논리가 유지되는 범위를 찾는 편이 낫습니다. 새 구간에서 결과가 약하면 변수를 더 세밀하게 맞추기보다 가설, 체결 가정, 대상 종목군부터 다시 검토합니다.
세 오류를 줄이는 최소 기록
완벽한 데이터와 검증 환경을 한 번에 갖추기 어렵더라도 아래 기록은 남길 수 있습니다.
- 신호 시각, 주문 시각, 체결 가격, 비용이 들어 있는 거래 내역
- 테스트에 포함한 종목과 기간, 제외한 대상의 이유
- 시도한 변수 범위와 최종 선택 이유
- 선택 구간과 분리해 둔 확인 구간의 성과표
시스템 트레이딩 전략은 어떻게 만들까? 아이디어부터 검증까지 6단계에서 이 기록들이 전략 개발의 어느 단계에 놓이는지 볼 수 있습니다. 자동매매 시작 전 준비할 3가지: 데이터·검증·주문 환경은 데이터와 주문 환경을 분리해 준비하는 기준을 다룹니다.
백테스트 결과를 읽는 마지막 질문
좋은 결과를 봤을 때는 먼저 다음 세 가지를 묻습니다.
- 이 거래는 그날 실제로 알 수 있던 정보와 가격으로 체결됐습니까?
- 테스트 대상은 당시 투자할 수 있었던 종목군을 얼마나 반영합니까?
- 이 변수 조합만 좋은가, 다른 기간·다른 값에서도 전략의 성격이 유지됩니까?
세 질문에 답하기 어려운 결과는 버려야 할 실패가 아니라, 다음 검증에서 고쳐야 할 가정을 알려 주는 자료입니다. 백테스트의 가치는 높은 숫자보다 이런 질문을 반복할 수 있게 만드는 데 있습니다.
이 글은 백테스트 검증 원칙을 설명하기 위한 교육용 자료입니다. 예시는 특정 종목의 매수·매도 추천이나 미래 수익을 의미하지 않으며, 실제 투자 판단과 책임은 투자자 본인에게 있습니다.