You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

分组滚动窗口计算动量策略累计收益时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:15:04