# 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** | 다양한 환경에서 안정적 성과 | | 40–69 | **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` 서브커맨드 라우팅 |