feat(Core/UI): 백테스트 전역 엔진 선택 버튼 추가 및 스캘핑 Rust 방어로직 포팅 1차 완료

This commit is contained in:
Your Name
2026-09-03 02:49:14 +09:00
parent ac1190f1fc
commit 3b7c21cde4
316 changed files with 56952 additions and 1 deletions

View File

@@ -0,0 +1,58 @@
---
description: Optuna mode Top10 · mode_combo · 하단 표 해석 — band proximity vs 익절 consensus
alwaysApply: false
---
# Optuna mode Top10 · mode_combo · 하단 표 해석 (kis_bot)
## 역할 분리 (혼동 금지)
| 표 | 목적 | trial? | 익절 하나로 수렴? |
|----|------|--------|-------------------|
| 학습 Top10 | Optuna 목적함수(score) 상위 | O | X — score 최대가 익절 대표값 아님 |
| 사후합격 Top10 | WR/PF 등 사후 게이트 통과 | O | X |
| mode_combo | PnL 양수 pool 축별 **최빈(mode)** 조립 + 1회 백테 실측 | X (조립) | **축마다 최빈** — tp 예: pool 최빈 5.0% |
| mode Top10 | PnL 양수 pool **p25~p75 밴드 근접도** 상위 trial | O | **X** — 27축 평균 근접도; tp만 보면 2~7.5% 퍼져도 정상 |
| 안정 Top10 | 일평균PnL λ×일표준편차 | O | X |
## mode Top10 점수 (band_proximity_p25_p75)
1. pool = `OPTUNA_MODE_POOL` (기본 `positive` = total_pnl>0 전 trial)
2. pool 각 축 numeric → p25, p50, p75, IQR
3. trial 각 축: 밴드 안=1.0, 밖= `1 - dist/(IQR×OPTUNA_MODE_BAND_DECAY_IQR)` (기본 decay 1.5)
4. **근접% = 축 점수 평균** (`consensus_match_n/total`는 밴드 **안** 축 개수 — 근접%와 다름)
5. 정렬: 근접% ↓ → mean_band_err ↑ → PnL ↓
## 흔한 오해
- "mode Top10 1위 = 익절 대표" → **아님**. #1이 tp 밴드 밖(예 2.5% vs p25 4.5%)이어도 다른 25축이 밴드 안이면 98% 가능.
- "익절 균형이 깨졌다" → 버그 아님. **다축 중심성** 랭킹이지 tp 단일 consensus 아님.
- 익절 하나로 쓰려면 → **mode_combo** 또는 **사후합격 1위**, DB 적용은 사용자 confirm.
## 하단 표 데이터 소스
- 완료 잡: `logs/optuna_web_jobs/<job_id>.json` → `result_json` 경로의 **Optuna 결과 JSON**
- 동일 payload: MariaDB `optuna_study_result.payload_json`
- 웹 요약: `optuna_web_jobs._summarize_result_data()` → `job.result_summary`
- 구 JSON: `results_mode` 없으면 웹이 `build_results_mode_consensus_tier()` **즉시 재계산**
## 최종 선택 후보 (브리핑·적용)
| 우선순위 | 후보 | apply source | 비고 |
|---------|------|--------------|------|
| 1 | 사후합격 1위 | `gated` | WR/PF·min_trades 통과 — **DB 적용 1순위** |
| 2 | 안정 1위 | `stable` | 손실일·최악일 게이트 — 변동성 낮춤 |
| 3 | mode_combo | `mode` | 축별 최빈 조립 · trial 없음 · 2차 narrow 참고 |
| 4 | mode Top10 1위 | `consensus` | 밴드 전형 trial · **익절 대표 아님** |
## 수정 시 금지
- mode Top10을 "익절 최빈순"으로 바꾸지 말 것 (목적 다름) — 바꾸려면 별도 표/env/사용자 승인
- HTS SCAN 밴드로 mode 그리드 강제 금지
- mode Top10 ≠ mode_combo DB apply 경로 혼동 금지
## 코드 앵커
- `kis_trader/backtest/optuna_mode_combo.py` — pool, band, mode Top10, mode_combo
- `kis_trader/backtest/optuna_briefing.py` — `build_final_selection_briefing_lines`
- `kis_trader/backtest/optuna_web_jobs.py` — `_summarize_result_data`, 웹 표