# 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` (시뮬·실거래 비율 매수)
