Backtrader绘图报错ValueError: Axis limits cannot be NaN or Inf求助
嘿,我之前也碰到过这个ValueError: Axis limits cannot be NaN or Inf的问题,咱们来一步步拆解排查~
首先看你的代码,随机生成的数据确实不存在NaN或Inf值,那问题大概率出在Backtrader没有正确识别时间序列数据上——绘图时无法确定时间轴的有效范围,才抛出了这个轴限错误。
问题根源
你自定义的MyDataFeed里,把datetime参数设成了None,但你的DataFrame是用date列做索引的(datetime类型),Backtrader需要明确知道从哪里读取时间信息,否则绘图时时间轴没有有效数据,就会出现轴限为NaN的情况。
解决方案
给你两个可行的修复方案,选一个就行:
方案1:修复自定义DataFeed的datetime参数
把自定义DataFeed里的datetime参数改成-1,这个值表示让Backtrader直接使用DataFrame的索引作为时间列:
class MyDataFeed(bt.feeds.PandasData): params = ( ('datetime', -1), # 用DataFrame的索引作为datetime ('high', -1), ('low', -1), ('open', -1), ('close', -1), ('volume', None), ('openinterest', None), )
方案2:直接用默认的PandasData(更简单)
你的DataFrame列名(High、Low、Open、Close)完全符合Backtrader默认的PandasData参数要求,其实根本不需要自定义DataFeed,直接替换成下面的代码就行:
cerebro.adddata(bt.feeds.PandasData(dataname=df_random))
验证方法
修改之后重新运行代码,先确保cerebro.run()没有报错,再调用cerebro.plot(iplot=False),应该就能正常生成绘图了。
如果还是有问题,可以检查下策略里的指标是否正确关联了数据源,不过从你的代码看,self.sma = bt.indicators.SimpleMovingAverage(self.data)是没问题的,只要数据源的时间和价格数据正确读取,指标也能正常计算。
备注:内容来源于stack exchange,提问作者Nik Vh

