diff --git a/evolution/evolution_api.py b/evolution/evolution_api.py index 514dc940..7bcbe5af 100644 --- a/evolution/evolution_api.py +++ b/evolution/evolution_api.py @@ -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 管理超跌持仓"}, ], } diff --git a/static/index.html b/static/index.html index ed9687af..63a5fde2 100644 --- a/static/index.html +++ b/static/index.html @@ -2171,7 +2171,7 @@ async function renderResearchCombo() { '🧬 当前组合方案' + '市场阶段: ' + regName + '' + (regime.adx ? ' ADX=' + regime.adx + '' : '') + '' + '' + - '
策略家族(§39/§40):v_next4 趋势池 + v_weak 弱市甜区 + s2_panic 极端恐慌买超跌——同时运行、票自己对号入座、信号零重叠
' + + '
当前组合(2026-08-11):v_weak(弱市超跌确认,实盘)+ p_oversold(预测超跌反弹,新策略)+ 12维重评(持仓管理)——选股与持仓管理分离,超跌家族并行
' + '
'; for (const rt of (d.routing || [])) { const active = regime.regime === rt.regime;