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

