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

backtesting包回测买卖策略所有参数结果一致问题求助

问题原因

所有参数组合回测结果一致是三个核心问题导致的:

  • 策略参数没有正确传入:backtesting 框架要求待优化的参数必须定义为策略类的公开属性,调用 bt.run() 时通过关键字参数传入对应值。你代码里循环的i/j是全局作用域变量,策略类内部没有定义这两个参数,也没有在run时传值,next()里的self.buy_int=i/self.sell_int=j实际根本拿不到当前循环的参数值,甚至会触发变量未定义的报错。
  • 交易逻辑和参数完全脱钩:next()方法里没有任何基于i/j阈值的条件判断,无差别直接调用self.buy()和self.sell(),所有参数组合下每根K线执行的交易动作完全相同,回测结果自然不会有差异。
  • 附带的小问题:日期列重命名为空字符串作为索引不规范;未导入pandas会导致最后生成DataFrame时报错;每次循环都调用bt.plot()会生成大量冗余图表,拖慢遍历速度。
修改方案
  • 将待遍历的买卖阈值定义为策略类的类属性,作为框架可识别的优化参数
  • 补全基于阈值的交易判断逻辑,确保参数真正参与买卖决策
  • 修正数据预处理、依赖导入的小问题,参数遍历阶段关闭绘图
  • 调用bt.run()时显式传入当前循环的i/j参数值

修改后可运行的代码如下:

import pandas
from backtesting import Backtest, Strategy
from fastquant import get_stock_data

# 数据获取与预处理
vix = get_stock_data("^VIX", "2007-06-01", "2010-01-01")
vix = vix.reset_index()
vix = vix.rename(columns={
    'dt': 'Date',
    'open': 'Open',
    'high': 'High',
    'low': 'Low',
    'close': 'Close',
    'volume': 'Volume'
})
vix = vix.set_index('Date')

# 定义策略,参数作为类属性声明
class VixStrategy(Strategy):
    # 定义待优化的参数,设置默认值
    buy_int = 10
    sell_int = 30

    def init(self):
        self.price = self.data.Close

    def next(self):
        # 无持仓时,价格超过买入阈值则开多
        if not self.position and self.price[-1] > self.buy_int:
            self.buy()
        # 持有多仓时,价格低于卖出阈值则平仓
        elif self.position and self.price[-1] < self.sell_int:
            self.sell()

table = []
# 遍历参数组合
for i in range(10, 30, 5):
    for j in range(30, 50, 5):
        bt = Backtest(vix, VixStrategy, exclusive_orders=True, cash=10000)
        # 显式传入当前循环的参数
        result = bt.run(buy_int=i, sell_int=j)
        print(f"参数组合i={i},j={j} 回测完成")
        table.append(result[[
            "Equity Final [$]", "Return [%]", "Sharpe Ratio",
            "Max. Drawdown [%]", "# Trades", "Avg. Trade Duration",
            "Duration", "Max. Trade Duration"
        ]])
        # 参数遍历阶段不需要每次绘图,找到最优参数后再单独调用绘图即可

df = pandas.DataFrame(table)
# 增加参数列方便对应结果和参数组合
df["buy_int"] = [i for i in range(10,30,5) for _ in range(4)]
df["sell_int"] = list(range(30,50,5))*4
print(df)

注:上述交易逻辑是按照VIX均值回归的常用思路写的示例,你可以根据自己原本的策略规则替换买卖判断条件,核心是保证参数被正确传入、且参数真正参与交易决策。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:27:16