fix: 温区年化口径——线性放大改为按温区trades实际跨度复利年化(b_td1 1547%失真根因)

This commit is contained in:
xxm
2026-08-16 20:16:25 +08:00
parent 518513e02f
commit cc37b9c93b
@@ -147,9 +147,17 @@ def process_period(conn, market, period_tag):
if not sim: if not sim:
continue continue
ret = sim.get("total_return_pct") ret = sim.get("total_return_pct")
# 线性年化:收益 × (窗口总天数 / 该温区窗口内天数) # 复利年化(2026-08-16 修正):按该温区 trades 实际时间跨度
rd = reg_days.get(reg, 0) # 原线性放大 ret×(total_days/rd) 对高频复利策略失真(b_td1 388%×4=1547%
cagr = round(ret * (total_days / rd), 1) if ret is not None and rd > 0 and total_days > 0 else None _eds = [t.get("entry_date") for t in reg_trades if t.get("entry_date")]
if ret is not None and _eds:
from datetime import datetime as _dt
_d0 = _dt.strptime(min(_eds), "%Y-%m-%d")
_d1 = _dt.strptime(max(_eds), "%Y-%m-%d")
span_days = max((_d1 - _d0).days, 30)
cagr = round(((1 + ret / 100) ** (365 / span_days) - 1) * 100, 1)
else:
cagr = None
conn.execute( conn.execute(
"""INSERT OR REPLACE INTO strategy_regime_perf_by_period """INSERT OR REPLACE INTO strategy_regime_perf_by_period
(strategy, market, regime, period_tag, trades, win_rate, avg_pnl, avg_hold_days, (strategy, market, regime, period_tag, trades, win_rate, avg_pnl, avg_hold_days,