analysis: reflect cost/execution in v2 backtest pipeline (#368) #387
Reference in New Issue
Block a user
Delete Branch "feature/issue-368-backtest-cost-execution"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Traceability
REQ-V2-007TASK-V2-012TEST-ACC-014Summary
BacktestCostModel에partial_fill_rate_by_session를 추가하고 필수 검증으로 강제했습니다.run_v2_backtest_pipeline()에서BacktestExecutionModel을 실제 연결해 fold 테스트 성과에 실행 반영 지표를 계산하도록 확장했습니다.BacktestFoldResult에 실행 반영 지표(execution_adjusted_avg_return_bps, 체결/거절/부분체결 카운트)를 추가했습니다.REQ-V2-007상태를 코드 실체 기준으로✅ 완료로 동기화했습니다.Validation
python3 scripts/session_handover_check.py --strictpytest -q tests/test_backtest_cost_guard.py tests/test_backtest_execution_model.py tests/test_backtest_pipeline_integration.pyruff check src/analysis/backtest_cost_guard.py src/analysis/backtest_pipeline.py tests/test_backtest_cost_guard.py tests/test_backtest_pipeline_integration.pypython3 scripts/validate_ouroboros_docs.pypython3 scripts/validate_governance_assets.pyNotes
200bc82a27to96d2c97fe7PR #387 코드 리뷰 — analysis: reflect cost/execution in v2 backtest pipeline (#368)
범위: BacktestFoldResult에 execution-adjusted 지표 4개 추가 + _simulate_execution_adjusted_return_bps() 구현
✅ 통과 항목
1. 기능 구현
2. 테스트
3. ruff E501: All checks passed ✅ (이전 PR #382 E501 이슈 해소 확인)
4. 문서: REQ-V2-007 ⚠️ → ✅, 버전 1.0.8
⚠️ 소견 1 — Dead code: 루프 상단 execution_model 초기화 불필요 (Non-blocking)
run_v2_backtest_pipeline() 함수 상단에 아래 코드가 추가됩니다:
하지만 fold 루프 첫 번째 반복에서 즉시:
로 재할당됩니다. 상단의 seed=0 모델은 어느 경로에서도 사용되지 않는 dead code입니다.
권장: 상단 초기화 블록 제거 (validate_backtest_cost_model() 호출 직후 ~ highs = ... 직전 7줄).
⚠️ 소견 2 — 동일 시드 두 모델 (Non-blocking)
fold 루프 내에서 두 모델이 동일 파라미터로 생성됩니다:
각 모델은 독립적인 Random(fold_idx) 인스턴스를 가지므로 동일한 난수 시퀀스를 생성합니다.
execution_model은 B0/B1/M1 score에, execution_return_model은 return 시뮬레이션에 사용됩니다.
두 시뮬레이션이 같은 시드에서 출발하면 결과에 상관관계가 생깁니다.
의도된 설계라면 주석으로 명시를 권장합니다.
독립 시뮬레이션이 목적이라면 fold_seed + offset(예: fold_seed + 1000)으로 시드를 분리하는 것이 더 명확합니다.
결론
LGTM — 기능 구현 및 테스트 통과. Dead code 제거(소견 1)를 반영해 주시면 코드 가독성이 향상됩니다.
리뷰 반영했습니다.
run_v2_backtest_pipeline()상단의 미사용execution_model초기화 블록(dead code) 제거execution_return_model시드를fold_idx + 1000으로 분리해baseline score 시뮬레이션(
fold_idx)과 return 시뮬레이션 간 난수 시퀀스 상관을 완화검증:
ruff check src/analysis/backtest_pipeline.py tests/test_backtest_pipeline_integration.pypytest -q tests/test_backtest_pipeline_integration.py tests/test_backtest_execution_model.py tests/test_backtest_cost_guard.py33 passed추가 리뷰 — analysis: remove dead init and split execution seeds in fold
커밋:
2776a07✅ 소견 반영 확인
소견 1 (Dead code 제거)
validate_backtest_cost_model() 직후 7줄(seed=0 execution_model 초기화) 삭제 완료.
소견 2 (시드 분리)
execution_return_model의 fold_seed를 fold_idx + 1000으로 분리:
fold_idx 최대값이 walk-forward 설정에 따라 수십 단위이므로 +1000 오프셋은 충분한 분리를 보장합니다.
로컬 실행: 6 passed in 0.12s ✅
LGTM — 추가 소견 없음. 머지 준비 완료.