기술적 지표 승률 백테스트, 결과에 속지 않는 7가지 체크리스트
“이 신호 승률 70%”라는 숫자를 만나면 확인해야 할 것들. 생존 편향, 미래 참조, 과최적화 등 백테스트를 실제보다 좋아 보이게 만드는 함정을 하나씩 짚습니다.
백테스트는 아름다운 결과를 만들기가 너무 쉽습니다. 실수 몇 개만 저지르면 승률 80%짜리 전략이 나오고, 그 전략은 실계좌에서 정확히 정반대로 작동합니다.
이 글은 특정 지표의 승률을 발표하는 글이 아닙니다. 누가 발표한 승률이든 그걸 믿기 전에 무엇을 확인해야 하는지에 대한 글입니다. 여기 나오는 7개는 순서대로 확인하시면 됩니다.
국내 주식 백테스트 자료를 찾아보면 대부분 자산배분이나 재무 지표 기반 퀀트 전략입니다. 기술적 지표 신호의 승률을 다룬 자료는 드물고, 있어도 계산 조건을 밝히지 않은 경우가 많습니다. 조건을 안 밝힌 승률은 검증할 수 없으므로 정보가 아닙니다.
1. 생존 편향 (Survivorship Bias)
증상: 현재 상장되어 있는 종목만으로 과거를 테스트했다.
지난 10년을 테스트한다고 할 때, 오늘 기준으로 상장된 종목 리스트를 가져다 쓰면 그 10년 사이에 상장폐지된 종목이 전부 빠집니다. 망한 회사를 빼고 계산했으니 결과가 좋을 수밖에 없습니다.
이 효과는 생각보다 큽니다. 특히 코스닥처럼 상장폐지가 드물지 않은 시장에서 저가주·소형주를 대상으로 하는 전략일수록 왜곡이 심해집니다. “RSI 과매도 종목 매수” 같은 전략은 정확히 그런 종목을 많이 잡습니다.
확인 질문: 테스트 기간 중 상장폐지된 종목이 표본에 포함되어 있습니까? 폐지 시점의 처리(마지막 거래가로 청산? -100%?)는 어떻게 했습니까?
2. 미래 참조 (Look-ahead Bias)
증상: 그 시점에는 알 수 없었던 정보를 썼다.
가장 흔한 형태 두 가지입니다.
- 종가 신호로 종가 매수 — RSI는 종가가 확정돼야 계산됩니다. 종가로 RSI를 계산해서 그 종가에 샀다고 가정하면, 확정 전에 산 셈이 됩니다. 현실적으로는 다음 날 시가로 진입 가정하는 것이 맞습니다.
- 수정주가의 함정 — 액면분할이나 유상증자를 반영한 수정주가는 그 이벤트 이후에 소급 적용됩니다. 과거 시점에서 보이는 가격은 수정 전 가격입니다. 지표 계산에는 수정주가가 맞지만, “당시 얼마에 살 수 있었나”를 따질 때는 주의가 필요합니다.
확인 질문: 신호 발생 시점과 진입 시점 사이에 몇 봉의 간격을 뒀습니까?
3. 거래비용과 슬리피지
증상: 수수료·세금·호가 스프레드를 빼지 않았다.
국내 주식 매도 시 증권거래세가 붙고, 매수·매도 양쪽에 증권사 수수료가 붙습니다. 여기에 호가 스프레드로 인한 슬리피지가 더해집니다.
매매 횟수가 많은 단기 전략일수록 이 비용이 결과를 통째로 뒤집습니다. 연간 100회 회전하는 전략에서 왕복 0.3%의 비용은 연 30%의 수익률 차이를 만듭니다.
확인 질문: 왕복 거래비용을 몇 %로 가정했습니까? 저유동성 종목의 슬리피지는 별도로 반영했습니까?
4. 유동성 필터
증상: 실제로는 체결되지 않았을 종목이 표본에 있다.
하루 거래대금이 3천만 원인 종목이 백테스트 결과 목록의 상위에 있다면, 그 결과는 종이 위에서만 존재합니다. 매수하려는 순간 호가가 위로 튀고, 팔려는 순간 받아주는 사람이 없습니다.
확인 질문: 거래대금 하한을 걸었습니까? 얼마로? 그리고 투입 자금 대비 그 종목의 하루 거래대금 비율은 얼마입니까?
5. 과최적화 (Overfitting)
증상: 파라미터를 이것저것 바꿔가며 가장 좋은 조합을 골랐다.
RSI 기간을 9, 14, 21로 바꿔보고 기준선을 25, 30, 35로 바꿔보고, 손절선을 3%, 5%, 7%로 바꿔봤다면 총 27개 조합을 테스트한 겁니다. 그중 가장 좋은 걸 고르면 그건 과거 데이터의 우연에 가장 잘 맞는 조합일 뿐입니다.
경험칙: 파라미터를 하나 늘릴 때마다 결과에 대한 신뢰도는 크게 떨어집니다. 조합 수가 표본 수에 비해 많아질수록 심해집니다.
대응: 데이터를 학습 구간(in-sample)과 검증 구간(out-of-sample)으로 나누고, 파라미터는 학습 구간에서만 고릅니다. 검증 구간에서 성능이 무너지면 그 전략은 실전에서도 무너집니다.
확인 질문: 몇 개의 조합을 시험했습니까? 검증 구간을 따로 뒀습니까?
6. 표본 수와 기간 구성
증상: 표본이 적거나, 한쪽 국면만 담았다.
- 표본 수 — 30번의 거래로 계산한 승률 70%와 3,000번으로 계산한 70%는 전혀 다른 신뢰도를 가집니다.
- 기간 구성 — 2020년 3월부터 2021년까지만 테스트하면 거의 모든 매수 전략이 좋아 보입니다. 상승장·하락장·횡보장이 모두 포함돼야 합니다.
- 국면별 분해 — 전체 승률 하나만 보지 말고 연도별·국면별로 쪼개서 보세요. 특정 한 해가 전체 성과를 만들고 있다면 그 전략은 그 국면 전용입니다.
확인 질문: 총 거래 횟수는? 테스트 기간에 하락장이 포함되어 있습니까? 연도별 성과 분해가 있습니까?
7. 승률만 보는 함정
증상: 손익비를 안 봤다.
승률 90%인 전략이 손실을 낼 수 있습니다. 9번 1%씩 벌고 1번 15% 잃으면 합계는 마이너스입니다. 반대로 승률 35%여도 수익 나는 전략이 있습니다.
같이 봐야 하는 지표들:
| 지표 | 무엇을 보나 |
|---|---|
| 손익비 (Payoff Ratio) | 평균 이익 ÷ 평균 손실 |
| 기대값 | 승률 × 평균이익 − 패율 × 평균손실 |
| 최대 낙폭 (MDD) | 고점 대비 최대 하락. 실전에서 버틸 수 있는 수준인가 |
| 수익 팩터 | 총이익 ÷ 총손실 |
| 거래당 평균 수익률 | 비용 차감 후에도 플러스인가 |
연 20% 수익이 나도 중간에 45% 낙폭을 겪는 전략이면, 대부분의 사람은 그 낙폭 구간에서 전략을 버립니다. 백테스트는 감정을 계산하지 않지만 실전은 계산합니다.
체크리스트 요약
발표된 백테스트 결과를 만났을 때 순서대로 확인하세요.
- 상장폐지 종목이 표본에 포함됐는가 (생존 편향)
- 신호 시점과 진입 시점이 분리됐는가 (미래 참조)
- 수수료·세금·슬리피지를 반영했는가
- 거래대금 하한이 있는가
- 파라미터 조합을 몇 개나 시험했고, 검증 구간이 있는가
- 거래 횟수와 기간 구성이 충분한가
- 승률 말고 손익비·MDD가 함께 제시됐는가
이 중 하나라도 답을 알 수 없다면, 그 숫자는 참고 자료가 아니라 마케팅 문구로 취급하는 편이 안전합니다. 이건 남의 백테스트뿐 아니라 자기가 돌린 백테스트에도 똑같이 적용됩니다.