"选回测框架最大的坑不是性能,是'撮合逻辑离实盘有多远'——backtrader 偏保守贴近真实,vectorbt 偏速度牺牲细节,选错方向后面全是返工。"
一句话:backtrader 是事件驱动、逐笔撮合的"慢而准",vectorbt 是向量化、批量扫参的"快而糙",两者不是替代关系而是分工关系,用错场景会返工。
它们各解决什么问题
| 维度 | backtrader | vectorbt |
|---|---|---|
| 撮合模型 | 事件驱动、按 Tick / K 线顺序 | 向量化批量、按信号一次算完 |
| 速度 | 慢(逐笔模拟) | 快(NumPy 并行,快 100-1000 倍) |
| 参数扫描 | 几百组内可行 | 几十万~百万组常规操作 |
| 手续费 / 滑点 | 精细建模(每笔不同费率都行) | 简化模型(整组统一) |
| 可审计性 | 每笔交易可查、可回放 | 批量结果,看统计分布 |
| 学习曲线 | 中(API 清晰) | 低(一行起回测) |
| 维护状态 | 原作者停更、社区分支活跃 | 活跃(商业 + 开源双授权) |
| 适合场景 | 策略调试、单策略精细回测 | 参数寻优、批量统计、学术实验 |
选哪套:一个决策树
- 想验证一个具体策略的真实表现(手续费、滑点、成交逻辑要贴近实盘)→ backtrader
- 想扫 10 万组参数找最优(网格搜索、遗传算法)→ vectorbt
- 想教学 / 入门回测原理(逐笔撮合看得懂每一步)→ backtrader
- 想学术上批量出统计结果(夏普分布、回撤分布)→ vectorbt
- 要跨股票 + 期货 + 加密多资产 → 两个都不合适,看 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 万组 ~ 秒级 |
上手建议
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()
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 提速。