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

求助:backtesting.py中MACD-RSI策略无信号生成问题排查

问题分析与修复方案

你的策略无法生成信号的核心原因是MACD的信号线没有通过backtesting.py要求的self.I()方法注册,同时还有一些冗余代码干扰了指标的正确加载:

具体问题点:

  • 你只对RSI和MACD主线用了self.I(),但信号线self.signal直接用了macd_indicator.macd_signal()的结果,没有注册到backtesting的指标系统里,导致crossover函数无法识别它的时间序列,自然触发不了信号。
  • 代码里对self.macd做了两次赋值,第一次直接计算结果的操作完全多余,还容易造成逻辑混淆。
  • 没必要把self.data.Close转成pd.Series,ta库可以直接接收backtesting的数据结构。

修正后的代码:

import ta
from backtesting import Backtest, Strategy
from backtesting.lib import crossover

class MACD_RSIStrategy(Strategy):
    def init(self):
        # 直接用self.data.Close,无需转Series
        rsi_indicator = ta.momentum.RSIIndicator(self.data.Close, window=14)
        macd_indicator = ta.trend.MACD(self.data.Close, 26, 12, 9, False)
        
        # 所有在next中用到的指标,必须用self.I()注册
        self.rsi = self.I(rsi_indicator.rsi)
        self.macd = self.I(macd_indicator.macd)
        self.signal = self.I(macd_indicator.macd_signal)

    def next(self):
        if crossover(self.macd, self.signal) and self.rsi[-1] < 30:
            self.position.close()
            self.buy()
        elif crossover(self.signal, self.macd) and self.rsi[-1] > 70:
            self.position.close()
            self.sell()

关键说明:

backtesting.py的self.I()方法是用来注册指标、维护时间序列上下文的核心方法,任何需要在next()中访问历史数据或参与信号计算的指标,都必须通过它包装。之前你在普通DataFrame里能运行,是因为不需要维护回测的时间步上下文,但在backtesting框架里必须遵守这个规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 12:16:07