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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:12:47