如何处理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
相关产品推荐
相关产品推荐

