分组滚动窗口计算动量策略累计收益时pandas rolling无cumprod属性报错
报错原因
你遇到的如下报错:
AttributeError: 'Rolling' object has no attribute 'cumprod'
是因为pandas的Rolling滚动窗口对象仅内置了sum、mean、skew、kurt等常规统计方法,没有原生实现cumprod累乘功能,需要通过自定义滚动聚合逻辑实现。
实现方案
注意:动量计算用的日收益率通常是涨跌幅度,累乘前需要加1转换为增长系数,计算完成后再减1得到累计收益率,否则直接累乘涨跌幅会得到错误结果。
完整可运行代码如下:
import pandas as pd import numpy as np # 你的样例数据生成 df = pd.DataFrame({ 'id':np.repeat(range(100), 10), 'dailyreturn':np.random.randn(1000), 'date':np.random.choice(pd.date_range('1/1/2011', periods=12,freq='M'), 1000, replace=True) }) # 第一步:按id和日期排序,保证滚动窗口的时序正确性 df = df.sort_values(['id', 'date']).reset_index(drop=True) # 第二步:分组滚动累乘计算1年动量 df['mom_1Y'] = df.groupby('id')['dailyreturn'].apply( lambda x: x.add(1) # 涨跌幅+1转为增长系数 .rolling(251, min_periods=22) # 251个交易日滚动窗口,最少22个有效数据 .apply(np.prod, raw=True) # 自定义窗口内乘积计算,raw=True提升运行性能 .sub(1) # 减1转回累计收益率 ).reset_index(level=0, drop=True)
优化建议
- 如果你使用的pandas版本低于1.3,建议升级到最新稳定版,新版
rolling.apply的运行效率提升明显 - 如果数据量超过百万行,可以给
apply添加engine='numba'参数(需要提前安装numba库),可大幅提升计算速度 - 若日收益率存在缺失值,可在
np.prod中添加skipna=True参数自动忽略空值
内容的提问来源于stack exchange,提问作者pinpss
相关产品推荐
相关产品推荐

