数据频率错位:为什么把周频因子ffill填成日频,会吃掉日频策略全部超额?
核心摘要速览:
把日频策略架在周频更新的数据表上,回测出的高夏普往往是‘频率错配租金’或周五收盘时间戳泄漏,一进仿真盘就会因周一集中换仓滑点而原形毕露。
把日频策略架在周频更新的数据表上,回测出的高夏普往往是‘频率错配租金’或周五收盘时间戳泄漏,一进仿真盘就会因周一集中换仓滑点而原形毕露。
一、信号混叠与陈旧暴露:周频填日频的三层错配
当因子底表实质为每周五更新,却在数据库里用 ffill 展开成自然日序列时,日频策略在周二至周四读取的依然是上周五的陈旧状态。这不仅丢失了周内跳空与流动性突变信息,更导致组合在每周一开盘集中调仓,承受数倍于平时的冲击成本。
二、左对齐时间戳引发的隐性未来函数
更隐蔽的工程事故是将整周聚合指标(如周度资金净流入、周线MACD)的时间戳记在周一或周中。日频回测引擎在周三循环时便读到了包含周五收盘信息的完整周指标,形成严重的前视污染。
三、As-Of 时间戳严格对齐自查代码
import pandas as pd
def align_weekly_to_daily_asof(df_daily, df_weekly, avail_lag_days=1):
"""
将周频因子按实际可得交易日安全对齐至日频面板,阻断前视泄漏
"""
w = df_weekly.copy().sort_values('report_friday')
w['available_date'] = w['report_friday'] + pd.Timedelta(days=avail_lag_days)
d = df_daily.sort_values('trade_date')
merged = pd.merge_asof(
d, w, left_on='trade_date', right_on='available_date',
by='ts_code', direction='backward'
)
return merged
四、上线前配对回测检验清单
每个日频策略上线前,必须固定手续费与滑点规则,分别按交易日(周一至周五)拆解收益贡献占比。若周五信号贡献了全周80%以上的超额收益,且信号整体延后1天收益衰减超过30%,应立即叫停参数优化,优先排查底层数据表更新频率。