Lucky Bio Backtest — 코드베이스 리뷰

2026-04-13 | Reviewed by Lucky


1. 전체 구조

lucky-bio-backtest/
├── docs/research/          # 투자 thesis, 백테스트 스펙, 데이터소스 조사
├── biotech/backtest/
│   ├── config.py           # Phase A-D 파라미터
│   ├── engine/             # 핵심 엔진 (universe, entry, exit, metrics, reversal_patterns, data)
│   ├── runners/            # 테스트 실행기 (phase_a~d, optimizer, experiments)
│   ├── auto_pipeline/      # 4단계 자동 평가 파이프라인
│   ├── charts/             # 시각화 (equity, heatmap, distribution, comparison)
│   └── data/               # DuckDB (1.89M rows, 1,104 종목)
└── biotech/results/        # 실험 결과들 (run별 폴더)

Python 모듈 67개 / 파일 총 933개


2. 투자 Thesis 요약

핵심: NASDAQ/NYSE 상장 바이오텍 중 폭락한 종목(-90%+ ATH drawdown)에서 유효한 파이프라인 + 충분한 현금을 가진 종목을 골라, 기술적 반전 시그널에 매수 → 이벤트 드리븐 랠리에 매도.

필터 로직 (3-factor intersection):

  1. 기술적: ATH 대비 -90% 이상 하락
  2. 펀더멘털: 순현금 ≥ 4분기 burn rate, Phase 2+ 파이프라인
  3. 시간: IPO 후 1~10년

비대칭 수익 구조: 5~15% 거래가 100%+ 수익 → fat tail 전략


3. 엔진 모듈 분석

universe.py (924줄)

  • 5개 핵심 필터 배치 프리컴퓨트 (ATH drawdown, cash runway, cash/mcap, pipeline, IPO age)
  • 월간 리밸런싱 (매월 1일)
  • 포워드 리턴 계산 + 벤치마크 비교 (Mann-Whitney U test)

entry.py (~700줄)

  • 7개 진입 시그널: bottom_bounce, volume_explosion, insider_buy, ma_recovery, sec_filing_trigger, double_bottom, volume_spike_reversal
  • 90일 쿨다운으로 시그널 클러스터링 방지

exit.py (~400줄)

  • 4종 출구: fixed (TP/SL), trailing, dynamic_sl (스윙로우 기반), scaled (분할 익절)

reversal_patterns.py (~300줄)

  • 8개 패턴 중 3개 구현 완료 (bullish engulfing, piercing, morning star)
  • 5개 미구현 (key reversal, outside reversal, Wyckoff spring, 2B, 3-bar flush)

metrics.py (146줄)

  • 포트폴리오: CAGR, max DD, Sharpe, Sortino, Calmar
  • 트레이드: win rate, profit factor, avg P/L ratio, expectancy

portfolio.py

  • 스텁 상태 — 포지션 사이징, 동시 보유 제한, 슬리피지 미구현

4. 백테스트 결과 요약

Phase A — 유니버스 필터 검증 (2026-03-17)

기간필터 평균벤치마크 평균p-value
30일+5.5%-0.1%<0.001
90일+17.5%0.0%<0.001
180일+35.6%+0.2%<0.001
  • 월 평균 6.3종목 필터링
  • cash/mcap 필터가 가장 중요 — 제거 시 수익률 -87%로 붕괴

Grid Search V8 — 포트폴리오 시뮬레이션 (2026-04-09)

  • 2.26M (+2,164%)
  • Max DD: -27.6%
  • IS: +1,076% / OOS: +114% ✅

Auto Pipeline Phase 3 — 최적 exit

  • Best: bb30 + fixed exit (TP 50%, SL -90%) → Sharpe 1.108, WR 86.4%
  • Trailing stop은 성과 낮음 (Sharpe 0.449)
  • Wide SL (-90%)이 핵심 — 반전 바운스 회복 허용

Cash Efficiency 연구

  • 유휴 현금 T-Bill 투자 시 CAGR +2%p 개선 (0 리스크)

5. 완성도 현황

✅ 완료

  • 유니버스 필터링 (5개 코어 필터, 배치 최적화)
  • 진입 시그널 (7개 디텍터)
  • 출구 시뮬레이션 (4종)
  • 메트릭스 엔진
  • Phase A/B 러너
  • Auto-pipeline Phase 1~3
  • DuckDB 데이터 레이어

⏳ 미완성

  • Phase C 러너 (반전 패턴 entry 최적화) — 스펙 O, 러너 X
  • Phase D (포트폴리오 시뮬레이션) — 스텁
  • 반전 패턴 5/8 미구현
  • Auto-pipeline Phase 4

6. 데이터 품질 이슈

심각도이슈영향
P0adj_close가 split 미반영 (50.3% 심볼)ATH/drawdown 계산 신뢰도 ↓
P0clinical trials 커버리지 43.8%만Phase 2+ 필터 불완전
P1포트폴리오 시뮬레이션 미구현포지션 사이징 테스트 불가
P2거래 비용 0비현실적 백테스트

7. 코드 아키텍처 평가

강점

  • 모듈화 잘 됨 — 각 phase 독립적, 컴포넌트 교체 용이
  • 배치 최적화 — 모든 날짜 한번에 프리컴퓨트 (루프 X)
  • 통계적 엄밀성 — Mann-Whitney U, IS/OOS 분리, fat tail 분석, ablation
  • 자동화 파이프라인 — 시그널/앙상블/출구 조합 체계적 탐색
  • 문서화 양호 — thesis, 데이터소스, 스펙 정리

약점

  • 데이터 품질 갭 — split 미보정, clinical trial 누락
  • Phase C/D 미완성 — 전략 검증의 핵심 단계 빠짐
  • 앙상블 단순 — OR 로직만 사용, AND/가중치 조합 미탐구
  • regime 필터 없음 — 시장 전체 하락기 진입 방지 장치 X
  • 결과 파일 산재 — results/ 폴더 네이밍/구조 비일관적

8. 리팩토링 시 개선 포인트

  1. 결과 저장 체계화 — 실험별 메타데이터 + 통일된 디렉토리 구조
  2. config 중앙화 — Phase A-D 파라미터 + auto_pipeline 파라미터 통합
  3. 러너 인터페이스 통일 — phase_a~d 공통 인터페이스 (run → report → save)
  4. 데이터 레이어 정리 — split adjustment 함수 추가, data.py 확장
  5. 테스트 추가 — 현재 unit test 0개
  6. auto_pipeline ↔ runners 중복 제거 — 두 시스템이 유사한 일을 다르게 수행
  7. 반전 패턴 완성 — 나머지 5개 패턴 구현
  8. 로깅/에러 핸들링 — 현재 print 기반, 구조화된 로깅 필요