You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
6.7 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Scenario Robustness Test — `fithia2 scenario-test`
합성 시장 데이터를 이용해 다양한 시장 환경에서 전략을 검증하고 과적합/취약점을 탐지하는 도구.
`overfit-check`**실제 데이터 기반 통계 검증**이라면, `scenario-test`**역사에 없었던 시장 환경**에 대한 내성 테스트다.
예: "VIX가 지속적으로 30이었다면?", "2022년 하락장이 2배 길었다면?", "유동성이 60% 증발했다면?"
---
## 빠른 사용법
```bash
# 3개 핵심 시나리오 (2~3초)
fithia2 scenario-test --config return_max_long_v7.70 --quick
# 전체 12개 시나리오 (~10초)
fithia2 scenario-test --config return_max_long_v7.70
# 특정 시나리오만
fithia2 scenario-test --config return_max_long_v7.70 --scenario crash_v_recovery
# 시나리오 그룹
fithia2 scenario-test --config return_max_long_v7.70 --group structural
fithia2 scenario-test --config return_max_long_v7.70 --group signal
```
`--config`에는 실험 이름, ID(숫자), 파일 경로 모두 사용 가능.
---
## 12개 사전 정의 시나리오
| 시나리오 | 시장 특성 | VIX | 신호강도 | 목적 |
|----------|----------|-----|---------|------|
| `steady_bull` | drift +15%, vol 14%, 252d | 14 | 0.35 | 기본 수익 환경 기준선 |
| `steady_bear` | drift -20%, vol 22%, 252d | 28 | 0.35 | 장기 하락 + Gate 0 동작 확인 |
| `crash_v_recovery` | 60d 정상 → 20d 폭락 → 172d 회복 | 15→45 | 0.35 | 폭락 복원력 |
| `prolonged_bear` | drift -15%, vol 25%, 504d | 30 | 0.30 | 역사보다 긴 2년 하락 |
| `low_vol_grind` | drift +8%, vol 8% | 11 | 0.20 | 저변동 환경 (ATR 축소) |
| `high_vol_chop` | drift 0%, vol 30% | 32 | 0.25 | 방향 없는 고변동 횡보 |
| `regime_switch` | 60d 상승/하락 4회 교대 | 20 | 0.30 | 빈번한 레짐 전환 |
| `vix_spike` | 정상 + 5회 VIX 급등(40+) | 18 | 0.35 | 스트레스 클러스터 |
| `no_signal` | drift 0%, vol 16%, 신호 없음 | 16 | **0.00** | 가격 패턴 과적합 탐지 |
| `strong_signal` | drift +10%, vol 16%, 강한 신호 | 16 | **0.60** | 이벤트 알파 포착 확인 |
| `sector_rotation` | 분기별 섹터 순환 | 20 | 0.35 | 섹터 집중 리스크 |
| `liquidity_drought` | drift +5%, vol 18%, 거래량 -70% | 22 | 0.30 | 유동성 필터 영향 |
### 시나리오 그룹
| 그룹 | 포함 시나리오 |
|------|-------------|
| `trend` | steady_bull, steady_bear, prolonged_bear |
| `volatility` | low_vol_grind, high_vol_chop, vix_spike |
| `regime` | regime_switch, crash_v_recovery |
| `signal` | no_signal, strong_signal |
| `structural` | sector_rotation, liquidity_drought |
| `quick` | steady_bull, steady_bear, no_signal |
| `all` | 전체 12개 |
---
## Regime Robustness Score (RRS)
5개 하위 점수의 가중 합산으로 전략의 환경 내성을 0-100으로 표현한다.
```
RRS = 0.25 × Signal Integrity
+ 0.25 × Breadth
+ 0.20 × Drawdown Resilience
+ 0.15 × Regime Transition
+ 0.15 × Stability
```
| 하위 점수 | 가중치 | 계산 방법 |
|-----------|--------|----------|
| **Signal Integrity** | 25% | `no_signal` Sharpe ≤ 0이면 100. `no_signal``strong_signal`이면 0. 선형 보간. |
| **Breadth** | 25% | Sharpe > 0인 시나리오 비율 × 100 |
| **Drawdown Resilience** | 20% | `100 × (1 - 최악_DD / 50)`, 0-100 범위 클램핑 |
| **Regime Transition** | 15% | `regime_switch` Sharpe / 중앙값 Sharpe, 100 상한 |
| **Stability** | 15% | `100 × (1 - CV)`, CV = Sharpe의 변동계수 |
### 판정 기준
| RRS | 판정 | 의미 |
|-----|------|------|
| ≥ 70 | **ROBUST** | 다양한 환경에서 안정적 성과 |
| 4069 | **FRAGILE** | 특정 환경 의존성 있음 |
| < 40 | **OVERFIT** | 가격 패턴 또는 특정 레짐에 과적합 |
---
## 결과 해석 가이드
### v7.70 기준 시나리오별 해석
```
시장 환경 Sharpe 운용 판단
──────────────────────────────────────────────
steady_bull +1.09 ✅ 정상 운용, 풀 사이징
crash+회복 +0.41 ✅ 폭락 후 회복 구간 운용 가능
vix_spike +0.30 ✅ VIX 급등 이벤트, 소폭 수익
prolonged_bear +0.13 ⚠️ 2년 하락장, flat → 사이징 축소
steady_bear +0.03 ⚠️ 하락장, 간신히 손익분기 → 방어 모드
──────────────────────────────────────────────
regime_switch -0.56 🔴 방향 빈번 전환 → 쉬어야 함
low_vol_grind -0.40 🔴 변동성 너무 낮음 → 신호 희박
high_vol_chop -1.11 🔴 방향 없는 고변동 → 매우 위험
liquidity_drought -1.10 🔴 거래량 증발 → 진입 자체 불리
sector_rotation -1.40 🔴 섹터 로테이션 → 최악 환경
```
### 현재 시장 매핑
| 실시간 지표 | 해당 시나리오 | 운용 판단 |
|------------|--------------|---------|
| SPY 상승, VIX < 20 | steady_bull | 운용 |
| SPY 횡보, VIX 20~30 | regime_switch | 사이징 50% |
| VIX 35+ 급등 | vix_spike | 소폭 or 대기 |
| SPY SMA 아래 지속 하락 | steady_bear | 방어, 최소 운용 |
| 거래량 급감 (ADV -40%+) | liquidity_drought | 일시 중단 |
---
## 주요 Status 플래그
| 플래그 | 조건 | 의미 |
|--------|------|------|
| `OVERFIT` | `no_signal` Sharpe > `strong_signal` Sharpe | 이벤트 신호 없이도 수익 → 가격 패턴 과적합 |
| `WEAK` | `strong_signal` Sharpe < 0 | 강한 알파 환경에서도 손실 셀렉션 기준 불일치 |
---
## 전략 비교 활용
```bash
# 취약 환경에서 새 전략이 개선됐는지 확인
fithia2 scenario-test --config return_max_long_v11.x --group structural
# sector_rotation / liquidity_drought 내성 개선 여부 비교
# → 두 Sharpe 모두 -1.0 이하면 개선 없음, -0.5 이상이면 유의미한 개선
```
---
## 구현 파일
| 파일 | 역할 |
|------|------|
| `libs/backtest/scenarios/price_gen.py` | Regime-switching GBM + 점프 확산 OHLCV 생성 |
| `libs/backtest/scenarios/macro_gen.py` | VIX/HY OU 프로세스, SPY/QQQ + 롤링 통계 |
| `libs/backtest/scenarios/event_gen.py` | 합성 이벤트 후보 전체 필드 생성 |
| `libs/backtest/scenarios/coupling.py` | 이벤트-가격 신호 커플링 (signal_strength 제어) |
| `libs/backtest/scenarios/store_builder.py` | SnapshotStore 조립 파이프라인 |
| `libs/backtest/scenarios/scenarios.py` | 12 사전 정의 시나리오 + 레지스트리 |
| `libs/backtest/scenarios/robustness.py` | RRS 계산 + 판정 로직 |
| `apps/scenario/cli.py` | CLI 진입점, Rich 테이블 + RRS 패널 |
| `apps/tracker/cli.py` | `scenario-test` 서브커맨드 라우팅 |