feat: 组合Tab展示v_mr精选版(v_mr_sel)真实数据, 删除被证伪的最超跌文案

- 后端: members优先读v_mr_sel(144笔/15.51%/90.3%), 无则回退v_mr基线
- 前端: 实盘链路文字改为精选规则描述(正面4因子+剔除4负面), 删最超跌
- 前端: v_mr卡片加精选版徽章标识
- 数据: v_mr_sel已存strategy_research(六步方法论推导结果)
This commit is contained in:
xxm
2026-08-03 00:58:40 +08:00
parent 5594e404dc
commit a4dd139fc1
2 changed files with 18 additions and 7 deletions
+16 -5
View File
@@ -108,13 +108,22 @@ def get_combo_dashboard():
combos.append(d)
# 3. 组合成员策略的独立指标
# v_mr 优先取精选版 v_mr_sel(六步方法论调优,2026-08-02),无则回退基线 v_mr
members = {}
for v in ["v_next4", "v_mr"]:
r = conn.execute(
"SELECT results_json FROM strategy_research"
" WHERE version=? AND period_tag='10y' ORDER BY id DESC LIMIT 1",
(v,),
).fetchone()
sel_v = "v_mr_sel" if v == "v_mr" else None
candidates = [sel_v, v] if sel_v else [v]
r = None
used_sel = False
for cv in candidates:
r = conn.execute(
"SELECT results_json FROM strategy_research"
" WHERE version=? AND period_tag='10y' ORDER BY id DESC LIMIT 1",
(cv,),
).fetchone()
if r:
used_sel = (cv == sel_v)
break
if r:
res = json.loads(r[0])
s = res.get("summary", {})
@@ -122,6 +131,8 @@ def get_combo_dashboard():
p5 = s.get("portfolio", {})
members[v] = {
"role": "趋势市主战" if v == "v_next4" else "震荡/下跌市接管",
"version": "v_mr_sel" if used_sel else "v_mr",
"is_sel": used_sel,
"trades": s.get("total_trades"),
"win_rate": s.get("win_rate"),
"avg_profit_pct": s.get("avg_profit_pct"),
+2 -2
View File
@@ -2090,7 +2090,7 @@ async function renderResearchCombo() {
const u = m.universality || {};
const yearly5 = m.positions_taken_5slot && m.positions_taken_5slot > 0 ? Math.round(m.positions_taken_5slot / 10) : '—';
h += '<div class="bg-slate-800/50 rounded-lg p-3">' +
'<div class="flex items-center justify-between mb-1.5"><span class="font-mono font-bold text-base text-' + (v === 'v_next4' ? 'emerald-400' : 'amber-300') + '">' + v + '</span>' +
'<div class="flex items-center justify-between mb-1.5"><span class="font-mono font-bold text-base text-' + (v === 'v_next4' ? 'emerald-400' : 'amber-300') + '">' + v + (m.is_sel ? ' <span class="text-[11px] bg-amber-500/20 text-amber-300 px-1.5 rounded ml-1 align-middle">精选版</span>' : '') + '</span>' +
'<span class="text-xs text-slate-400">' + (m.role || '') + '</span></div>' +
// 盈利率大字突出(用户关注的核心指标)
'<div class="flex items-end gap-4 mb-2">' +
@@ -2105,7 +2105,7 @@ async function renderResearchCombo() {
'<div><div class="text-slate-500 text-xs">覆盖月</div><div class="font-mono">' + (u.months || '—') + '</div></div>' +
'</div>' +
'<div class="text-xs text-slate-400">均持' + (m.avg_hold_days != null ? m.avg_hold_days + '天' : '—') + ' · 回撤' + (m.max_dd_pct != null ? m.max_dd_pct + '%' : '—') + ' · 组合年均' + yearly5 + '笔(人工可操作)</div>' +
(v === 'v_mr' ? '<div class="text-[13px] text-slate-300 mt-1.5 border-t border-slate-800 pt-1">📋 实盘链路22k信号 → 组合模拟执行' + (m.positions_taken_5slot || 0) + '笔 → 每日扫描器只挑最超跌少数候选(2026-08-02首跑仅3只)→ 人工确认建仓。22k是候选池,不是操作量。</div>' : '') +
(v === 'v_mr' ? '<div class="text-[13px] text-slate-300 mt-1.5 border-t border-slate-800 pt-1">📋 实盘链路v_mr精选版 v_mr_sel):10年' + (m.trades || 0) + '个信号 → 六步方法论精选因子筛选(正面:mom20∈[-20,-14]+rsi_delta≥10+dist_ma20∈[-10,-7]+atr_pct≥4.5;剔除:大盘ADX≥35/资金流出/过深超跌/60日跌过32%)→ 组合模拟执行' + (m.positions_taken_5slot || 0) + '笔 → 每日扫描器候选 → 人工确认建仓。年均仅' + yearly5 + '笔,完全手工可操作。当前市场ADX=45.66强趋势下行,精选规则正确拒绝接飞刀(2026-08-03实测0命中)。</div>' : '') +
'</div>';
}
h += '</div>';