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

如何处理Pandas计算股票回报率时产生的-Inf值?

解决股票回报率计算中出现-Inf导致后续NaN的问题

这问题我之前做量化分析时也碰到过!根源其实是pct_change()的计算逻辑——它是用当前值 - 前一个值再除以前一个值,当你的avg列里出现0值的时候,就会触发除以0的情况,直接生成-Inf或者Inf。而默认的dropna()只会删除NaN,不会处理这些无穷值,所以它们会留在数据里,后续做统计、建模等操作时就容易莫名其妙出现NaN。

第一步:确认问题根源

先检查你的avg列是否存在0值,运行这段代码就能定位:

print(data[data['avg'] == 0])

如果输出结果里有行数据,那这些0值就是导致-Inf的罪魁祸首。

解决方案(按推荐程度排序)

方案1:提前处理0值(最符合业务逻辑)

如果你的股票数据里的0值是异常值(比如停牌、数据缺失),可以先把0值替换成合理的数值,比如用前一个非0值填充(适合时间序列数据):

# 用前一个非0值填充0
data['avg'] = data['avg'].replace(0, method='ffill')
# 如果数据开头就有0,再用后一个非0值填充剩下的0
data['avg'] = data['avg'].replace(0, method='bfill')

处理完0值后,再计算回报率就不会出现除以0的情况了:

data['return'] = data['avg'].pct_change()/100
data.dropna(inplace=True)

方案2:计算回报率时直接规避除以0

用numpy.where做条件判断,当发现前一个avg值为0时,直接把回报率设为NaN,避免生成无穷值:

import numpy as np
data['return'] = np.where(
    data['avg'].shift(1) == 0,  # 检查前一个avg值是否为0
    np.nan,                     # 若是,回报率设为NaN
    data['avg'].pct_change()/100  # 否则正常计算
)
data.dropna(inplace=True)

方案3:计算后清理无穷值

如果已经生成了-Inf/Inf,可以直接把它们替换成NaN后再删除:

import numpy as np
data['return'] = data['avg'].pct_change()/100
# 将所有正负无穷值替换为NaN
data['return'] = data['return'].replace([np.inf, -np.inf], np.nan)
data.dropna(inplace=True)

注意事项

处理前一定要结合业务逻辑判断0值的意义:

  • 如果是股票停牌导致的0,用前值填充更合理;
  • 如果是数据采集错误,可能需要删除对应行;
  • 不同场景的处理方式会影响后续分析的准确性,别盲目套用方案哦!

内容的提问来源于stack exchange,提问作者Coolio2654

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:36:32