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):
- 기술적: ATH 대비 -90% 이상 하락
- 펀더멘털: 순현금 ≥ 4분기 burn rate, Phase 2+ 파이프라인
- 시간: 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. 데이터 품질 이슈
| 심각도 | 이슈 | 영향 |
|---|---|---|
| P0 | adj_close가 split 미반영 (50.3% 심볼) | ATH/drawdown 계산 신뢰도 ↓ |
| P0 | clinical 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. 리팩토링 시 개선 포인트
- 결과 저장 체계화 — 실험별 메타데이터 + 통일된 디렉토리 구조
- config 중앙화 — Phase A-D 파라미터 + auto_pipeline 파라미터 통합
- 러너 인터페이스 통일 — phase_a~d 공통 인터페이스 (run → report → save)
- 데이터 레이어 정리 — split adjustment 함수 추가, data.py 확장
- 테스트 추가 — 현재 unit test 0개
- auto_pipeline ↔ runners 중복 제거 — 두 시스템이 유사한 일을 다르게 수행
- 반전 패턴 완성 — 나머지 5개 패턴 구현
- 로깅/에러 핸들링 — 현재 print 기반, 구조화된 로깅 필요