2026-08-30 · Kverse
백테스트를 정직하게 하는 법 — 13F 백테스트에 적용한 다섯 가지 규율
#13F#교육#백테스트
백테스트는 숫자를 좋게 만드는 방법이 무수히 많은 작업입니다. 체결 시점을 조금 앞당기고, 비용을 빼고, 사라진 종목을 조용히 지우고, 수십 가지 변형 중 이긴 것만 보여주면 어떤 전략이든 그럴듯해집니다. 13F 백테스트(/13f/backtest)를 만들면서 지키려 한 다섯 가지 규율을 정리합니다. 좋은 성적을 자랑하려는 글이 아니라, 백테스트라는 물건을 어떻게 의심해야 하는지에 대한 글입니다.
첫째, Point-in-Time입니다. 13F 공시는 분기말로부터 45일 뒤에야 제출이 마감됩니다. 흔한 실수는 분기말 가격으로 체결을 가정하는 것인데, 그 시점에는 시그널 자체를 알 수 없었습니다. 저희 엔진은 마감일 이후의 첫 주간 종가로 체결합니다. 45일 지연을 그대로 먹는 셈입니다. 구루별 가중치 같은 보조 지표도 그 시점까지의 롤링 값만 쓰고, 미래 성적은 쓰지 않습니다.
둘째, 거래비용입니다. 모든 매매에 편도 0.2%를 수수료와 슬리피지의 근사로 부과합니다. 분기 리밸런싱이라 회전이 잦은 편은 아니지만, 비용 없는 백테스트와의 차이는 십여 년 복리로 쌓이면 무시할 수 없습니다.
셋째, 생존편향입니다. 가격 데이터에는 살아남은 종목만 남습니다. 상장폐지 종목을 빼고 계산하면 성적이 부풀려집니다. 엔진은 상폐 종목을 마지막 확인 가격으로 청산 처리하고 그 규모를 공개합니다. 최신 데이터 기준으로 시그널에 등장한 438개 종목 중 384개의 가격을 확보했고, 54개는 누락, 상폐 마지막가 청산은 6건입니다. 피인수 상폐는 마지막가 청산이 대체로 공정하지만 파산 상폐는 과대평가된다는 한계까지 화면에 그대로 적어 두었습니다.
넷째, 다중검정의 정직성입니다. 가장 은밀한 왜곡은 변형을 수십 개 돌려 보고 이긴 것만 내놓는 일입니다. 파라미터 탐색을 100회, 200회 단위로 돌렸고, 트레일링 스톱·핫핸드·변동성 타게팅을 포함한 43개 변형을 전부 기각했으며 그 기록을 남겼습니다. 채택 기준은 특정 값 하나가 이겼는지가 아니라 이웃 파라미터까지 함께 통과하는 고원인지입니다. 성적이 기준을 넘어도, 이긴 스타일을 알고 나서 고른 사후선택 부분집합은 제외했습니다.
다섯째, 벤치마크와의 정직한 비교입니다. 결과 화면은 각 전략을 같은 구간의 SPY·QQQ, 그리고 시가총액 상위 10종목 벤치마크 곡선에 겹쳐 보여주고, 겹치는 구간에서 셋을 모두 이겨야만 통과로 표시합니다. 지는 전략도 그대로 둡니다. 신규편입 클론(ST-01)은 연 7.0%로 같은 기간 지수에 크게 뒤지고, 기본 화면 기준으로 10개 전략 중 절반은 같은 구간의 QQQ에 미치지 못합니다. 이기는 쪽에서는 유입×모멘텀(ST-16)이 연 35.2%에 최대낙폭 -45.5%, 샤프 0.76이고, 모멘텀·유입 혼합(ST-17)이 연 27.6%에 최대낙폭 -34.4%, 샤프 0.83입니다. 다만 유입 필터 없는 순수 모멘텀 대조군도 연 29.1%여서, 초과수익의 상당 부분이 모멘텀 자체에서 온다는 점 역시 화면에 밝혀 두었습니다.
이 다섯을 다 지켜도 백테스트는 결국 과거의 기록일 뿐입니다. 그래도 규율을 지킨 과거와 지키지 않은 과거는 다릅니다. 다른 곳의 백테스트를 보실 때도 같은 체크리스트를 권합니다. 체결 시점은 언제인가, 비용은 얼마를 뺐는가, 상폐 종목은 어떻게 처리했는가, 시도한 변형은 몇 개였는가, 벤치마크와 같은 구간에서 비교했는가. 다섯 질문에 답이 없는 백테스트라면 숫자가 아무리 좋아도 걸러 읽는 편이 안전합니다. /13f/backtest 에서 전략별 곡선과 커버리지 수치를 직접 확인하실 수 있습니다.
이 글은 정보 제공 목적이며 투자 조언이 아닙니다. 각 도구의 계산 방법과 한계는 이용 가이드에서 확인하세요.
