"选回测框架最大的坑不是性能,是'撮合逻辑离实盘有多远'——backtrader 偏保守贴近真实,vectorbt 偏速度牺牲细节,选错方向后面全是返工。"

一句话:backtrader 是事件驱动、逐笔撮合的"慢而准",vectorbt 是向量化、批量扫参的"快而糙",两者不是替代关系而是分工关系,用错场景会返工。

它们各解决什么问题

维度 backtrader vectorbt
撮合模型 事件驱动、按 Tick / K 线顺序 向量化批量、按信号一次算完
速度 慢(逐笔模拟) 快(NumPy 并行,快 100-1000 倍)
参数扫描 几百组内可行 几十万~百万组常规操作
手续费 / 滑点 精细建模(每笔不同费率都行) 简化模型(整组统一)
可审计性 每笔交易可查、可回放 批量结果,看统计分布
学习曲线 中(API 清晰) 低(一行起回测)
维护状态 原作者停更、社区分支活跃 活跃(商业 + 开源双授权)
适合场景 策略调试、单策略精细回测 参数寻优、批量统计、学术实验

选哪套:一个决策树

  1. 想验证一个具体策略的真实表现(手续费、滑点、成交逻辑要贴近实盘)→ backtrader
  2. 想扫 10 万组参数找最优(网格搜索、遗传算法)→ vectorbt
  3. 想教学 / 入门回测原理(逐笔撮合看得懂每一步)→ backtrader
  4. 想学术上批量出统计结果(夏普分布、回撤分布)→ vectorbt
  5. 要跨股票 + 期货 + 加密多资产 → 两个都不合适,看 QuantConnect Lean

典型工作流组合

很多成熟量化团队是双引擎:

[开发期]  vectorbt 扫 10 万组参数 → 找到 Top 100 参数区间
            ↓
[调优期]  backtrader 用这 100 组做精细回测 → 挑出最稳健的 1 组
            ↓
[实盘前]  backtrader 的撮合逻辑做最后一轮验证(滑点、手续费、部分成交)

单独用哪一套都会漏掉对方的视角。纯 vectorbt 会漏掉滑点 / 手续费细节,纯 backtrader 会漏掉参数空间的边界(几百组扫不完)。

关键数据

项目 backtrader vectorbt
仓库 mementum/backtrader polakowo/vectorbt
星标 ~2.3 万 ~9.3 千
协议 GPL-3.0 商业 + 开源双
核心依赖 纯 Python NumPy + pandas
典型回测耗时 1 年日线 ~ 分钟级 1 年日线 1 万组 ~ 秒级

上手建议

backtrader:

import backtrader as bt

class MyStrategy(bt.Strategy):
    def next(self):
        if self.data.close[0] < self.data.sma[0]:
            self.buy()

cerebro = bt.Cerebro()
cerebro.adddata(data)
cerebro.addstrategy(MyStrategy)
cerebro.broker.setcash(10000)
cerebro.addsizer(bt.sizer.PercentSizer, percents=95)
cerebro.run()
cerebro.plot()

vectorbt:

import vectorbt as vbt

fast = 10
slow = 50
ma_fast = vbt.MA.run(close, window=fast)
ma_slow = vbt.MA.run(close, window=slow)
entries = ma_fast.vbt.crossed_above(ma_slow)
exits = ma_fast.vbt.crossed_below(ma_slow)
pf = vbt.Portfolio.from_signals(close, entries, exits, fees=0.001, slippage=0.001)
pf.stats()  # 一行出夏普 / 回撤 / 年化

一句话总结

backtrader 是"显微镜",vectorbt 是"望远镜"。显微镜看细节(滑点、手续费、成交逻辑),望远镜看全景(参数空间、统计分布)。成熟量化团队两个都用,单独用哪个都是半套。第一次做回测,从 backtrader 开始——慢一点但每一步都看得懂,建立对"撮合到底是什么"的直觉,再去 vectorbt 提速。