回测框架选对,效率翻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 安装经常需要编译 bcolztables,首次数据下载可能要 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 秒。两者算出的最终组合净值和交易次数完全一样。差别不在于正确性,而在于一小时内你能测试多少个想法。

类似文章