# 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" |
