From 0bbc489a1b99c8d83cafb35e9942f0fdb96d671d Mon Sep 17 00:00:00 2001 From: hmo Date: Wed, 29 Jul 2026 15:32:54 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=97=E8=A1=A8=E5=8F=8C=E5=8F=A3?= =?UTF-8?q?=E5=BE=84=E2=80=94=E2=80=94=E6=96=B0=E5=A2=9E=E5=85=A8=E5=8F=82?= =?UTF-8?q?=E4=B8=8E=E6=94=B6=E7=9B=8A=E4=B8=BB=E5=88=97(=E5=8D=95?= =?UTF-8?q?=E4=BB=93=E2=89=A55=E4=B8=87=E5=85=AC=E5=B9=B3=E5=9F=BA?= =?UTF-8?q?=E7=BA=BF)=EF=BC=8C=E9=9B=86=E4=B8=AD=E4=BB=93=E4=B8=BA?= =?UTF-8?q?=E8=BE=85=E5=88=97=EF=BC=8Cv11.0=E7=8E=B0=E5=8E=9F=E5=BD=A2(?= =?UTF-8?q?=E5=85=A8=E5=8F=82=E4=B8=8E=E4=BB=85+28.9%)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/index.html | 7 +++++-- strategy_lab.py | 4 +++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/static/index.html b/static/index.html index 7bba7b13..3025d3d2 100644 --- a/static/index.html +++ b/static/index.html @@ -1979,6 +1979,7 @@ function sortStrategies(strategies, key, dir) { case 'composite': return s._composite != null ? s._composite : -999; case 'universality': return (st.universality || {}).score || 0; case 'total_return': return pf.total_return_pct != null ? pf.total_return_pct : -999; + case 'full_return': return (st.portfolio_full || {}).total_return_pct != null ? st.portfolio_full.total_return_pct : -999; case 'capital_final': return pf.capital_final || 0; case 'cagr': return pf.cagr_pct != null ? pf.cagr_pct : -999; case 'trades': return st.total_trades || 0; @@ -2084,7 +2085,8 @@ function renderStrategyTable(strategies) { th('sizing_slots', '仓位', 'text-center') + th('composite', '综合', 'text-right') + th('universality', '普适', 'text-right') + - th('total_return', '总收益', 'text-right') + + th('full_return', '全参与', 'text-right') + + th('total_return', '集中仓', 'text-right') + th('capital_final', '最终资产', 'text-right') + th('cagr', '年化', 'text-right') + th('trades', '交易数', 'text-right') + @@ -2107,7 +2109,8 @@ function renderStrategyTable(strategies) { '' + (st.sizing_slots ? st.sizing_slots + '仓' : '10仓') + '' + cell('composite', s._composite, v => v, 'font-bold text-amber-300') + cell('universality_score', (st.universality || {}).score, v => v + '/' + (st.universality || {}).months + '月') + - cell('total_return_pct', pf.total_return_pct, v => v + '%', 'font-bold ' + retCls + ' ' + hl(pf.total_return_pct, best.total_return_pct)) + + cell('total_return_pct', (st.portfolio_full || {}).total_return_pct, v => v + '%', 'font-bold text-amber-300') + + cell('total_return_pct', pf.total_return_pct, v => v + '%', retCls + ' ' + hl(pf.total_return_pct, best.total_return_pct)) + cell('capital_final', pf.capital_final, v => '¥' + (v/10000).toFixed(0) + '万') + cell('cagr_pct', pf.cagr_pct, v => v + '%', hl(pf.cagr_pct, best.cagr_pct)) + cell('total_trades', st.total_trades, v => v) + diff --git a/strategy_lab.py b/strategy_lab.py index ecc8c231..a7525187 100644 --- a/strategy_lab.py +++ b/strategy_lab.py @@ -1012,11 +1012,13 @@ def run_backtest(strategy_version, start_date, end_date, capital=1000000, save=T i += step summary = calc_summary(trades, capital) - # 组合级资产模拟:用该策略自己的最优仓位模型(波段策略大仓少股,固定出场小仓多股) if summary: + # 集中仓位(该策略最优激进仓位) slots = STRATEGY_SIZING.get(strategy_version, 10) summary['portfolio'] = portfolio_sim(trades, capital, slots) summary['sizing_slots'] = slots + # 全参与可行仓位(公平基线:单仓≥5万地板,消除上车运气) + summary['portfolio_full'] = portfolio_sim_full(trades, capital) result = { 'strategy': strat['version'], 'strategy_name': strat['name'],