ls증권 히스토리 구독 넣음
This commit is contained in:
@@ -19,6 +19,7 @@ from collections import Counter
|
||||
from typing import Any, Callable, Dict, List, Optional
|
||||
|
||||
from kis_trader.utils.env import get_env_int
|
||||
from kis_trader.backtest.optuna_tpe_common import finalize_ratchet_combo
|
||||
|
||||
logger = logging.getLogger("optuna_mode_combo")
|
||||
|
||||
@@ -155,11 +156,18 @@ def enrich_out_data_with_mode_combo(
|
||||
grid_keys=keys or None,
|
||||
params_key=params_key,
|
||||
)
|
||||
# 래칫 숫자축 최빈 → 엔진용 ratchet_tiers 재조립 (불일치 방지)
|
||||
strat = str(out_data.get("strategy") or "").strip().lower()
|
||||
off_tok = "off" if strat == "tail" else ""
|
||||
mode_params = finalize_ratchet_combo(
|
||||
dict(mode_meta.get("params") or {}),
|
||||
off_token=off_tok,
|
||||
)
|
||||
report: Dict[str, Any] = {
|
||||
"method": "top_n_per_axis_mode",
|
||||
"top_n": mode_meta["top_n"],
|
||||
"pool_size": mode_meta["pool_size"],
|
||||
"params": mode_meta["params"],
|
||||
"params": mode_params,
|
||||
"freq": mode_meta["freq"],
|
||||
"top_pnls": mode_meta["top_pnls"],
|
||||
"backtest": None,
|
||||
@@ -180,12 +188,14 @@ def enrich_out_data_with_mode_combo(
|
||||
mode_meta["pool_size"],
|
||||
mode_meta["top_pnls"][:5],
|
||||
)
|
||||
if mode_meta["params"]:
|
||||
if mode_params:
|
||||
# 축별 빈도 요약 (짧게)
|
||||
bits = []
|
||||
for k, meta in list(mode_meta["freq"].items())[:12]:
|
||||
bits.append(f"{k}={meta['value']}({meta['count']}/{meta['of']})")
|
||||
lg.info("📊 [mode] params(일부): %s", " | ".join(bits))
|
||||
if "ratchet_tiers" in mode_params:
|
||||
lg.info("📊 [mode] ratchet_tiers 재조립=%r", mode_params.get("ratchet_tiers"))
|
||||
|
||||
# 실측 전에 먼저 JSON에 박아 둠 (실측 중 죽어도 mode_combo.params 는 남음)
|
||||
out_data["mode_combo"] = report
|
||||
@@ -195,9 +205,9 @@ def enrich_out_data_with_mode_combo(
|
||||
except Exception as exc:
|
||||
lg.warning("⚠️ mode_combo 부분저장 실패: %s", exc)
|
||||
|
||||
if evaluate_fn is not None and mode_meta["params"]:
|
||||
if evaluate_fn is not None and mode_params:
|
||||
try:
|
||||
bt = evaluate_fn(dict(mode_meta["params"]))
|
||||
bt = evaluate_fn(dict(mode_params))
|
||||
report["backtest"] = _bt_summary(bt)
|
||||
if report["backtest"].get("ok"):
|
||||
lg.info(
|
||||
@@ -215,21 +225,54 @@ def enrich_out_data_with_mode_combo(
|
||||
|
||||
if best_pnl is not None and report.get("backtest") and report["backtest"].get("ok"):
|
||||
mode_pnl = float(report["backtest"]["total_pnl"] or 0)
|
||||
best_wr = float(res0.get("win_rate") or 0) if res0 else None
|
||||
best_pf = float(res0.get("pf") or 0) if res0 and res0.get("pf") is not None else None
|
||||
mode_wr = report["backtest"].get("win_rate")
|
||||
mode_pf = report["backtest"].get("pf")
|
||||
report["vs_best"] = {
|
||||
"best_pnl": best_pnl,
|
||||
"best_trades": best_tr,
|
||||
"best_wr": best_wr,
|
||||
"best_pf": best_pf,
|
||||
"mode_pnl": mode_pnl,
|
||||
"mode_trades": report["backtest"].get("total_trades"),
|
||||
"mode_wr": float(mode_wr) if mode_wr is not None else None,
|
||||
"mode_pf": float(mode_pf) if mode_pf is not None else None,
|
||||
"delta_pnl": round(mode_pnl - best_pnl, 2),
|
||||
"delta_wr": (
|
||||
round(float(mode_wr) - float(best_wr), 2)
|
||||
if mode_wr is not None and best_wr is not None
|
||||
else None
|
||||
),
|
||||
"delta_pf": (
|
||||
round(float(mode_pf) - float(best_pf), 2)
|
||||
if mode_pf is not None and best_pf is not None
|
||||
else None
|
||||
),
|
||||
}
|
||||
lg.info(
|
||||
"📐 [mode vs #1] best_pnl=%s (%s건) | mode_pnl=%s (%s건) | Δ=%+.0f",
|
||||
"📐 [mode vs #1] best_pnl=%s (%s건 wr=%.1f%% pf=%s) | "
|
||||
"mode_pnl=%s (%s건 wr=%.1f%% pf=%s) | Δpnl=%+.0f Δwr=%+.1f",
|
||||
best_pnl,
|
||||
best_tr,
|
||||
float(best_wr or 0),
|
||||
best_pf,
|
||||
mode_pnl,
|
||||
report["backtest"].get("total_trades"),
|
||||
float(mode_wr or 0),
|
||||
mode_pf,
|
||||
mode_pnl - best_pnl,
|
||||
(float(mode_wr) - float(best_wr)) if mode_wr is not None and best_wr is not None else 0.0,
|
||||
)
|
||||
|
||||
out_data["mode_combo"] = report
|
||||
# 다단트레일 추천 (탐색 축 아님 — 미리보기/apply 전용)
|
||||
try:
|
||||
from kis_trader.backtest.optuna_daily_trail_recommend import (
|
||||
attach_daily_trail_recommend,
|
||||
)
|
||||
|
||||
attach_daily_trail_recommend(out_data, log=lg)
|
||||
except Exception as exc:
|
||||
lg.warning("⚠️ daily_trail_recommend 첨부 실패: %s", exc)
|
||||
return out_data
|
||||
|
||||
Reference in New Issue
Block a user