fix: 组合Tab更新——移除v_next4/s2_panic旧组合,改为v_weak(实盘)+p_oversold(新策略),routing按regime分配

This commit is contained in:
hmo
2026-08-11 16:04:39 +08:00
parent d61bd7024e
commit 48459c824e
2 changed files with 20 additions and 33 deletions
+19 -32
View File
@@ -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_panic2026-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-11p_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 管理超跌持仓"},
],
}
+1 -1
View File
@@ -2171,7 +2171,7 @@ async function renderResearchCombo() {
'<span class="text-base font-semibold text-blue-300">🧬 当前组合方案</span>' +
'<span class="text-sm">市场阶段: <span class="' + regColor + ' font-bold">' + regName + '</span>' + (regime.adx ? ' <span class="text-slate-500 text-xs">ADX=' + regime.adx + '</span>' : '') + '</span>' +
'</div>' +
'<div class="text-xs text-slate-400 mb-2">策略家族(§39/§40):v_next4 趋势池 + v_weak 弱市甜区 + s2_panic 极端恐慌买超跌——同时运行、票自己对号入座、信号零重叠</div>' +
'<div class="text-xs text-slate-400 mb-2">当前组合(2026-08-11):v_weak弱市超跌确认,实盘)+ p_oversold(预测超跌反弹,新策略)+ 12维重评(持仓管理)——选股与持仓管理分离,超跌家族并行</div>' +
'<div class="space-y-1.5">';
for (const rt of (d.routing || [])) {
const active = regime.regime === rt.regime;