P2 엣지 검증
의존: P1 (daily_prices 적재 완료). 이 페이즈가 전체 게이트 — 엣지 미확인 시 P5 미착수. 구현 위치: ml (Python). 영속화는 BE backtest_runs.
[WEALTH-P2-01] CostModel — 거래비용·슬리피지
작업 내용 (설계 의도)
체결 의도가를 받아 수수료·세금·슬리피지를 반영한 실효 체결가와 비용을 산출한다. 매수·매도 비대칭(매도 시 거래세), 슬리피지율을 파라미터로 외부화한다. 백테스트와 실행이 공유한다.
테스트 케이스
- 매수 체결에 수수료가 가산되어 실효 단가가 의도가보다 높다.
- 매도 체결에 수수료+거래세가 차감되어 실효 단가가 의도가보다 낮다.
- 슬리피지율 0이면 의도가=실효가(비용만 반영)다.
- 수량 0 주문은 비용 0을 반환한다(엣지 케이스).
[WEALTH-P2-02] BacktestEngine — 룩어헤드 차단 워크포워드
작업 내용 (설계 의도)
OHLCV 시계열과 전략(신호 함수)을 받아 시점 t까지의 데이터로만 신호를 산출하고, CostModel로 체결해 거래 로그·수익곡선(equity curve)을 만든다. 다종목·장기 표본을 처리한다. 룩어헤드를 구조적으로 차단한다.
다이어그램
처리 흐름
sequenceDiagram participant Eng as BacktestEngine participant Cost as CostModel loop 시점 t (closes[..t]만 사용) Eng->>Eng: signal(closes[..t]) Eng->>Cost: applyCost(intendedFill) Cost-->>Eng: 실효 체결가·비용 end Eng-->>Eng: equityCurve, tradeLog
테스트 케이스
- 단일 종목 3년 시계열에서 거래 로그와 수익곡선을 생성한다.
- 시점 t 신호 계산에 t+1 종가를 주입하면 테스트가 실패한다(룩어헤드 누출 차단).
- 모든 체결에 CostModel 비용이 반영된다.
- 신호가 한 번도 발생하지 않으면 거래 0건·수익곡선 평탄이다(엣지 케이스).
- 표본 0건 입력 시 빈 결과를 graceful하게 반환한다.
[WEALTH-P2-03] EdgeReport — 엣지 유의성 판정
작업 내용 (설계 의도)
수익곡선·거래 로그를 받아 시장 대비 초과수익·t검정·승률·MDD·샤프지수를 산출한다. 결과를 BE backtest_runs에 영속화한다. 무작위 신호 대조군과 비교해 가짜 엣지를 탐지한다.
롤백: 리포트는 읽기 전용 산출물 — 실거래 영향 없음.
테스트 케이스
- 우상향 수익곡선에서 양의 초과수익과 유의한 t값을 산출한다.
- 무작위 신호 입력 시 엣지가 통계적으로 유의하지 않게 나온다(가짜 엣지 차단).
- MDD가 수익곡선 최대 낙폭과 일치한다.
- 거래 0건이면 엣지 판정 불가(N/A)를 반환한다(엣지 케이스).
- 산출 리포트가 backtest_runs에 멱등 저장된다.
페이즈 완료 게이트
- 4팩터 신호를 다종목·3년 표본으로 백테스트한 EdgeReport가 산출된다.
- 엣지가 유의하면 → P3·P5 진행. 유의하지 않으면 → 신호 재설계로 회귀(P5 미착수).