使用backtesting库时遇Python TypeError错误求助
解决backtesting库Strategy初始化TypeError错误
错误原因
你手动实现了MyStrategy的__init__方法,并尝试调用父类Strategy的构造函数,但backtesting库的Strategy类不需要用户手动实现构造函数,其内部初始化逻辑由框架处理,直接传入data和params的方式不符合库的设计规范。此外,直接实例化MyStrategy对象也是错误的——策略实例应该由Backtest类自动创建和管理。
解决方案
1. 删除自定义的__init__方法
Strategy子类只需实现init和next方法即可,无需手动编写构造函数。如果需要自定义参数,通过类属性params声明。
2. 修正策略类代码
from backtesting import Strategy from backtesting.lib import crossover class MyStrategy(Strategy): # 自定义策略参数(可选,按需添加) params = dict( adx_threshold=21 ) def init(self): # 初始化逻辑(如创建指标)放在这里 pass def next(self): # 获取当前周期数据 supertrend_1h = self.data['Supertrend'] adx_1h = self.data['adx'] # 注意:backtesting的data对象是封装后的结构,直接resample可能存在问题 # 若需要多时间周期数据,建议提前将不同周期数据合并到df_1h中,或使用库的多时间周期支持 supertrend_1d = self.data['Supertrend'].resample('1D').last().ffill() adx_1d = self.data['adx'].resample('1D').last().ffill() # 交易逻辑 if crossover(supertrend_1h, adx_1h, crossover_above=True) and adx_1h[-1] > self.params.adx_threshold and adx_1h[-1] > adx_1h[-2]: self.buy() elif crossover(supertrend_1d, adx_1d, crossover_above=False) and adx_1d[-1] > self.params.adx_threshold and adx_1d[-1] > adx_1d[-2]: self.sell()
3. 正确运行回测
通过Backtest类管理策略实例,而非手动创建:
from backtesting import Backtest # 假设df_1h是预处理好的pandas DataFrame bt = Backtest(df_1h, MyStrategy, cash=10000, commission=0.001) results = bt.run() print(results) bt.plot()
关键说明
- backtesting框架会自动处理策略的初始化,包括数据传递、参数注入,无需用户干涉。
init方法是框架提供的初始化钩子,用于创建指标、初始化变量等操作,而非构造函数。- 多时间周期数据处理建议提前准备,避免在
next中动态resample(可能导致性能问题或逻辑错误)。
内容的提问来源于stack exchange,提问作者user9110693
相关产品推荐
相关产品推荐

