Pandas计算Close列滚动收益率执行dropna后返回空DataFrame问题
问题根因
你的代码返回空DataFrame由两个错误导致:
dropna(1)等价于dropna(axis=1),逻辑是删除所有存在空值的列。pct_change(periods=wind)计算时,前wind行必然为空,因此Close列会被判定为存在空值直接被删除,最终得到无列的空表。- 你的日期索引为倒序(最新日期在最上方),直接计算会得到反向的变动率,不符合收益率计算逻辑。
正确实现
先将日期索引调整为从旧到新的正序,再计算周期百分比变化,最后按行删除带空值的记录即可:
# 按日期升序排序,保证收益率计算方向正确 closing_data = closing_data.sort_index(ascending=True) # 计算wind周期滚动收益率,按行删除空值 rolling_return = closing_data["Close"].pct_change(periods=wind).dropna() # 若需要保留整个DataFrame结构而非单独的Close序列,使用如下写法 # rolling_return_df = closing_data.pct_change(periods=wind).dropna(axis=0)
计算逻辑说明
pct_change(periods=wind)的计算规则为(当前值 - 前wind期值)/前wind期值,和你需要的滚动窗口收益率逻辑完全一致,不需要额外调用rolling类方法。以wind=2为例,排序后2022-05-19的收益率为(137.350006 - 149.240005)/149.240005 ≈ -7.97%,结果符合预期。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

