fix: 温区年化口径——线性放大改为按温区trades实际跨度复利年化(b_td1 1547%失真根因)
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user