백테스트 과적합: 실제 PF/Sharpe 수치로 보는 5가지 전형 패턴 (2026)
옵티마이저 산출 전략 50+ 건의 실거래 결과를 바탕으로 5가지 뚜렷한 과적합 패턴을 정리했다: walk-forward 괴리, 레짐 플립, 파라미터 절벽, 인디케이터 스태킹, 생존 편향. 각 패턴마다 재현 가능한 합성 예시 + 탐지 신호를 함께 정리했다.
- Python
- pandas
- numpy
- vectorbt
- backtrader
- MIT
- 업데이트 2026-05-25
{{< resource-info >}}
백테스트 과적합: 실제 PF/Sharpe 수치로 보는 5가지 전형 패턴 #
Meta Description: 옵티마이저 산출물의 실거래 50+ 건을 바탕으로 5가지 과적합 패턴을 재현 가능한 수치와 탐지 신호로 정리.
대부분의 퀀트 트레이더는 과적합의 존재를 안다. 하지만 과적합이 데이터에서 어떻게 생겼는지 — train-vs-OOS 괴리 패턴, 파라미터 민감도가 드러내는 것, 라이브 배포 전에 잡아낼 탐지 신호 — 를 설명할 수 있는 사람은 훨씬 적다. 이 글은 최근 moss-trade-bot 작업과 인접 전략에서 관찰된 5가지 실제 패턴을 정리한다.
⚡ TL;DR — 2분 #
정리한 5가지 패턴: walk-forward 괴리, 레짐 플립, 파라미터 절벽, 인디케이터 스태킹, 생존 편향.
가장 강력한 탐지 신호: Train PF / OOS PF 비율 > 1.5 = 의심, > 2.0 = 교과서적 과적합.
재현 사례: moss-trade-bot에서 Train PF 2.08 / OOS PF 0.94 — 비율 2.21, 전형적인 케이스 (전체 데이터는 dibi8 95至尊交易员记忆 아카이브 참고).
최소 거래 수 기준: 방향성 300, 평균 회귀 500, 최적화한 경우 1000+.
방어: walk-forward, 파라미터 민감도 스윕, 배포 시 OOS 게이트.
왜 이 주제가 중요한가 #
백테스트를 “통과"한 옵티마이저 산출 전략들은 라이브 거래에서 처참한 비율로 실패한다. 이유는 시장 레짐 변화가 아니다 (존재하긴 한다). 옵티마이저가 일반화되지 않는 노이즈 속 패턴을 찾아냈기 때문이다. 실패 모드를 카탈로그화하면 자본 리스크를 지기 전에 탐지할 수 있다.
패턴 1: Walk-Forward 괴리 #
정의: 학습 데이터에서는 잘 나오지만, out-of-sample (OOS) 데이터에서는 나쁘게 나오는 전략.
수치: Train PF 2.08, OOS PF 0.94. 비율 2.21.
원인: 옵티마이저가 학습 후 반복되지 않는 노이즈에 적합됨.
탐지: 항상 70/30으로 데이터 분할, 70%로 학습, 보류된 30%로 테스트. OOS PF < 0.7× Train PF면 전략 폐기.
예시: moss-trade-bot은 2024 Q1-Q2 BTC 데이터에서 진화 라운드를 거치며 PF가 0.99 → 2.08로 향상. 하지만 Q3-Q4 OOS에서는 PF 1.68 → 0.94 — 진화를 진행할수록 더 나빠졌다. 진화는 신호를 개선한 게 아니라 Q1-Q2 특유의 노이즈를 적합한 것.
패턴 2: 레짐 플립 (Regime-Flip) #
정의: 한 시장 레짐 (추세)에서는 작동하지만 다른 레짐 (횡보)에서는 실패하는 전략.
수치: 상승장 (2023 Q4): Sharpe 1.8. 횡보장 (2024 Q1): Sharpe -0.4.
원인: 전략의 edge가 항상 존재하지 않는 레짐별 다이내믹스에 의존.
탐지: 레짐 지표 (예: 200일 SMA 기울기, 변동성 분위)로 데이터를 분할. 레짐 간 성과 분산 > 1.5 Sharpe = 레짐 민감.
방어: (a) 레짐 탐지를 추가하고 거래를 게이팅하거나, (b) 특정 레짐에서만 작동함을 받아들이고 그에 맞게 사이징.
패턴 3: 파라미터 절벽 (Parameter-Cliff) #
정의: 파라미터가 1 단위 바뀔 때 결과가 불연속적으로 악화되는 전략.
예시 스윕 (lookback 파라미터):
lookback=12: PF 1.42
lookback=13: PF 1.55
lookback=14: PF 2.08 ← 옵티마이저 선택
lookback=15: PF 0.91
lookback=16: PF 0.87
14와 15 사이의 “절벽"에 경제적 설명이 없음 = 옵티마이저가 노이즈에서 국소 최대값을 찾음.
탐지: 선택된 파라미터 주변 ±3 항상 스윕. 매끄러운 감쇠 = 신호. 절벽 = 노이즈.
방어: 단일 값이 아닌 파라미터 범위를 사용. 왜 14가 맞고 15가 틀린지 정당화할 수 없으면 배포하지 말 것.
패턴 4: 인디케이터 스태킹 (Indicator-Stacking) #
정의: 인디케이터를 더 추가하면 백테스트 PF는 개선되지만 OOS 성과는 악화됨.
수치: 인디케이터 1개: Train PF 1.4 / OOS PF 1.3 (비율 1.08, 양호). 5개: Train PF 2.1 / OOS PF 1.0 (비율 2.1, 과적합).
원인: 파라미터가 많아질수록 자유도가 늘어나 노이즈 적합 능력이 커짐.
탐지: 인디케이터를 추가할 때마다 Train/OOS 비율 관찰. 비율 > 1.5 = 추가 중단.
방어: 인디케이터 1개로 시작. 새로 추가할 때마다 OOS 비율이 < 1.3을 유지할 때만 추가. 많고 약한 인디케이터보다 적고 견고한 것을 선호.
패턴 5: 생존 편향 (Survivorship Bias) #
정의: 오늘까지 살아남은 자산으로만 전략을 테스트하고 상장폐지된 자산을 무시.
수치: “현재” 시총 top-50 암호자산으로 테스트한 전략의 PF 2.5. “거래 당시” 시총 top-50 (이후 상장폐지된 코인 포함)으로 테스트: PF 1.1.
원인: 승자에 대한 암묵적 선택 — 생존자만 보임.
탐지: 데이터 소스 확인. 자산 리스트가 “현재 top-N"이면 생존 편향이 있다. “각 타임스탬프 시점의 top-N” (역사적 유니버스)이면 없다.
방어: Point-in-time 데이터베이스 사용. 암호: CryptoCompare 또는 CoinGecko 역사 유니버스. 주식: CRSP 상장폐지 데이터.
Train/OOS PF 비율 치트시트 #
| 비율 | 해석 | 행동 |
|---|---|---|
| < 1.0 | OOS가 train보다 좋음 | 의심 — 데이터 누설 재확인 |
| 1.0 - 1.3 | 건강 | 조심스럽게 진행, 페이퍼 트레이드 먼저 |
| 1.3 - 1.5 | 한계선 | 파라미터 줄이거나 데이터 추가 |
| 1.5 - 2.0 | 과적합 가능성 높음 | 배포 금지. Walk-forward 더 공격적으로 |
| > 2.0 | 교과서적 과적합 | 폐기하고 파라미터 줄여 재시작 |
우리가 쓰는 탐지 파이프라인 #
라이브 배포 전 모든 전략에 적용:
- 시간 순으로 70/30 데이터 분할.
- 70%에서만 파라미터 최적화.
- 동결된 파라미터로 30%에서 풀 백테스트.
- Train PF / OOS PF 비율 계산.
- 파라미터 민감도 스윕 (선택값 주변 ±3).
- 레짐 분할 (200일 SMA 상승 vs 하락) — 각각 Sharpe 확인.
- 4개 검사 모두 통과 → 페이퍼 트레이드 30일.
- 페이퍼 트레이드 Sharpe > 0.5 → 축소된 사이즈로 라이브 고려.
왜 대부분의 리테일 트레이더는 Walk-Forward를 건너뛰는가 #
솔직히: 귀찮고, 답이 보통 나쁜 소식이기 때문. 대부분의 리테일 트레이더는 자기 백테스트가 과적합이라는 사실을 알고 싶지 않다 — 그냥 배포하는 게 처음부터 다시 하는 것보다 재미있으니까. 이 파이프라인을 돌리는 규율이 자본 리스크 전에 전략의 80%를 죽인다 — 그게 이 파이프라인의 핵심이다.
추천 인프라 #
긴 백테스트 + walk-forward 스윕을 돌리려면:
- DigitalOcean — $200 크레딧, GPU droplet 사용 가능
- HTStack — 홍콩 VPS, 아시아 거래소까지 저지연
제휴 링크 — 가격은 동일, dibi8.com을 후원합니다.
결론 #
과적합은 하나의 현상이 아니다. 다섯 가지 패턴이며, 각각 고유한 시그니처와 특정한 탐지 방법이 있다. Train/OOS PF 비율은 단일 요약 지표로는 최고다 — 배포 전 단 하나만 확인할 시간이 있다면, 이걸 써라. 2.0을 넘으면 전략이 노이즈를 적합하고 있다. 거래하지 마라.
최근 moss-trade-bot 진화는 결국 교과서적 과적합 (비율 2.21)으로 끝났다. 이건 도구의 실패가 아니라 OOS 게이팅 없는 진화의 실패다. 해결책은 더 좋은 옵티마이저가 아니라 더 엄격한 검증 게이트다.
관련: Moss Trade Bot Factory 2026 리뷰 · Backtrader Python 백테스팅 · Jesse AI 트레이딩 프레임워크
💬 댓글 토론