fix: 组合Tab更新——移除v_next4/s2_panic旧组合,改为v_weak(实盘)+p_oversold(新策略),routing按regime分配
This commit is contained in:
+19
-32
@@ -108,9 +108,10 @@ def get_combo_dashboard():
|
||||
combos.append(d)
|
||||
|
||||
# 3. 组合成员策略的独立指标
|
||||
# v_mr 位置优先取 v_weak(六步方法论+12维框架定稿,2026-08-03),回退 v_mr_sel/v_mr
|
||||
# 2026-08-11 更新:组合成员 = v_weak(实盘)+ p_oversold(新策略),替代旧的 v_next4+v_mr
|
||||
# v_next4 移除(池内卫星仓,全市场失效;现有池子票不是它选的)
|
||||
members = {}
|
||||
for v in ["v_next4", "v_mr"]:
|
||||
for v in ["v_weak", "p_oversold"]:
|
||||
sel_v = "v_weak" if v == "v_mr" else None
|
||||
candidates = [sel_v, "v_mr_sel", v] if sel_v else [v]
|
||||
r = None
|
||||
@@ -130,7 +131,7 @@ def get_combo_dashboard():
|
||||
pf = s.get("portfolio_full", {})
|
||||
p5 = s.get("portfolio", {})
|
||||
members[v] = {
|
||||
"role": "趋势市主战" if v == "v_next4" else "震荡/下跌市接管",
|
||||
"role": "弱市超跌确认(实盘)" if v == "v_weak" else "预测超跌反弹(新策略)",
|
||||
"version": ("v_weak" if used_sel else "v_mr") if v == "v_mr" else v,
|
||||
"is_sel": used_sel,
|
||||
"trades": s.get("total_trades"),
|
||||
@@ -146,32 +147,18 @@ def get_combo_dashboard():
|
||||
"positions_taken_5slot": p5.get("positions_taken"),
|
||||
"positions_taken_full": pf.get("positions_taken"),
|
||||
}
|
||||
|
||||
# 3.5 策略家族 S2 卡片(s2_panic,2026-08-05 §39/§40 上线)
|
||||
r = conn.execute(
|
||||
"SELECT results_json FROM strategy_research"
|
||||
" WHERE version='s2_panic' AND period_tag='10y' ORDER BY id DESC LIMIT 1"
|
||||
).fetchone()
|
||||
if r:
|
||||
res = json.loads(r[0])
|
||||
s2 = res.get("summary", {})
|
||||
pf = s2.get("portfolio_full", {})
|
||||
p5 = s2.get("portfolio", {})
|
||||
members["s2_panic"] = {
|
||||
"role": "极端恐慌买超跌(RSI<25)",
|
||||
"version": "s2_panic",
|
||||
"is_sel": True,
|
||||
"trades": s2.get("total_trades"),
|
||||
"win_rate": s2.get("win_rate"),
|
||||
"avg_profit_pct": s2.get("avg_profit_pct"),
|
||||
"avg_hold_days": s2.get("avg_hold_days"),
|
||||
"cagr_pct": p5.get("cagr_pct"),
|
||||
"return_pct": p5.get("total_return_pct"),
|
||||
"max_dd_pct": p5.get("portfolio_max_dd_pct"),
|
||||
"slots": p5.get("slots") or 8,
|
||||
"universality": s2.get("universality", {}),
|
||||
"positions_taken_5slot": p5.get("positions_taken"),
|
||||
"positions_taken_full": pf.get("positions_taken"),
|
||||
# 2026-08-11:p_oversold 无回测数据时给兜底卡片(新策略待回测)
|
||||
if "p_oversold" not in members:
|
||||
members["p_oversold"] = {
|
||||
"role": "预测超跌反弹(新策略)",
|
||||
"version": "p_oversold",
|
||||
"is_sel": False,
|
||||
"trades": None, "win_rate": None, "avg_profit_pct": None,
|
||||
"avg_hold_days": None, "cagr_pct": None, "return_pct": None,
|
||||
"max_dd_pct": None, "slots": 10,
|
||||
"universality": {},
|
||||
"positions_taken_5slot": None, "positions_taken_full": None,
|
||||
"note": "新策略,待回测/实盘验证",
|
||||
}
|
||||
|
||||
conn.close()
|
||||
@@ -180,9 +167,9 @@ def get_combo_dashboard():
|
||||
"combos": combos,
|
||||
"members": members,
|
||||
"routing": [
|
||||
{"regime": "trend_up", "active": "v_next4", "action": "追涨买入/加仓放行", "desc": "大盘MA20上方+ADX强, 趋势追涨主战场"},
|
||||
{"regime": "choppy", "active": "v_mr", "action": "追涨降级为关注", "desc": "震荡市, 超跌反弹主战场, 趋势追涨让位"},
|
||||
{"regime": "trend_down", "active": "v_mr", "action": "禁止追涨", "desc": "深超跌主战场, 只做均值回复"},
|
||||
{"regime": "trend_up", "active": "p_oversold", "action": "预测超跌反弹", "desc": "趋势市/反弹期, p_oversold 预测超跌反弹"},
|
||||
{"regime": "choppy", "active": "v_weak", "action": "弱市超跌确认", "desc": "震荡/下跌市, v_weak 均值回复主战场"},
|
||||
{"regime": "trend_down", "active": "v_weak", "action": "深超跌管理", "desc": "下跌市, v_weak 管理超跌持仓"},
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user