diff --git a/deploy/profile-scripts/batch_reassess.py b/deploy/profile-scripts/batch_reassess.py index bd733515..39f479a3 100644 --- a/deploy/profile-scripts/batch_reassess.py +++ b/deploy/profile-scripts/batch_reassess.py @@ -99,9 +99,17 @@ def collect_data(code): data["changelog_json"] = r[12] or "" data["reassessed_at"] = r[13] or "" data["strategy_name"] = r[15] or "" # 2026-08-18 来源策略 + # 2026-08-18 策略状态感知:switched → 用 strategy_attributed(切到的策略)的定义评估 + try: + _st0 = conn.execute("SELECT strategy_state, strategy_attributed FROM holding_strategies WHERE code=? AND status='active'", (code,)).fetchone() + _eval_strat = data["strategy_name"] + if _st0 and _st0[0] == "switched" and _st0[1]: + _eval_strat = _st0[1] + except Exception: + _eval_strat = data["strategy_name"] # 2026-08-18 策略语义注入:读 strategy_defs 定义卡 + 情势体检 try: - _sd = conn.execute("SELECT display_name, summary, entry_logic, exit_logic, review_focus, holding_style, status, retired_reason, superseded_by, regime FROM strategy_defs WHERE strategy_name=?", (data["strategy_name"],)).fetchone() + _sd = conn.execute("SELECT display_name, summary, entry_logic, exit_logic, review_focus, holding_style, status, retired_reason, superseded_by, regime FROM strategy_defs WHERE strategy_name=?", (_eval_strat,)).fetchone() if _sd: data["strategy_def"] = { "display_name": _sd[0] or data["strategy_name"], "summary": _sd[1] or "", @@ -148,6 +156,41 @@ def collect_data(code): data["held_cost"] = hr[1] or 0 else: data["held"] = False + # 2026-08-18 持仓处置决策:策略状态感知(invalidated/none → position_management) + try: + _st_r = conn.execute("SELECT strategy_state, strategy_attributed, strategy_provenance FROM holding_strategies WHERE code=? AND status='active'", (code,)).fetchone() + data["strategy_state"] = _st_r[0] or "active" if _st_r else "active" + data["strategy_attributed"] = _st_r[1] or "" if _st_r else "" + # 无策略/失效 + 持仓 → 用 position_management 框架 + _need_pos_mgmt = (data.get("strategy_state") in ("invalidated", "none") or not data.get("strategy_def")) and data.get("held") + if _need_pos_mgmt: + _pm = conn.execute("SELECT display_name, summary, entry_logic, exit_logic, review_focus, holding_style, status, retired_reason, superseded_by, regime FROM strategy_defs WHERE strategy_name='position_management'").fetchone() + if _pm: + data["strategy_def"] = { + "display_name": _pm[0], "summary": _pm[1], "entry_logic": _pm[2], + "exit_logic": _pm[3], "review_focus": _pm[4], "holding_style": _pm[5], + "status": _pm[6], "retired_reason": _pm[7], "superseded_by": _pm[8], "regime": _pm[9], + } + data["pos_mgmt_triggered"] = True + # 当前温区合格策略 + try: + import os as _os + import json as _json2 + _wf = "/home/hmo/MoFin/data/strategy_weights.json" + if _os.path.exists(_wf): + _wdata = _json2.load(open(_wf, encoding="utf-8")) + _ra = _wdata.get("regime_active", {}) + _cur_rg = data.get("situation", {}).get("regime_a", "unknown") + data["current_regime_strategies"] = _ra.get(_cur_rg, []) + data["current_regime"] = _cur_rg + else: + data["current_regime_strategies"] = [] + data["current_regime"] = data.get("situation", {}).get("regime_a", "unknown") + except Exception: + data["current_regime_strategies"] = [] + data["current_regime"] = data.get("situation", {}).get("regime_a", "unknown") + except Exception: + pass conn.close() # 从腾讯API拉最新价和基本面