Backtesting.py动量策略回测统计仅显示NaN与0问题求助
解决Backtesting.py回测统计全为NaN/0的问题
以下是针对该问题的排查和解决方向:
- 先确认数据格式合规
Backtesting.py对输入数据有硬性要求:必须包含Open、High、Low、Close列,索引得是datetime类型(Volume可选但建议带上)。直接跑下面的代码验证:
print(df.info()) print(df.head())
如果索引不是datetime,立刻转换:
df.index = pd.to_datetime(df.index)
- 检查交易信号是否真的触发
统计全0/NaN基本说明没有任何交易执行,先确认你的多空条件在历史数据里有没有产生有效信号:
print(df[['Close', 'long_condition', 'short_condition']].dropna())
要是输出里没有True值,那要么是pandas_ta的指标参数设错了,要么是条件判断逻辑写错了(比如把==写成=,或者逻辑运算符用反了)。
- 核对策略类的下单逻辑
确保next()方法里正确根据信号执行下单,比如:
def next(self): # 触发多单信号且无持仓时买入 if self.data.long_condition[-1] and not self.position: self.buy() # 触发空单信号且有持仓时平仓做空 elif self.data.short_condition[-1] and self.position: self.close() self.sell()
别犯引用未来数据的错误——比如直接用self.data.long_condition而不是取历史索引值,这会导致信号根本触发不了。
- 回测初始化环节别出错
确认带指标的DataFrame正确传入Backtest类,策略绑定没问题:
bt = Backtest(df, MyStrategy, cash=10000, commission=0.001) stats = bt.run()
另外初始资金cash别设得太低,不然可能连一手都买不了。
- 开日志看细节
开启调试日志,能看到每一步的下单尝试和持仓变化:
import logging logging.basicConfig(level=logging.DEBUG)
日志会帮你定位到底是信号没生成,还是下单逻辑有问题。
结合你提供的笔记本代码(algo_trader仓库backtests目录下的debugging_example_backtestingdotpy.ipynb),重点查这几点:
- 数据导入后的列名、索引格式
- RSI等动量指标的计算结果是否正常
- 多空条件的布尔值是否正确生成
next()方法里的下单调用是否正确
内容的提问来源于stack exchange,提问作者so1120
相关产品推荐
相关产品推荐

