--- description: 실매↔웹백테↔파람 정합 — 파람서치는 Optuna 기본, 수정 후 교차검증 체크리스트 alwaysApply: true --- # 실매 · 웹백테 · 파람서치 정합 (Optuna 기본) `.cursorrules` 5·7번을 **실행 절차**로 구체화한다. 전략 로직/파라미터/공통 엔진을 고치면 “코드만 맞춤”으로 끝내지 말고 **실매 기준 → 웹백테 → Optuna** 순으로 검증한다. ## 0. 파람서치 기본 = Optuna - 사용자가 Grid CLI를 **명시**하지 않으면 파람서치는 **`param_search_optuna.py`** 를 쓴다. - 이유: trial 진행률·study 재개·TPE 탐색이 Grid보다 섬세하고 운영에 맞음. - Grid (`tail_param_search.py` 등)는 Optuna가 없는 전략·사용자가 Grid를 지정한 경우·그리드 공간 점검용만. - Optuna 대상: `tail` | `momentum` | `breakout` | `scalp` (`--strategy`). ## 1. 수정 시 맞출 대상 (한 축이라도 빠지면 미완료) | 축 | 무엇 | |----|------| | 실매 | `*_engine` / Strategy + DB env (`get_*_defaults_from_db`) | | 웹백테 | `backtest_web.py` API + 해당 탭 인풋 = 실매 키·기본값 | | 파람 | Optuna 그리드 ⊃ **실매 TRIGGER/청산 핵심값** (HTS SCAN 밴드 재현 목적 아님 — `hts-condition-grids.mdc`) | | 공통 | 가능하면 엔진/헬퍼 1경로 공유 (백테·Optuna가 실매와 다른 분기 금지) | ## 2. 검증 체크리스트 (보고 전) 1. **거래일**: start/end = 최근 장운영일 (`kr_trading_day`). 주말·휴장 날짜로 돌리지 말 것. 2. **실매 DB 스냅샷**: 해당 전략 핵심 파라미터 확인. 3. **그리드 ⊃ 실매값**: Optuna mode 축에 실매값이 없으면 그리드 먼저 고침 (또는 사용자 보고 후 중단). 4. **웹백테 1회**: 동일 start/end·동일 파라미터로 탭 실행 → 거래수·PnL·승률 기록. (웹 수정 시 항목 14 브라우저 검증 포함) 5. **Optuna (기본)**: ```bash python3 -u kis_trader/backtest/param_search_optuna.py \ --strategy --mode \ --start YYYY-MM-DD --end YYYY-MM-DD \ --trials N --min_trades 1 --orderbook-filter off --no-progress \ --study-name <전략>__ # --apply-best 없음 (기본) ``` - nohup + 로그 경로 안내. `for+sleep` 폴링 금지. - categorical 그리드 변경 시 **새 study-name** 필수. 6. **교차 비교**: 동일 기간 **현재 DB 백테 PnL** vs **Optuna best 백테 PnL** (헬퍼 재사용: `scripts/append_tail_optuna_compare.py` 등). - 수치·건수가 어긋나면 “정합 OK” 금지 → 원인 분류(엔진/유니버스/틱재생/포트폴리오). 7. **DB 적용**: 사용자 `--apply-best`/적용 지시 **없으면** 저장 금지. 1일 best는 과적합 경고. ## 3. 완료 보고 최소 산출물 - 전략·기간(거래일)·mode·study-name·로그/JSON 경로 - 현재 DB 백테 요약 (trades / WR / PnL) - Optuna best 요약 + Δ(현재 대비) - 웹백테를 돌렸으면 그 수치 (또는 “웹 미해당”) - 적용 여부: **미적용** / 사용자 지시로 적용 ## 4. 하지 말 것 - Grid를 기본 경로로 돌리기 (사용자 미지정 시) - 실매만 고치고 웹·Optuna 그리드/기본값 방치 - Optuna best를 검증 없이 DB 반영 - 주말 날짜·구 study·실매값 빠진 그리드로 trial 낭비