ls증권 히스토리 구독 넣음

This commit is contained in:
Your Name
2026-07-30 18:05:07 +09:00
parent 61bec4bd1d
commit 67eab24603
1593 changed files with 135733 additions and 1232 deletions

View File

@@ -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