fix(rotation): 修复 backtest detail 中指数和 ETF 累计收益计算 bug
- 问题:cum_return_idx 和 cum_return_etf 使用相同的 ETF 价格计算 - 修复:分别使用指数价格(raw)和 ETF 价格(hfq)独立计算 - 验证:72.6% 的持仓记录显示差异(0.06%~0.48%),符合预期 - 新增验证脚本:verify_cum_return_fix.py
This commit is contained in:
@@ -795,19 +795,29 @@ class GlobalRotationStrategy(StrategyBase):
|
||||
trading_days_held = len(trading_calendar[(trading_calendar >= entry_dt) & (trading_calendar <= date)])
|
||||
asset['holding_days'] = trading_days_held
|
||||
|
||||
# 累计收益
|
||||
# 累计收益(分别使用 ETF 和指数价格计算)
|
||||
if hs['entry_price'] and hs['entry_price'] > 0:
|
||||
# ETF 累计收益
|
||||
if code in etf_close_dict:
|
||||
cur = etf_close_dict[code].reindex(trading_calendar, method='ffill').get(date)
|
||||
if cur and pd.notna(cur):
|
||||
cum_ret = float(cur) / hs['entry_price'] - 1
|
||||
asset['cum_return_etf'] = self._safe_val(cum_ret, 4)
|
||||
asset['cum_return_idx'] = self._safe_val(cum_ret, 4)
|
||||
etf_cur = etf_close_dict[code].reindex(trading_calendar, method='ffill').get(date)
|
||||
if etf_cur and pd.notna(etf_cur):
|
||||
etf_cum_ret = float(etf_cur) / hs['entry_price'] - 1
|
||||
asset['cum_return_etf'] = self._safe_val(etf_cum_ret, 4)
|
||||
else:
|
||||
asset['cum_return_etf'] = None
|
||||
asset['cum_return_idx'] = None
|
||||
else:
|
||||
asset['cum_return_etf'] = None
|
||||
|
||||
# 指数累计收益(独立计算)
|
||||
if code in index_close_dict:
|
||||
idx_cur = index_close_dict[code].reindex(trading_calendar, method='ffill').get(date)
|
||||
idx_entry = index_close_dict[code].reindex(trading_calendar, method='ffill').get(entry_dt)
|
||||
if idx_cur and idx_entry and pd.notna(idx_entry) and float(idx_entry) > 0:
|
||||
idx_cum_ret = float(idx_cur) / float(idx_entry) - 1
|
||||
asset['cum_return_idx'] = self._safe_val(idx_cum_ret, 4)
|
||||
else:
|
||||
asset['cum_return_idx'] = None
|
||||
else:
|
||||
asset['cum_return_idx'] = None
|
||||
else:
|
||||
asset['cum_return_etf'] = None
|
||||
|
||||
Reference in New Issue
Block a user