diff --git a/static/index.html b/static/index.html index 80595079..66427c73 100644 --- a/static/index.html +++ b/static/index.html @@ -2016,7 +2016,12 @@ function renderStrategyTable(strategies) { const sh = Math.min(Math.max(st.sharpe_ratio || 0, 0), 20) / 20 * 20; const pfc = Math.min(st.profit_factor || 0, 5) / 5 * 15; const dd = (1 - Math.min(pff.portfolio_max_dd_pct || 0, 50) / 50) * 15; - s._composite = Math.round(ret + wr + sh + pfc + dd); + // 置信系数:样本量(<40笔递减) × 普适月份(<6月递减)——小样本/单窗口策略的可信度打折 + const n = st.total_trades || 0; + const months = (st.universality || {}).months || 0; + const conf = Math.min(1, n / 40) * (months > 0 ? Math.min(1, months / 6) : 1); + s._confidence = conf; + s._composite = Math.round((ret + wr + sh + pfc + dd) * conf); } // 保存数据用于列排序 window._strats = strategies; @@ -2107,7 +2112,7 @@ function renderStrategyTable(strategies) { '' + s.version + (isCurrent ? ' 当前' : '') + ((s.market && s.market !== 'all') ? ' ' + (s.market === 'hk' ? '港' : 'A') + '' : '') + '' + '' + (s.name || '') + (smallSample ? ' ⚠️' : '') + '' + '' + (st.sizing_slots ? st.sizing_slots + '仓' : '10仓') + '' + - cell('composite', s._composite, v => v, 'font-bold text-amber-300') + + cell('composite', s._composite, v => v + (s._confidence != null && s._confidence < 1 ? '×' + s._confidence.toFixed(2) + '' : ''), 'font-bold text-amber-300') + cell('universality_score', (st.universality || {}).score, v => v + '/' + (st.universality || {}).months + '月') + cell('full_return_pct', (st.portfolio_full || {}).total_return_pct, v => v + '%' + ((st.portfolio_full||{}).std ? '±' + (st.portfolio_full||{}).std + '' : ''), 'font-bold text-amber-300') + cell('capital_final', (st.portfolio_full||pf).capital_final, v => '¥' + (v/10000).toFixed(0) + '万') +