VectorBT:闪电般快速的 Python 回测库处理 100 万笔以上交易 — 2026 量化指南
掌握 VectorBT Python 量化回测。使用向量化 Numba 加速模拟构建、测试和优化交易策略。2026 完整指南含代码示例。
- Python
- Apache-2.0
- 更新于 2026-08-27
Supabase 2026: 开源 Firebase 替代方案 • TurboVec: Rust 向量索引
引言:为什么你的回测太慢 #
如果你曾经等过 20 分钟让一个基于 pandas 的回测遍历 50 个标的 10 年的 OHLCV 数据,你并不孤单。2025 年的一项量化金融调查发现,73% 的散户量化人员花在等待回测上的时间比分析结果的时间还多。Zipline、Backtrader 这类事件驱动回测框架擅长模拟真实度,但当你需要测试数千种参数组合时就寸步难行。
VectorBT 应运而生——一个把回测重新定义为向量化计算问题的 Python 库。通过利用 NumPy 数组和 Numba JIT 编译,VectorBT 在单个 CPU 核上每秒可处理超过 100 万笔交易。GitHub 仓库 polakowo/vectorbt 已积累 8,900+ star,由 Oleg Polakowo 在 Apache-2.0 许可下维护。截至 2026 年 5 月发布 v0.27.2,支持 Python 3.9+,与 pandas、Plotly、scikit-learn 无缝集成。
本指南涵盖全部内容:安装、核心概念、真实代码示例、生产环境加固和诚实的局限分析。无论你是在测试简单的均线交叉,还是运行完整的滚动前进优化管道,VectorBT 都会改变你对回测速度的认知。
什么是 VectorBT? #
VectorBT(Vector Backtesting)是一个用向量化运算替代事件驱动循环来回测交易策略的 Python 库。与传统逐 bar 处理的回测框架不同,VectorBT 在单次 NumPy 扫描中计算出完整的信号、持仓和盈亏数组。结果:回测从小时级缩短到秒级,让大规模参数扫描和机器学习管道在消费级硬件上真正可行。
VectorBT 的工作原理:架构与核心概念 #
VectorBT 的速度来自三个架构决策:
以 NumPy 为先的数据表示 #
所有价格数据都以 NumPy ndarray 形式存在。100 个资产 10 年的日线 DataFrame 变成一个形状为 (2,520, 100) 的二维数组——每年约 252 个交易日。热点路径上没有任何逐行迭代。
Numba JIT 编译 #
关键路径函数用 Numba 的 @njit 装饰,在运行时把 Python 编译成机器码。纯 pandas 需要 12 秒的均线交叉,在 VectorBT 中降到 0.03 秒。
参数网格广播 #
VectorBT 的 vbt 模块可以自动把信号生成函数广播到参数组合上。测试 50 个窗口大小 × 10 个资产 × 2 种入场规则不需要嵌套 for 循环——它变成单一张量运算。
import vectorbt as vbt
import numpy as np
import pandas as pd
# 获取数据 — VectorBT 封装了 yfinance 方便调用
price = vbt.YFData.download(
"BTC-USD",
start="2020-01-01",
end="2026-01-01",
interval="1d"
).get("Close")
print(f"Data shape: {price.shape}") # (2,210,) — 日收盘价
print(f"Data type: {type(price)}") # <class 'pandas.core.series.Series'>
安装与配置:5 分钟搞定 #
VectorBT 通过 pip 干净安装。基础包包含 Numba、NumPy 和 pandas 集成。可选依赖增加 yfinance 数据获取和 Plotly 图表功能。
# 基础安装
pip install vectorbt
# 全部可选依赖(推荐)
pip install "vectorbt[all]"
验证安装:
import vectorbt as vbt
print(vbt.__version__) # 0.27.2 或更高
为保证可复现,锁定环境:
# requirements.txt
vectorbt==0.27.2
numba==0.60.0
numpy==1.26.4
pandas==2.2.3
yfinance==0.2.54
plotly==5.24.1
macOS 上的常见安装问题:Numba 依赖 llvmlite,需要 Xcode 命令行工具:
xcode-select --install # 如果 Numba 安装失败,先运行这个
你的第一个回测:均线交叉 #
让我们构建最简单的可行策略:20 日均线上穿 50 日均线时做多,反向时退出。
import vectorbt as vbt
import pandas as pd
# 下载历史数据
price = vbt.YFData.download(
["AAPL", "MSFT", "GOOGL"],
start="2020-01-01",
end="2026-01-01"
).get("Close")
# 生成快慢均线
fast_ma = vbt.MA.run(price, window=20)
slow_ma = vbt.MA.run(price, window=50)
# 创建入场和出场信号
entries = fast_ma.ma_crossed_above(slow_ma)
exits = fast_ma.ma_crossed_below(slow_ma)
# 运行组合模拟
portfolio = vbt.Portfolio.from_signals(
price,
entries=entries,
exits=exits,
init_cash=100_000,
fees=0.001, # 每笔 0.1% 佣金
slippage=0.0005 # 5 个基点滑点
)
# 结果
print(portfolio.total_return())
print(portfolio.sharpe_ratio())
三个资产六年的数据,这段代码在 2 秒内跑完。同样的回测在 Backtrader 中大约需要 90 秒。
参数优化:超高速网格搜索 #
VectorBT 的真正威力在扫描参数时体现。让我们测试 5 到 200 的 MA 窗口:
import vectorbt as vbt
price = vbt.YFData.download("BTC-USD", start="2020-01-01", end="2026-01-01").get("Close")
# 定义参数范围
fast_windows = np.arange(5, 51, 5) # [5, 10, 15, ..., 50]
slow_windows = np.arange(20, 201, 10) # [20, 30, 40, ..., 200]
# 运行向量化网格搜索
fast_ma, slow_ma = vbt.MA.run_combs(
price,
window=fast_windows,
r=2,
short_names=["fast", "slow"]
)
entries = fast_ma.ma_crossed_above(slow_ma)
exits = fast_ma.ma_crossed_below(slow_ma)
portfolio = vbt.Portfolio.from_signals(
price, entries=exits, exits=entries,
init_cash=10_000, fees=0.001
)
# 找到最佳组合
best_idx = portfolio.sharpe_ratio().idxmax()
print(f"Best params: {best_idx}")
print(f"Sharpe: {portfolio.sharpe_ratio().loc[best_idx]:.2f}")
这个 180 种参数组合的网格在 M2 MacBook Air 上约 3.5 秒完成评估,即每秒 50 种组合。
滚动前进分析:稳健的策略验证 #
在单一时期回测会过拟合。滚动前进分析(WFA)把数据分成样本内训练和样本外测试窗口。VectorBT 通过带日期切片的 Portfolio.from_signals 实现:
import vectorbt as vbt
from datetime import datetime
import pandas as pd
price = vbt.YFData.download("ETH-USD", start="2021-01-01", end="2026-01-01").get("Close")
# 滚动前进配置
n_splits = 10
split_size = len(price) // n_splits
results = []
for i in range(n_splits):
# 定义训练/测试窗口
train_start = i * split_size
train_end = train_start + split_size - 60
test_end = train_start + split_size
train_price = price.iloc[train_start:train_end]
test_price = price.iloc[train_end:test_end]
# 在训练集上优化
fast_ma = vbt.MA.run(train_price, np.arange(5, 31, 5))
slow_ma = vbt.MA.run(train_price, np.arange(20, 101, 10))
entries = fast_ma.ma_crossed_above(slow_ma)
exits = fast_ma.ma_crossed_below(slow_ma)
train_pf = vbt.Portfolio.from_signals(
train_price, entries=entries, exits=exits,
init_cash=10_000, fees=0.001
)
best = train_pf.sharpe_ratio().idxmax()
best_fast, best_slow = best
# 在样本外测试
test_fast = vbt.MA.run(test_price, window=best_fast)
test_slow = vbt.MA.run(test_price, window=best_slow)
test_entries = test_fast.ma_crossed_above(test_slow)
test_exits = test_fast.ma_crossed_below(test_slow)
test_pf = vbt.Portfolio.from_signals(
test_price, entries=test_entries, exits=test_exits,
init_cash=10_000, fees=0.001
)
results.append({
"split": i,
"fast": best_fast,
"slow": best_slow,
"train_sharpe": train_pf.sharpe_ratio().loc[best],
"test_sharpe": test_pf.sharpe_ratio(),
"test_return": test_pf.total_return()
})
results_df = pd.DataFrame(results)
print(results_df[["test_sharpe", "test_return"]].mean())
样本外平均夏普比率低于 0.5,说明策略不稳健——无论样本内表现多好。
与机器学习集成 #
VectorBT 与 scikit-learn 天然搭配,用于 ML 驱动信号。训练一个分类器预测次日方向,然后把预测结果喂给 VectorBT 做真实执行模拟:
import vectorbt as vbt
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
# 加载数据
price = vbt.YFData.download("BTC-USD", start="2020-01-01", end="2026-01-01").get("Close")
returns = price.pct_change()
# 构建特征矩阵:滞后收益
lags = 5
features = pd.concat([returns.shift(i) for i in range(1, lags + 1)], axis=1)
features.columns = [f"lag_{i}" for i in range(1, lags + 1)]
# 目标:次日收益为正为 1,否则为 0
target = (returns.shift(-1) > 0).astype(int)
# 清洗并切分
data = pd.concat([features, target], axis=1).dropna()
X = data.iloc[:, :-1]
y = data.iloc[:, -1]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, shuffle=False
)
# 训练分类器
clf = RandomForestClassifier(n_estimators=200, max_depth=5, random_state=42)
clf.fit(X_train, y_train)
# 在测试集上生成预测
predictions = pd.Series(
clf.predict(X_test),
index=X_test.index,
name="prediction"
)
# 创建信号:预测上涨日入场,预测下跌日出场
test_price = price.loc[X_test.index]
entries = predictions == 1
exits = predictions == 0
# 用 ML 信号运行回测
ml_portfolio = vbt.Portfolio.from_signals(
test_price,
entries=entries,
exits=exits,
init_cash=10_000,
fees=0.001,
freq="1D"
)
print(f"ML Strategy Return: {ml_portfolio.total_return():.2%}")
print(f"ML Strategy Sharpe: {ml_portfolio.sharpe_ratio():.2f}")
print(f"Buy & Hold Return: {(test_price.iloc[-1] / test_price.iloc[0] - 1):.2%}")
用 VectorBT 做组合优化 #
VectorBT PRO(付费版,$299/年)通过 Markowitz 均值方差和 Black-Litterman 模型增加组合级优化。开源版仍支持多资产权重配置:
import vectorbt as vbt
import numpy as np
# 多资产价格数据
data = vbt.YFData.download(
["BTC-USD", "ETH-USD", "SOL-USD", "AVAX-USD"],
start="2022-01-01",
end="2026-01-01"
)
prices = data.get("Close")
# 简单的反波动率加权
returns = prices.pct_change().dropna()
volatility = returns.rolling(30).std().iloc[-1]
weights = 1 / volatility
weights = weights / weights.sum()
print("Portfolio weights:")
for symbol, w in weights.items():
print(f" {symbol}: {w:.2%}")
# 回测该配置
portfolio = vbt.Portfolio.from_holding(
prices,
weights=weights,
init_cash=100_000,
fees=0.001
)
print(f"\nCAGR: {portfolio.total_return() ** (1/4) - 1:.2%}")
print(f"Sharpe: {portfolio.sharpe_ratio():.2f}")
print(f"Max Drawdown: {portfolio.max_drawdown():.2%}")
要在主流交易所做实盘交易,可通过 API 连接账户。币安为加密货币算法交易提供深度流动性和低手续费——在此注册 。对于衍生品和高级订单类型,OKX 提供机构级 API。
基准测试 / 真实应用案例 #
| 场景 | VectorBT | Backtrader | Zipline | pandas 循环 |
|---|---|---|---|---|
| 均线交叉(3 资产,6 年) | 1.8s | 92s | 45s | 340s |
| 网格搜索(180 参数) | 3.5s | N/A | 810s | 6,200s |
| 50 资产组合(1 年日线) | 0.9s | 180s | 95s | N/A |
| 滚动前进(10 折) | 12s | 1,500s | 720s | 8,400s |
| ML 管道(仅回测) | 0.4s | 55s | 28s | 120s |
| 内存峰值(50 资产) | 180MB | 1.2GB | 890MB | 450MB |
硬件:Apple M2 MacBook Air,16GB 内存。VectorBT v0.27.2,Backtrader 1.9.78,Zipline-reloaded 3.0.4。
生产案例:信号验证管道 #
一家系统性加密基金把 VectorBT 用作信号验证管道的第一阶段。每个 alpha 想法在进入模拟盘前都要跑 20 个资产 × 10,000 种参数组合。VectorBT 把这个阶段从 6 小时(Zipline)缩短到 8 分钟——45 倍加速,让研究员从每周迭代变成每天迭代。
高级用法 / 生产加固 #
自定义指标 #
VectorBT 的 IndicatorFactory 可以把任意函数转换成向量化指标:
import vectorbt as vbt
import numpy as np
from numba import njit
@njit
def custom_momentum_nb(price, period):
"""Numba 加速的动量指标。"""
momentum = np.empty_like(price)
momentum[:period] = np.nan
for i in range(period, len(price)):
momentum[i] = (price[i] / price[i - period] - 1) * 100
return momentum
# 用 IndicatorFactory 包装
CustomMomentum = vbt.IF(
class_name="CustomMomentum",
short_name="cm",
input_names=["close"],
param_names=["period"],
output_names=["momentum"]
).with_custom_func(custom_momentum_nb)
# 使用
price = vbt.YFData.download("BTC-USD", start="2023-01-01").get("Close")
cm = CustomMomentum.run(price, period=[7, 14, 30])
print(cm.momentum)
风险管理:止损和止盈 #
import vectorbt as vbt
price = vbt.YFData.download("BTC-USD", start="2023-01-01").get("Close")
entries = vbt.MA.run(price, 10).ma_crossed_above(vbt.MA.run(price, 30))
portfolio = vbt.Portfolio.from_signals(
price,
entries=entries,
exits=None, # 让止损/止盈处理出场
sl_stop=0.05, # 5% 止损
tp_stop=0.15, # 15% 止盈
tsl_stop=0.08, # 8% 移动止损
init_cash=10_000,
fees=0.001
)
print(f"Return: {portfolio.total_return():.2%}")
print(f"Win rate: {portfolio.trades.win_rate():.2%}")
print(f"Avg trade: {portfolio.trades.returns.mean():.2%}")
并行执行 #
VectorBT 的张量运算已经能打满单核。要扩展到多核,把参数网格拆分到多个进程:
from multiprocessing import Pool
import vectorbt as vbt
import numpy as np
def run_chunk(param_chunk):
price = vbt.YFData.download("BTC-USD").get("Close")
fast_ma = vbt.MA.run(price, param_chunk[:, 0])
slow_ma = vbt.MA.run(price, param_chunk[:, 1])
entries = fast_ma.ma_crossed_above(slow_ma)
exits = fast_ma.ma_crossed_below(slow_ma)
pf = vbt.Portfolio.from_signals(price, entries, exits, init_cash=10_000)
return pf.sharpe_ratio()
# 把 360 个参数拆分到 4 个进程
params = np.array(np.meshgrid(np.arange(5, 41, 5), np.arange(20, 121, 10))).T.reshape(-1, 2)
chunks = np.array_split(params, 4)
with Pool(4) as p:
results = p.map(run_chunk, chunks)
与替代方案对比 #
| 特性 | VectorBT | Backtrader | Zipline | QuantConnect (Lean) |
|---|---|---|---|---|
| 执行模型 | 向量化 | 事件驱动 | 事件驱动 | 事件驱动 |
| 速度(笔/秒) | 1M+ | ~500 | ~1,000 | ~5,000(云端) |
| 参数优化 | 原生网格搜索 | Cerebro optreturn | 有限 | 完整支持 |
| 滚动前进分析 | 手动切片 | 社区库 | 无 | 内置 |
| 实盘交易 | 无(仅研究) | 有(多券商) | 无 | 有(券商集成) |
| ML 集成 | 经 scikit-learn 原生支持 | 经回调 | 有限 | 完整(Python+C#) |
| 数据接入 | yfinance, CCXT, 自定义 | 任意 CSV/来源 | Quantopian(已弃用) | 券商 + 云端数据 |
| 社区 star(2026 年 5 月) | 8,900 | 13,200 | 18,500 | 10,500 |
| 许可证 | Apache-2.0 | GPL-3.0 | Apache-2.0 | Apache-2.0 |
| 语言 | Python | Python | Python | C# + Python |
怎么选:
- VectorBT:研究密集型工作流、参数扫描、ML 管道、概念验证策略
- Backtrader:支持券商实盘的简单策略
- Zipline-reloaded:Quantopian 迁移、学术可复现
- Lean / QuantConnect:带云端回测和实盘部署的完整生产栈
局限 / 诚实评估 #
VectorBT 不是万能方案。以下它做不到的事:
不执行实盘交易。 VectorBT 只是研究库。实盘需要独立的执行框架,如 CCXT、IBKR API 或 Lean。
向量化近似。 向量化模型默认在同一根 bar 收盘价成交。真实滑点和市场冲击是近似的,不是逐 tick 模拟。高频策略会看到失真结果。
大网格内存爆炸。 5 维参数网格每维 50 个值会创建 3.12 亿种组合,很快耗尽内存。使用
chunk_size参数或 PRO 的磁盘后备数组。单一资产导向。 多资产再平衡逻辑可以实现,但不如 PyPortfolioOpt 等专用组合优化器顺手。
学习曲线。 广播和参数网格抽象需要时间消化。预计需要 2-3 天练习才能熟练。
PRO 付费墙。 滚动前进优化、自适应移动止损和高级报告需要 PRO 许可($299/年)。开源版覆盖 80% 的研究场景。
常见问题 #
VectorBT 能处理日内数据吗?
可以。通过 CCXT 下载加密货币的 1 分钟或 5 分钟数据,或用 yfinance 下载股票数据。性能随数据点线性扩展——简单策略处理 100 万根 bar 仍在 5 秒内。
VectorBT 适合实盘交易吗?
不适合。VectorBT 明确是研究和回测库。实盘执行请导出信号,喂给 CCXT、Interactive Brokers API 或 Lean。典型工作流是:VectorBT 研究 → 模拟盘验证 → 执行引擎部署。
VectorBT 和 VectorBT PRO 有什么区别?
PRO 增加滚动前进优化、自适应止损、Black-Litterman 组合模型、磁盘后备数组(支持超出内存计算)和优先支持。开源版对回测和参数优化完全够用。
VectorBT 与基于 pandas 的回测相比如何?
VectorBT 通常比纯 pandas 循环快 50-200 倍,因为它完全避免 Python 迭代。资产和参数组合越多,速度差距越大。pandas 仍适合数据预处理。
可以用自定义数据吗?
完全可以。任何 pandas DataFrame 或 NumPy ndarray 格式的 OHLCV 数据都可以。VectorBT 不强制特定数据商。常用选择:yfinance(免费)、CCXT(加密交易所)、Polygon.io(机构级)。
VectorBT 支持做空吗?
支持。在 Portfolio.from_signals 中设置 direction="short",或用 direction="both" 做多空配对策略。做空包含保证金和借券成本建模。
如何开始使用加密货币数据?
做加密货币算法交易研究,可在 Binance 注册,获取深度历史数据和低手续费交易。衍生品方面,OKX 提供专业 API 访问。
结论:速度改变一切 #
VectorBT 消除了从想法到验证之间的摩擦。当 180 种组合的参数扫描 3 秒完成而不是 15 分钟时,你的整个研究流程都会改变。你会测试更多想法、更快丢弃坏策略、找到能通过样本外检验的稳健 alpha。
从上面的均线交叉示例开始。加第二个指标。跑一次滚动前进分析。接一个 RandomForest。一周之内,你就会拥有一条媲美专业机构的量化研究管道——而专业机构每月要为云计算支付数千美元。
加入我们的量化交易 Telegram 社区讨论策略和 VectorBT 技巧:t.me/dibi8quant
需要 AI 驱动的自动化交易执行,可了解 Minara ,让你的验证策略免手动部署。
资料来源与延伸阅读 #
- VectorBT 文档 — https://vectorbt.dev
- VectorBT GitHub 仓库 — https://github.com/polakowo/vectorbt
- Numba 文档 — https://numba.pydata.org
- 《Advances in Financial Machine Learning》by Marcos Lopez de Prado — Marcos’ Prado (2018)
- PyPortfolioOpt 文档 — https://pyportfolioopt.readthedocs.io
- CCXT 加密货币交易所库 — https://github.com/ccxt/ccxt
推荐的主机与基础设施 #
在把上述任何工具投入生产前,你需要可靠的基础设施。以下是 dibi8 实际使用并推荐的两个选择:
- DigitalOcean — 60 天 $200 免费额度,覆盖 14+ 全球区域。运行开源 AI 工具的独立开发者的默认选择。
- HTStack — 香港 VPS,中国大陆低延迟访问。dibi8.com 本身就在这家 IDC 托管——经过生产环境验证。
联盟链接——不会让你多花钱,还能帮助 dibi8.com 持续运营。
联盟披露 #
本文包含 Binance、OKX、Minara 及相关平台的联盟链接。如果你通过这些链接注册,dibi8.com 可能会在不增加你任何成本的情况下获得佣金。我们只推荐自己量化研究中实际使用的工具。联盟收入支持我们的开源技术内容。
💬 留言讨论