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

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),重点查这几点:

  1. 数据导入后的列名、索引格式
  2. RSI等动量指标的计算结果是否正常
  3. 多空条件的布尔值是否正确生成
  4. next()方法里的下单调用是否正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:42:51