v10 — “Trust Test” Phase
Vision
v1~v9은 탐색(exploration) 단계였다. 새 시그널/전략을 계속 추가했지만:
- 최고 config도 전 기간 29 trades → 통계적 신뢰 낮음
- 240개 config에서 best를 뽑는 건 multiple testing bias (Sharpe 2는 랜덤에서도 1~2개 나옴)
- OOS 2.5년은 짧음 (특히 2024~2026은 바이오텍 상대적 회복기)
- bear market에서 작동하는지 미검증
- 유니버스가 58종목으로 좁아 구조적 편향 가능
v10 = 새 전략 발굴 중단, 지금 있는 것이 “진짜인지” 검증하는 stress test 단계.
검증 후:
- 통과하는 전략 → 실전 배포 준비
- 실패하는 전략 → overfitting 삭제
- 부분 통과 → 개선 방향 명확화
Goals (검증 통과 기준)
| # | Criterion | Threshold |
|---|---|---|
| G1 | Walk-forward 일관성 | 동일 전략이 5회 walk-forward 중 ≥3회 top-5 선정 |
| G2 | Bootstrap Sharpe 95% CI | lower bound ≥ 0.5 |
| G3 | Regime robustness | bear (XBI < 200MA) 구간에서 Sharpe > 0 |
| G4 | Universe expansion 생존 | 완화된 universe에서 OOS Sharpe ≥ 0.7 유지 |
| G5 | 실전 배포 가능성 | 위 4개 + 연 15+ 트레이드 |
모든 기준 통과 = Grade A (실전 배포) 3/5 통과 = Grade B (추가 검증 필요) 2/5 이하 = Grade C (폐기 또는 재설계)
Scope — 6 Phases
Phase A: Walk-Forward Validation 🔬
목적: OOS Sharpe가 진짜 edge인지, 특정 시점 운인지 판별.
방법:
For year Y in [2020, 2021, 2022, 2023, 2024, 2025]:
Training: 2017-11 ~ (Y-1)-12
Test: Y-01 ~ Y-12
On training, find top-10 configs by Sharpe (ranked set R_train)
On test, evaluate R_train configs; record actual OOS metrics
산출물:
walk_forward_results.csv: Y × top-10 × metricswinner_consistency.csv: 각 전략이 몇 번 top-10에 들었는지walk_forward_report.md: 연도별 winner/loser 분석
핵심 질문:
- 2020 training에서 top이던 전략이 2021 OOS에서도 top인가?
- “일관된 승자”가 존재하는가?
- 어떤 전략이 가장 robust한가?
예상 결과:
- 만약 v9 best (bb_20 × fixed_100_40)이 walk-forward에서 흔들리면 → overfitting 확정
- 3회 이상 top-5 드는 전략이 있다면 → 진짜 edge 가능성
Phase B: Bootstrap Confidence Intervals 📊
목적: 상위 전략들의 metric 불확실성 정량화.
방법: 각 상위 20개 config (v9 top_by_sharpe) 에 대해:
- Trade set을 랜덤 resampling (with replacement) N=1000번
- 각 resample에서 Sharpe, CAGR, MaxDD 계산
- 95% CI 생성
산출물:
bootstrap_ci.csv: config × {Sharpe_mean, Sharpe_5th, Sharpe_95th, CAGR_…, MaxDD_…}bootstrap_chart.png: CI band 시각화- 해석: Sharpe > 0.5 lower bound인 config 목록
핵심 질문:
- 최고 Sharpe 2.39 config의 실제 95% CI는?
- CI가 0을 크로스하면 edge 자체가 의심
Phase C: Regime Analysis 🌡️
목적: Bull/Bear/Recovery 상태별 전략 성과 분해.
Regime 정의:
XBI daily close와 200-day MA 비교:
- Bull: XBI > 200MA × 1.02 (margin으로 whipsaw 방지)
- Bear: XBI < 200MA × 0.98
- Neutral: 그 사이
Regime window by entry_date:
- For each trade, classify entry_regime based on XBI at entry_date
분석: 각 상위 10개 config에 대해:
- Bull regime trades: return, WR, Sharpe
- Bear regime trades: return, WR, Sharpe
- Neutral regime trades: return, WR, Sharpe
추가 실험: Regime Filter Entry
- “XBI < 200MA일 때 진입 금지” 필터 추가 → 전체 성과 개선되는가?
- “XBI > 200MA일 때만 진입” (bull only)
산출물:
regime_analysis.csv: config × regime × metricsxbi_regime_chart.png: XBI + regime bands + trade entry dotsregime_filter_comparison.csv: with/without filter 성과
핵심 질문:
- “전략이 모든 regime에서 작동하는가?”
- “Bear 회피 필터가 return 희생 대비 Sharpe 얼마 개선?”
Phase D: Universe Expansion 🎯
목적: 유니버스가 너무 좁아 표본 부족인가, 넓히면 edge 소실인가?
실험 설계: 다음 6개 universe variant를 같은 top-5 전략(v9 best)으로 백테스트:
| Variant | ATH DD | Cash/MCap | MCap | 예상 symbols |
|---|---|---|---|---|
| V0 (baseline) | ≤-95% | ≥2.0 | ≥$20M | ~58 |
| V1 (looser cash) | ≤-95% | ≥1.5 | ≥$20M | ~90 |
| V2 (looser ATH) | ≤-90% | ≥2.0 | ≥$20M | ~100 |
| V3 (smaller mcap) | ≤-95% | ≥2.0 | ≥$10M | ~80 |
| V4 (combined relax) | ≤-90% | ≥1.5 | ≥$10M | ~150+ |
| V5 (tight) | ≤-95% | ≥3.0 | ≥$20M | ~30 |
분석: 각 variant × 상위 10개 전략 조합 (60 configs) 재실행.
산출물:
universe_expansion.csv: universe × strategy × metricsuniverse_tradeoff.png: universe size vs Sharpe, Sharpe vs n_trades
핵심 질문:
- 유니버스 완화 시 edge 얼마나 희석?
- 가장 Sharpe-robust한 universe 설정?
- 실전 거래 가능한 최소 유니버스 크기?
Phase E: Advanced Position Sizing 📐
목적: 고정 12.5% sizing을 개선할 여지.
실험:
E1. Volatility-Targeted Sizing
volatility_target = 0.20 # 20% annualized vol target
symbol_vol = std of past 60d returns × √252
position_size = min(max_pct, vol_target / symbol_vol) × initial
더 변동성 큰 종목은 작게, 낮은 변동성은 크게.
E2. Kelly Fraction (Continuous)
Edge per trade = mean(returns) / mean(|losses|) # from rolling 20 trades
Kelly f = edge / variance
position_size = f × 0.5 (safety factor) × total_equity
E3. Signal-Strength Weighted
예) bb_20 시그널의 경우 저점 대비 반등 강도 ∈ [0.20, 1.00]
weight = (bounce_strength - 0.20) / 0.80 # [0, 1]
position_size = max_pct × (0.5 + 0.5 × weight)
E4. Confidence-Weighted (ensemble)
N 개 시그널 동시 발화 시 size = base × N/max_signals (단, ≤ max)
분석: 상위 5개 전략 × 4 sizing 방법 = 20 configs 재실행.
산출물:
sizing_comparison.csv: strategy × sizing × metricssizing_impact_chart.png
핵심 질문:
- Fixed % vs Vol-adj: 어느 쪽이 CAGR/MaxDD trade-off 우수?
- Kelly는 이론적으로 최적이지만 실제에서는 robust한가?
Phase F: Winner Deep Dive 🔍
목적: 수익 trade들의 공통 feature 찾기 → 향후 필터 개선 근거.
분석 대상: v9 상위 전략의 winning trades (예: 37개)
Feature 비교 (Winner vs Loser): 각 trade에 대해 계산:
- 진입 시점 RSI (14, 30)
- 진입 시점 거래량/20d 평균 (volume ratio)
- 진입 시점 bb_position (Bollinger Bands 내 위치)
- 진입 시점 ATH 대비 %
- 진입 시점 Cash/MCap
- 진입 시점 market cap
- 진입 시점 pipeline trial count
- 진입 시점 XBI regime
- 진입 시점부터 다음 catalyst까지 거리
통계적 차이: Winner vs Loser 분포 비교 (Mann-Whitney test).
산출물:
winner_features.csv: 모든 trade + featureswinner_analysis.md: 특징별 히스토그램, p-value, 해석feature_importance.png: 승률 예측력 순위
핵심 질문:
- “Winner만의 특징”이 있는가?
- 있다면 이를 필터로 넣었을 때 승률 개선?
- → v11의 “filter-enhanced” 전략 후보
Execution Order (권장)
Week 1: Phase A (Walk-forward) + Phase B (Bootstrap)
Week 2: Phase C (Regime)
Week 3: Phase D (Universe expansion)
Week 4: Phase E (Position sizing)
Week 5: Phase F (Winner deep dive) + 종합 리포트
병렬 가능: A/B 함께, D/E 함께.
Deliverables
-
Phase별 리포트 (6개):
biotech/results/v10/phase_{a-f}/report.md- 각 리포트에 차트 + raw CSV/JSON + 해석 포함
-
통합 v10 리포트 (
biotech/results/v10/final_report.md):- Grade 부여 (A/B/C) per 상위 전략
- 실전 배포 권장 여부
- Limitations & next steps
-
Unit tests for new functionality
- Walk-forward runner
- Bootstrap utility
- Regime classifier
- New sizing functions
-
코드 모듈:
engine/validation.py— walk-forward, bootstrapengine/regime.py— XBI regime classifierengine/sizing.py— position sizing strategiesscripts/run_v10_{a-f}.py— 각 phase runner
Success Criteria
v10 전체가 성공적이었다고 말하려면:
- 적어도 1개 전략이 Grade A 획득 (모든 검증 통과)
- 적어도 2개 전략이 Grade B 이상 (실전 후보)
- 실전 배포 가능성 명확 (yes/no with 근거)
- Overfitted 전략 식별 완료 (폐기 목록)
- 다음 단계(v11)의 구체적 방향 확정
Data Requirements
새 데이터:
- XBI 가격 데이터 — FMP에서 가져와 DuckDB에 추가 필요 (현재 없음)
- 기존 데이터 전부 활용
Risks & Challenges
- Walk-forward 데이터 부족: 2017-11~2019 구간은 trades 매우 적음 → 2020부터 시작
- Bootstrap 편향: 소표본(< 30 trades)에서 CI 신뢰성 낮음 → 표시만 하고 해석 조심
- Regime classification 노이즈: 200MA 기준 크로스 잦음 → smoothing 적용
- Universe 확장 시 데이터 품질: 낮은 MCap 종목은 거래량/상장폐지 이슈 증가
- Computation time: Walk-forward × sizing × universe 가 곱해지면 grid 수백 개
Potential Quick Wins
지금 데이터로 바로 가능한 “작고 의미있는” 분석:
- v9 상위 10 전략의 IS/OOS ratio 분포 → 가장 stable한 것 식별
- 연도별 Sharpe 분포 → 어느 해가 이상치인지
- Sector concentration: 승리 trades의 심볼 중복도
- Exit reason 분포 across winners: take_profit이 몇 %?
이걸 Phase A 들어가기 전 “v10-prelim”으로 1~2시간 분석으로 먼저 해볼 수도 있음.
Next Step
이 기획서 합의 후:
- XBI 데이터 FMP에서 받아오기
engine/validation.py,engine/regime.py초기 skeleton 구현- Phase A Walk-forward 먼저 돌리기
작성자: Lucky 검토 필요: Dan