首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >同一段收益率,pandas 和 NumPy 的波动率为什么不同

同一段收益率,pandas 和 NumPy 的波动率为什么不同

原创
作者头像
量化行业新引擎
发布于 2026-10-27 10:30:16
发布于 2026-10-27 10:30:16
910
举报
文章被收录于专栏:AI量化视界AI量化视界

把同一段日收益率分别交给 pandas 和 NumPy,有时会得到两套波动率。数组没有变、窗口也一样,差异通常不是浮点误差,而是自由度参数 ddof 的默认值不同。

pandas 的 Rolling.std() 默认 ddof=1,计算时分母是 N-1;NumPy 的 std() 默认 ddof=0,分母是 N。前者常用于样本标准差,后者按当前数据总体计算。窗口较长时两者会接近,但在 5 日、10 日这类短窗口里,偏差足以影响波动率排序、仓位缩放和风险阈值。

如果研究代码用 pandas,线上模块改成 NumPy,最好不要依赖默认值,而是明确写出口径:

ret = close.pct_change()

vol_pandas = ret.rolling(20, min_periods=20).std(ddof=0)

vol_numpy = np.std(ret.iloc[-20:].to_numpy(), ddof=0)

这样两端都使用 ddof=0。如果策略定义采用样本标准差,也可以统一设为 1;关键不在于哪个一定正确,而在于研究、回测和生产环境使用同一个定义。

年化时还要再核对两件事。第一,日频波动率常乘以 sqrt(252),这个 252 是交易日尺度,不应直接套到周频或分钟数据。第二,窗口中若有缺失值,pandas 会结合 min_periods 决定是否输出结果,而 NumPy 的 std 遇到 NaN 会返回 NaN;如果改用 nanstd,有效样本数又会变化。处理停牌、上市初期和数据缺口时,应同时记录有效观测数。

我现在会把 window、ddof、min_periods 和年化系数一起放进策略配置,并用一段固定收益率做单元测试。波动率只是一个数字,但只要口径没锁定,后面的风险预算再精细,也可能建立在两套不同的输入上。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档