백테스트

기술적 지표 승률 백테스트, 결과에 속지 않는 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)고점 대비 최대 하락. 실전에서 버틸 수 있는 수준인가
수익 팩터총이익 ÷ 총손실
거래당 평균 수익률비용 차감 후에도 플러스인가
MDD를 특히 보세요

연 20% 수익이 나도 중간에 45% 낙폭을 겪는 전략이면, 대부분의 사람은 그 낙폭 구간에서 전략을 버립니다. 백테스트는 감정을 계산하지 않지만 실전은 계산합니다.

체크리스트 요약

발표된 백테스트 결과를 만났을 때 순서대로 확인하세요.

  1. 상장폐지 종목이 표본에 포함됐는가 (생존 편향)
  2. 신호 시점과 진입 시점이 분리됐는가 (미래 참조)
  3. 수수료·세금·슬리피지를 반영했는가
  4. 거래대금 하한이 있는가
  5. 파라미터 조합을 몇 개나 시험했고, 검증 구간이 있는가
  6. 거래 횟수와 기간 구성이 충분한가
  7. 승률 말고 손익비·MDD가 함께 제시됐는가

이 중 하나라도 답을 알 수 없다면, 그 숫자는 참고 자료가 아니라 마케팅 문구로 취급하는 편이 안전합니다. 이건 남의 백테스트뿐 아니라 자기가 돌린 백테스트에도 똑같이 적용됩니다.

#백테스트#생존편향#과최적화#검증