From e8d0027cd2b2d50a23cdaf63948ffa979eb26e0e Mon Sep 17 00:00:00 2001 From: hmo Date: Thu, 30 Jul 2026 17:06:35 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=B9=B4=E5=8C=96=E7=94=A8=E5=9B=9E?= =?UTF-8?q?=E6=B5=8B=E5=8C=BA=E9=97=B4=E5=B9=B4=E6=95=B0(=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E4=BA=A4=E6=98=93=E8=81=9A=E9=9B=86=E7=88=86=E7=82=B8?= =?UTF-8?q?)+=E8=B5=84=E6=9C=AC=E5=9F=BA=E6=95=B0=E7=BB=9F=E4=B8=80913k?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- strategy_lab.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/strategy_lab.py b/strategy_lab.py index 8cd107b2..8a8376d8 100644 --- a/strategy_lab.py +++ b/strategy_lab.py @@ -680,7 +680,7 @@ def has_breakout_dna(bars, i, lookback=10): return False -def run_backtest(strategy_version, start_date, end_date, capital=1000000, save=True, universe='all', period_tag='2y'): +def run_backtest(strategy_version, start_date, end_date, capital=913000, save=True, universe='all', period_tag='2y'): strat = get_strategy(strategy_version) cfg = strat['config'] entry_cfg, exit_cfg = cfg['entry'], cfg['exit'] @@ -1044,6 +1044,10 @@ def run_backtest(strategy_version, start_date, end_date, capital=1000000, save=T summary = calc_summary(trades, capital) if summary: + # 年化统一用回测区间年数(修复交易聚集导致年化爆炸) + _y0 = datetime.strptime(start_date, '%Y-%m-%d') + _y1 = datetime.strptime(end_date, '%Y-%m-%d') + _bt_years = max((_y1 - _y0).days / 365.0, 0.5) # 信念缩放(通用,2026-07-29验证全策略+7~16pp):动量基因票默认×2.5 boost_k = cfg.get('exit', {}).get('dna_boost', 2.5) for t in trades: @@ -1054,6 +1058,11 @@ def run_backtest(strategy_version, start_date, end_date, capital=1000000, save=T summary['sizing_slots'] = slots # 全参与可行仓位(公平基线:单仓≥5万地板,消除上车运气) summary['portfolio_full'] = portfolio_sim_full(trades, capital) + # cagr 统一用回测区间年数覆盖(portfolio_sim里按交易跨度算的会爆炸) + _tr = summary['portfolio'].get('total_return_pct', 0) / 100 + _tf = summary['portfolio_full'].get('total_return_pct', 0) / 100 + summary['portfolio']['cagr_pct'] = round((((1 + _tr) ** (1 / _bt_years)) - 1) * 100, 1) + summary['portfolio_full']['cagr_pct'] = round((((1 + _tf) ** (1 / _bt_years)) - 1) * 100, 1) result = { 'strategy': strat['version'], 'strategy_name': strat['name'],