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 (검증 통과 기준)

#CriterionThreshold
G1Walk-forward 일관성동일 전략이 5회 walk-forward 중 ≥3회 top-5 선정
G2Bootstrap Sharpe 95% CIlower bound ≥ 0.5
G3Regime robustnessbear (XBI < 200MA) 구간에서 Sharpe > 0
G4Universe 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 × metrics
  • winner_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) 에 대해:

  1. Trade set을 랜덤 resampling (with replacement) N=1000번
  2. 각 resample에서 Sharpe, CAGR, MaxDD 계산
  3. 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 × metrics
  • xbi_regime_chart.png: XBI + regime bands + trade entry dots
  • regime_filter_comparison.csv: with/without filter 성과

핵심 질문:

  • “전략이 모든 regime에서 작동하는가?”
  • “Bear 회피 필터가 return 희생 대비 Sharpe 얼마 개선?”

Phase D: Universe Expansion 🎯

목적: 유니버스가 너무 좁아 표본 부족인가, 넓히면 edge 소실인가?

실험 설계: 다음 6개 universe variant를 같은 top-5 전략(v9 best)으로 백테스트:

VariantATH DDCash/MCapMCap예상 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 × metrics
  • universe_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 × metrics
  • sizing_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 + features
  • winner_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

  1. Phase별 리포트 (6개):

    • biotech/results/v10/phase_{a-f}/report.md
    • 각 리포트에 차트 + raw CSV/JSON + 해석 포함
  2. 통합 v10 리포트 (biotech/results/v10/final_report.md):

    • Grade 부여 (A/B/C) per 상위 전략
    • 실전 배포 권장 여부
    • Limitations & next steps
  3. Unit tests for new functionality

    • Walk-forward runner
    • Bootstrap utility
    • Regime classifier
    • New sizing functions
  4. 코드 모듈:

    • engine/validation.py — walk-forward, bootstrap
    • engine/regime.py — XBI regime classifier
    • engine/sizing.py — position sizing strategies
    • scripts/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

  1. Walk-forward 데이터 부족: 2017-11~2019 구간은 trades 매우 적음 → 2020부터 시작
  2. Bootstrap 편향: 소표본(< 30 trades)에서 CI 신뢰성 낮음 → 표시만 하고 해석 조심
  3. Regime classification 노이즈: 200MA 기준 크로스 잦음 → smoothing 적용
  4. Universe 확장 시 데이터 품질: 낮은 MCap 종목은 거래량/상장폐지 이슈 증가
  5. Computation time: Walk-forward × sizing × universe 가 곱해지면 grid 수백 개

Potential Quick Wins

지금 데이터로 바로 가능한 “작고 의미있는” 분석:

  1. v9 상위 10 전략의 IS/OOS ratio 분포 → 가장 stable한 것 식별
  2. 연도별 Sharpe 분포 → 어느 해가 이상치인지
  3. Sector concentration: 승리 trades의 심볼 중복도
  4. Exit reason 분포 across winners: take_profit이 몇 %?

이걸 Phase A 들어가기 전 “v10-prelim”으로 1~2시간 분석으로 먼저 해볼 수도 있음.

Next Step

이 기획서 합의 후:

  1. XBI 데이터 FMP에서 받아오기
  2. engine/validation.py, engine/regime.py 초기 skeleton 구현
  3. Phase A Walk-forward 먼저 돌리기

작성자: Lucky 검토 필요: Dan