回测框架选对,效率翻20倍:Backtrader、VectorBT、Zipline 2026实战对比
先看代码长什么样
测试策略很简单:12 个月动量旋转——每月按过去一年收益率排名,买排名前 20% 的股票,等权重,每月再平衡。下面是每个框架的核心代码(都加了中文注释)。
Backtrader(事件驱动)
Backtrader 强迫你进入一个事件循环。每一根 K 线、每一次订单通知、每一笔现金变化都要经过 next() 或 notify_order()。这种模式更贴近真实券商执行方式,但样板代码也多。
class MomentumStrategy(bt.Strategy): # 定义策略类,继承bt.Strategy
def next(self):
# 每月1号执行再平衡
if self.datetime.date(0).day == 1: # 判断是否每月第一天
# 计算每个数据源(股票)的动量:当前收盘价 / 252天前收盘价 - 1
mom = {d: d.close[0] / d.close[-252] - 1 for d in self.datas}
# 按动量排序,取前100名
top = sorted(mom, key=mom.get, reverse=True)[:100]
# 对第一名分配1%仓位(示例简化)
self.order_target_percent(top[0], 0.01)
注意:上面代码是我简化后的演示,真实策略需要处理更多细节。
VectorBT(向量化)
VectorBT 把所有数据当成数组处理。没有循环,没有 next(),没有状态机。你只需要定义入场/出场信号(布尔数组),VectorBT 一次算出所有结果。
import vectorbt as vbt
# 下载股票数据
close = vbt.YFData.download(symbols, start='2019-01-01').get('Close')
# 计算12个月动量:当前价格 / 252天前价格 - 1
mom = close / close.shift(252) - 1
# 选动量排名前100且动量>0的股票作为入场信号
entries = (mom.rank(axis=1, ascending=False) <= 100) & (mom > 0)
# 根据信号构建投资组合,每月再平衡
pf = vbt.Portfolio.from_signals(close, entries, freq='M')
结果对比很震撼:VectorBT 跑完五年数据只用了 0.7 秒。Backtrader 在同样的机器上花了 14.2 秒。这 20 倍的差距,当你需要跑一万次参数搜索时就会变成天壤之别。
Zipline-Reloaded(研究管道)
Zipline 使用 Pipeline API 来声明你要计算什么,然后交给 handle_data 处理。它的思路和 Backtrader 接近,但自带 Quantopian 的因子研究工作流。
from zipline.api import attach_pipeline, pipeline_output
from zipline.pipeline import Pipeline
from zipline.pipeline.factors import Returns
def make_pipeline():
# 定义动量因子:252日收益率
mom = Returns(window_length=252)
# 返回一个管道,只保留动量排名前100的股票
return Pipeline(columns={'momentum': mom}, screen=mom.top(100))
def initialize(context):
# 将管道附加到算法上
context.pipe = attach_pipeline(make_pipeline(), 'factors')
Zipline 跑完用了 2.9 秒。比 Backtrader 快,因为 Pipeline 引擎可以批量处理,但底层仍然是事件循环,所以比 VectorBT 慢。
各框架的优势和适用场景
一句话:先拿 VectorBT 快速验证策略,有眉目了再用 Backtrader 做实盘模拟和真实交易。 Zipline 则在研究导向的团队里依然有价值。
什么时候选 Backtrader
Backtrader 是这三个框架中唯一支持实盘交易的。它内置的券商抽象层可以直接对接 Interactive Brokers 和 Oanda。如果你的目标是真金白银上场,Backtrader 是终点站。
- 事件驱动架构让你能精细模拟滑点、佣金、部分成交
- 代价是代码更冗长:同样一个策略,VectorBT 15 行,Backtrader 可能要 80 行
- 如果你主要迭代信号逻辑而非执行逻辑,这个样板成本是真实的
什么时候选 VectorBT
VectorBT 在速度和参数搜索上无人能及。它的超参数优化模块可以在几秒内跑完上千个参数组合,结果直接以热力图展示。
- 如果你的工作流是“试 5000 组参数,选前 10 名,再做滚动测试”,VectorBT 天生为此而生
- 限制:只擅长纯多头组合和单资产策略,做多空、多腿期权需要变通方案
- 没有实盘执行路径
什么时候选 Zipline-Reloaded
Zipline 是研究框架。如果你是从 Quantopian 转过来的,或者主要做因子分析,Pipeline API 是最自然的。
- 将 alpha 研究和执行细节分离,这点 Backtrader 做不到
- bundle 系统强制数据管理:数据只导入一次,每个回测都从同一个来源读取
- 最大的槽点是安装:pip 安装经常需要编译
bcolz和tables,首次数据下载可能要 20 分钟
安装与数据加载(实战对比)
下面是在一台 macOS ARM 机器、Python 3.12 上的实际体验。注意我把原文中的表格改成了列表,方便阅读。
- Backtrader
- 安装命令:
pip install backtrader - 首次回测所需时间:约 2 分钟
- 数据格式:任何 Pandas DataFrame
-
离线数据支持:简单直接
-
VectorBT
- 安装命令:
pip install vectorbt - 首次回测所需时间:约 1 分钟
- 数据格式:任何 Pandas DataFrame
-
离线数据支持:简单直接
-
Zipline-Reloaded
- 安装命令:
pip install zipline-reloaded,还需系统依赖 - 首次回测所需时间:约 25 分钟(包含 bundle 数据导入)
- 数据格式:自定义 bundle(支持 Quandl、CSV 导入)
- 离线数据支持:依赖 bundle,需提前准备
Backtrader 和 VectorBT 接受任何 DataFrame,拿来就能用。Zipline 的 bundle 机制保证了长期数据管线的整洁,但对单次研究来说前期成本太高。
2026 年的现实
没有一个框架能覆盖从想法到实盘的全流程。大部分从业者的解决方案是双框架组合:VectorBT 负责快速原型和参数优化,Backtrader 负责模拟和实盘。Zipline 则留在研究密集的环境中,比如因子分析团队,或者那些对 Pipeline API 已经熟悉的开发者。
最后再看一次那个速度对比:VectorBT 用 0.7 秒处理了五年 500 只股票的数据,Backtrader 用了 14.2 秒。两者算出的最终组合净值和交易次数完全一样。差别不在于正确性,而在于一小时内你能测试多少个想法。
