# 1단계 — 시뮬레이션 ## 목적 `monitor_rules`가 과적합이 아닌지 검증하고, **Ground Truth와 동일한 자본 배분 원칙**으로 holdout 체결 수익을 비교합니다. ## 실행 ```bash python scripts/04_match_rules.py # 선행 python scripts/04_simulation_report.py ``` ## 산출물 | 파일 | 내용 | |------|------| | `docs/04_matching/simulation_report.json` | Go/No-Go, `portfolio_compare`, `gt_model` | | `docs/04_matching/simulation_report.html` | 카드 3줄: **GT · 시뮬(총자산%) · 시뮬(고정₩/회)** | ## 포트폴리오 비교 (`portfolio_compare`) | 키 | 설명 | |----|------| | `ground_truth_chrono` | GT 타점 + `amount_krw` 시각순 체결 | | `sim_sized` | holdout 발화 + **총자산×비중×EV/WF·leg상위** (`position_sizing`) | | `sim_fixed_order` | 동일 발화 + **고정 `LIVE_ORDER_KRW`/회** (baseline) | ## 시뮬 매수 배분 (GT와 동일 원칙) - **통과 규칙만** 대형: holdout EV·PF, walk-forward, 수수료 2× 스트레스 (`load_ev_wf_approved_rule_ids`) - **leg 상위** `GT_LARGE_LEG_TOP_PCT` + 근접 GT leg 매칭 → `LIVE_BUY_PCT_LARGE` - 그 외 → `LIVE_BUY_PCT_SMALL` - 일한도·일최대거래: `select_capped_fires` (동적 planned 원화로 `LIVE_DAILY_KRW_MAX` 적용) ## 검증 항목 | 항목 | 설명 | |------|------| | Holdout | EV≥0, PF≥1 | | Walk-forward | 양수 월 비율 ≥ `SIM_GO_WF_POSITIVE_RATIO` | | 수수료 스트레스 | 수수료 2× 후 EV≥0 | | 실거래 한도 | 동적 매수액 기준 일한도 시뮬 | ## Go/No-Go - **GO**: monitor_rules 전 규칙 checks 통과 - **NO-GO**: 04 재선별 후 재실행 ## 환경 변수 - `SIM_GO_*`, `SIM_WALK_FORWARD_MIN_MONTHS`, `SIM_FEE_STRESS_MULT` - `LIVE_ORDER_KRW`, `LIVE_DAILY_KRW_MAX` (고정 baseline·한도) - `LIVE_BUY_PCT_LARGE`, `LIVE_BUY_PCT_SMALL` (시뮬·실거래 비율 매수)