|
|
# Overfitting Analysis — `fithia2 overfit-check`
|
|
|
|
|
|
전략의 과적합 여부를 학술 논문 기반 5가지 테스트로 종합 검증하는 도구.
|
|
|
|
|
|
## 빠른 사용법
|
|
|
|
|
|
```bash
|
|
|
# 빠른 검사 (~7분, MC 10회 + Permutation 30회)
|
|
|
fithia2 overfit-check --config 415 --quick
|
|
|
|
|
|
# 전체 검사 (~30분, MC 50회 + Permutation 100회)
|
|
|
fithia2 overfit-check --config return_max_long_v7.70
|
|
|
|
|
|
# 특정 테스트만 실행
|
|
|
fithia2 overfit-check --config 415 --skip mc,permutation
|
|
|
|
|
|
# JSON 리포트 저장
|
|
|
fithia2 overfit-check --config 415 --quick --output-json report.json
|
|
|
```
|
|
|
|
|
|
`--config`에는 실험 ID(숫자), 이름, 파일 경로 모두 사용 가능.
|
|
|
|
|
|
---
|
|
|
|
|
|
## 5가지 테스트
|
|
|
|
|
|
### 1. DSR (Deflated Sharpe Ratio)
|
|
|
|
|
|
**논문**: Bailey & Lopez de Prado (2014), "The Deflated Sharpe Ratio"
|
|
|
|
|
|
N번의 전략 시도 중 최고 Sharpe가 **운이 아닌 진짜인지** 통계적으로 검증한다. 핵심 아이디어: N번 시도하면 random에서도 꽤 높은 Sharpe가 나올 수 있음. DSR은 이 "기대되는 최대 Sharpe"를 계산하고, 실제 관측된 Sharpe가 그보다 유의미하게 높은지 테스트한다.
|
|
|
|
|
|
**입력**: 같은 parent 계보에서 파생된 모든 sibling 전략의 CW equity curve
|
|
|
**출력**:
|
|
|
- DSR p-value: 1.0에 가까울수록 유의미 (>0.95 = PASS)
|
|
|
- Sharpe Haircut: Sharpe의 몇 %가 "운"인지
|
|
|
- MinTRL (Minimum Track Record Length): 이 Sharpe가 유의미하려면 최소 몇 일의 데이터가 필요한지
|
|
|
|
|
|
**판정 기준**:
|
|
|
| DSR p-value | 판정 | 의미 |
|
|
|
|-------------|------|------|
|
|
|
| > 0.95 | PASS | N번 시도 보정 후에도 통계적으로 유의미 |
|
|
|
| 0.50–0.95 | WARN | 약한 유의미성, 추가 검증 필요 |
|
|
|
| < 0.50 | FAIL | random에서 나올 수 있는 수준 |
|
|
|
|
|
|
**예시 해석**: "75개 전략을 테스트했고, 최고 Sharpe 3.13의 DSR = 100%. Haircut 14.5% → Sharpe의 85.5%가 실력."
|
|
|
|
|
|
---
|
|
|
|
|
|
### 2. PBO (Probability of Backtest Overfitting)
|
|
|
|
|
|
**논문**: Bailey, Borwein, Lopez de Prado & Zhu (2017), "The Probability of Backtest Overfitting"
|
|
|
|
|
|
IS(In-Sample)에서 최적인 전략이 OOS(Out-of-Sample)에서도 잘하는지를 **252가지 데이터 분할**로 검증한다.
|
|
|
|
|
|
**알고리즘 (CSCV — Combinatorially Symmetric Cross-Validation)**:
|
|
|
1. 전체 기간을 S=10개 시간 블록으로 분할
|
|
|
2. C(10,5) = 252가지 조합으로 5블록=IS, 5블록=OOS 구성
|
|
|
3. 각 조합에서: IS 최적 전략을 고르고, 그 전략의 OOS 순위를 측정
|
|
|
4. PBO = IS 최적이 OOS에서 중앙값 이하인 확률
|
|
|
|
|
|
**판정 기준**:
|
|
|
| PBO | 판정 | 의미 |
|
|
|
|-----|------|------|
|
|
|
| < 10% | PASS | IS 최적화가 OOS에서도 신뢰 가능 |
|
|
|
| 10–30% | WARN | 약간의 과적합 위험 |
|
|
|
| > 30% | FAIL | IS 최적화가 OOS 성과를 해칠 가능성 높음 |
|
|
|
|
|
|
**예시 해석**: "PBO 5.1%. 252개 조합 중 94.8%에서 IS 최적 전략이 OOS 상위 50%."
|
|
|
|
|
|
---
|
|
|
|
|
|
### 3. Parameter Sensitivity (파라미터 민감도)
|
|
|
|
|
|
**배경**: Harvey, Liu & Zhu (2016), "...and the Cross-Section of Expected Returns"
|
|
|
|
|
|
최적 파라미터 주변에서 성능이 **완만한 고원(plateau)**인지 **급격한 절벽(cliff)**인지 확인한다. 고원이면 robust, 절벽이면 curve-fit.
|
|
|
|
|
|
**방법**:
|
|
|
1. 핵심 파라미터 (per_trade_risk, max_daily_risk 등)를 현재 값의 ±30% 그리드로 변경
|
|
|
2. 각 값에서 백테스트 실행
|
|
|
3. Sharpe의 변동계수(CV)로 plateau score 계산: `1 - (std/mean)`
|
|
|
|
|
|
**판정 기준**:
|
|
|
| Plateau score | 판정 | 의미 |
|
|
|
|---------------|------|------|
|
|
|
| > 0.70 | PASS | 넓은 고원 — 파라미터에 둔감 |
|
|
|
| 0.40–0.70 | WARN | 약간의 민감도 |
|
|
|
| < 0.40 | FAIL | 절벽 — 좁은 파라미터에서만 작동 |
|
|
|
|
|
|
---
|
|
|
|
|
|
### 4. Monte Carlo Noise Injection (노이즈 주입)
|
|
|
|
|
|
**배경**: Lopez de Prado (2018), "Advances in Financial Machine Learning"
|
|
|
|
|
|
가격 데이터에 **랜덤 노이즈를 넣고** 백테스트를 반복해서, 성능이 서서히 줄면 robust, 급락하면 특정 가격 패턴에 curve-fit된 것.
|
|
|
|
|
|
**방법**:
|
|
|
1. 모든 OHLC 가격에 `price × (1 + N(0, σ))` 노이즈 추가 (기본 σ=0.5%)
|
|
|
2. N회 반복 (기본 50회)하여 Sharpe 분포 생성
|
|
|
3. 기준선 대비 중앙값 저하율(degradation) 계산
|
|
|
|
|
|
**판정 기준**:
|
|
|
| Degradation | 판정 | 의미 |
|
|
|
|-------------|------|------|
|
|
|
| < 15% | PASS | 노이즈에 대해 완만하게 저하 — 견고한 신호 |
|
|
|
| 15–35% | WARN | 약간 민감 |
|
|
|
| > 35% | FAIL | 특정 가격 수준에 의존 — curve-fit |
|
|
|
|
|
|
**예시 해석**: "0.5% 노이즈 50회 주입. Sharpe 2.61 → 중앙값 2.18 (16.3% 저하). 5th percentile 1.97."
|
|
|
|
|
|
---
|
|
|
|
|
|
### 5. Walk-Forward Permutation Test (순열 검정)
|
|
|
|
|
|
**배경**: White (2000), "A Reality Check for Data Snooping"
|
|
|
|
|
|
가격 수익률의 시간 순서를 **셔플**하여 alpha 신호를 파괴한 후 WFV를 실행. 진짜 alpha가 있다면 셔플된 데이터에서는 성능이 나올 수 없다.
|
|
|
|
|
|
**방법**:
|
|
|
1. 원본 데이터로 WFV 실행 → observed Sharpe
|
|
|
2. candidate들의 날짜를 랜덤 재배정(alpha 파괴) → N회 반복
|
|
|
3. 각 셔플에서 WFV Sharpe 측정 → null distribution 생성
|
|
|
4. p-value = null에서 observed 이상인 비율
|
|
|
|
|
|
**판정 기준**:
|
|
|
| p-value | 판정 | 의미 |
|
|
|
|---------|------|------|
|
|
|
| < 0.01 | PASS | 셔플 중 1% 미만만 이 성과 달성 — 강한 alpha |
|
|
|
| 0.01–0.05 | WARN | 약한 유의미성 |
|
|
|
| > 0.05 | FAIL | random에서도 달성 가능한 성과 |
|
|
|
|
|
|
**예시 해석**: "30회 셔플 중 0회가 관측 Sharpe(3.66) 이상. p=0.000. random이 아닌 진짜 alpha."
|
|
|
|
|
|
---
|
|
|
|
|
|
## 종합 점수 (Overall Score)
|
|
|
|
|
|
5개 테스트를 가중 평균하여 0-100 점수와 PASS/WARN/FAIL 판정을 부여한다.
|
|
|
|
|
|
| 테스트 | 가중치 | 이유 |
|
|
|
|--------|--------|------|
|
|
|
| DSR | 25% | Multiple testing 보정의 핵심 |
|
|
|
| PBO | 25% | Cross-validation 기반 과적합 확률 |
|
|
|
| Sensitivity | 15% | 파라미터 robustness |
|
|
|
| Monte Carlo | 20% | 데이터 noise robustness |
|
|
|
| Permutation | 15% | alpha 존재 여부의 최종 검증 |
|
|
|
|
|
|
| 점수 | 판정 | 의미 |
|
|
|
|------|------|------|
|
|
|
| ≥ 70 | PASS | 전략이 과적합 테스트를 통과 |
|
|
|
| 40–69 | WARN | 일부 위험 신호 — 추가 검토 필요 |
|
|
|
| < 40 | FAIL | 과적합 가능성 높음 — 실전 사용 비추천 |
|
|
|
|
|
|
---
|
|
|
|
|
|
## CLI 옵션
|
|
|
|
|
|
```
|
|
|
fithia2 overfit-check [옵션]
|
|
|
|
|
|
필수:
|
|
|
--config, -c 실험 ID, 이름, 또는 파일 경로
|
|
|
|
|
|
선택:
|
|
|
--initial-equity 초기 자본 (기본: 10,000)
|
|
|
--quick 빠른 모드 (MC 10회, Perm 30회)
|
|
|
--skip 건너뛸 테스트 (쉼표 구분): dsr,pbo,sensitivity,mc,permutation
|
|
|
--mc-iterations MC 반복 횟수 (기본: 50)
|
|
|
--mc-noise-pct 노이즈 수준 % (기본: 0.5)
|
|
|
--permutations 순열 테스트 횟수 (기본: 100)
|
|
|
--output-json 리포트를 JSON 파일로 저장
|
|
|
```
|
|
|
|
|
|
### 실행 시간 예상
|
|
|
|
|
|
| 모드 | MC | Perm | 총 시간 |
|
|
|
|------|-----|------|---------|
|
|
|
| `--quick` | 10회 | 30회 | ~7분 |
|
|
|
| 기본 | 50회 | 100회 | ~25분 |
|
|
|
| 정밀 (`--mc-iterations 100 --permutations 500`) | 100회 | 500회 | ~2시간 |
|
|
|
|
|
|
DSR과 PBO는 기존 실행 결과(equity curve)를 재활용하므로 즉시 완료.
|
|
|
|
|
|
---
|
|
|
|
|
|
## 구현 파일
|
|
|
|
|
|
| 파일 | 역할 |
|
|
|
|------|------|
|
|
|
| `libs/backtest/overfit.py` | 핵심 통계 엔진 — DSR, PBO/CSCV, sensitivity, MC, permutation 계산 |
|
|
|
| `apps/overfit/cli.py` | CLI 진입점, Rich 리포트 포매팅, 백테스트 실행 통합 |
|
|
|
| `apps/tracker/cli.py` | `overfit-check` 서브커맨드 라우팅 (line ~877) |
|
|
|
|
|
|
---
|
|
|
|
|
|
## 참고 논문
|
|
|
|
|
|
| 테스트 | 논문 |
|
|
|
|--------|------|
|
|
|
| DSR | Bailey & Lopez de Prado (2014), "The Deflated Sharpe Ratio" |
|
|
|
| PBO/CSCV | Bailey, Borwein, Lopez de Prado & Zhu (2017), "The Probability of Backtest Overfitting" |
|
|
|
| Haircut SR | Harvey, Liu & Zhu (2016), "...and the Cross-Section of Expected Returns" |
|
|
|
| Reality Check | White (2000), "A Reality Check for Data Snooping" |
|
|
|
| CPCV | Lopez de Prado (2018), "Advances in Financial Machine Learning" |
|