做滚动波动率时,很多代码只有一行:先算收益率,再调用 rolling(20).std()。窗口写了 20,看起来就是“最近 20 个交易日”,但序列里只要有停牌、缺数或新股上市,实际参与计算的样本数就可能不同。
pandas 官方文档说明,min_periods 决定窗口至少需要多少个有效观测值才能返回结果,否则就是 NaN。整数窗口未显式设置时,默认要求样本数等于窗口长度;按时间偏移量定义窗口时,默认值则是 1。因此 rolling(20) 与 rolling("20D") 不只是交易日和自然日的区别,有效样本门槛也不同。
我通常把窗口和门槛都写出来,并保存有效样本数:
ret = close.pct_change(fill_method=None)
win = ret.rolling(window=20, min_periods=15)
vol = win.std(ddof=1)
count = win.count()
这段代码允许 20 个位置中至少有 15 个有效收益率,但门槛不能照搬。若策略要求严格可比,可以把 min_periods 设为 20;如果允许少量缺失,就要检查样本数变化是否影响排序。对新股尤其要小心,门槛过低会让它只凭几天数据就和成熟股票进入同一横截面。
另一个容易忽略的参数是 center。默认 center=False,结果标签位于窗口右端,符合“截至当天已看到的数据”;设为 True 后标签移到窗口中心,不适合直接当成实时信号。若信号在收盘后生成,下一交易日才能成交,还要继续做时间对齐。
我一般同时输出 vol、count 和缺失原因,抽查新股、停牌股与数据断点。滚动指标是否可信,不能只看公式,还要回答:窗口覆盖哪些日期、实际用了多少样本、结果何时可用。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。