如何计算标普500的滚动周度、月度、季度收益率?
解决滚动周度/月度/季度收益率计算问题
你需要的是按周/月/季度分组的滚动累计收益率——每日更新到当日为止的当期累计收益,且每期(周/月/季)初重置计算起点,而不是降采样成单期一行的结果。以下是具体实现方法:
核心思路
先按时间周期(周/月/季)给数据打分组标签,再在每个分组内计算从期初到当日的累计收益率,保留每日数据行。
1. 滚动周度收益率实现
# 1. 生成跨年不重复的周标签(格式:年-周数) data['year_week'] = data.index.strftime('%Y-%W') # 2. 按周分组,计算滚动累计收益率(转成百分比) data['rolling_weekly_return'] = data.groupby('year_week')['daily_return'].apply( lambda x: 100 * ((x + 1).cumprod() - 1) )
- 用
%Y-%W生成周标签是为了避免跨年时周数重复(比如2023年第52周和2024年第52周不会混淆) (x + 1).cumprod()计算的是从周初到当日的累计净值,减1再乘100得到累计收益率百分比- 结果会保留原DataFrame的所有行,每周初收益率重置为0(首日
pct_change()为NaN,需处理的话可加.fillna(0))
2. 扩展到月度/季度收益率
只需要修改分组标签的生成逻辑即可:
滚动月度收益率
# 生成年-月标签 data['year_month'] = data.index.strftime('%Y-%m') # 按月分组计算滚动收益率 data['rolling_monthly_return'] = data.groupby('year_month')['daily_return'].apply( lambda x: 100 * ((x + 1).cumprod() - 1) )
滚动季度收益率
# 生成年-季度标签(格式:YYYYQN) data['year_quarter'] = data.index.to_period('Q').astype(str) # 按季度分组计算滚动收益率 data['rolling_quarterly_return'] = data.groupby('year_quarter')['daily_return'].apply( lambda x: 100 * ((x + 1).cumprod() - 1) )
和原resample方法的区别
- 原
resample("W")是降采样,将整周的收益压缩成一行,只保留每周最后一天的结果 - 上述方法是分组滚动计算,保留每日数据,每天显示到当日为止的当期累计收益,每期期初重置计算
内容的提问来源于stack exchange,提问作者Vivek Dabholkar
相关产品推荐
相关产品推荐

