求助: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
相关产品推荐
相关产品推荐

