第一次跑通的震撼

VectorBT 这个框架我其实知道很久了,但一直没用过。原因是它的文档写得太"学术化"了,全是 numpy、pandas 的术语,让人看得云里雾里。

直到这次测试,我才真正上手。然后我就被震撼了。

同样的双均线策略,同样的 5000 只股票 10 年数据,VectorBT 跑完只用了——

23 秒。

你没看错,是秒,不是分钟。我当时以为是代码写错了,结果检查了三遍,没错,就是这么快。


向量化的魔力

VectorBT 为什么这么快?核心就两个字:向量化

传统回测框架(Backtrader、Zipline)都是事件驱动的。它们模拟每一个时间点的市场状态,然后让策略对此做出反应。这很直观,也很贴近真实交易逻辑,但效率很低。

VectorBT 完全是另一个思路:把整个回测过程变成矩阵运算。用 numpy 和 pandas 的向量化操作,一次性处理所有数据。

来看代码感受一下:

import vectorbt as vbt
import pandas as pd

# 加载数据
price = pd.read_csv('data.csv', index_col=0, parse_dates=True)

# 计算双均线信号 —— 根本没有循环!
fast_ma = vbt.MA.run(price, window=10)
slow_ma = vbt.MA.run(price, window=30)
entries = fast_ma.ma_crossed_above(slow_ma)
exits = fast_ma.ma_crossed_below(slow_ma)

# 一键回测
portfolio = vbt.Portfolio.from_signals(price, entries, exits)
print(portfolio.stats())

整个策略逻辑就是几行 pandas 操作。这才是向量化的精髓。


参数网格搜索

VectorBT 有一个特别喜欢的功能:参数网格搜索

测试不同的均线参数组合,用 VectorBT 可以这样写:

import numpy as np

fast_windows = np.arange(5, 51, 5)   # 5, 10, 15, ..., 50
slow_windows = np.arange(20, 201, 20) # 20, 40, 60, ..., 200

fast_ma = vbt.MA.run(price, window=fast_windows)
slow_ma = vbt.MA.run(price, window=slow_windows)

entries = fast_ma.ma_crossed_above(slow_ma)
exits = fast_ma.ma_crossed_below(slow_ma)

portfolio = vbt.Portfolio.from_signals(price, entries, exits)

# 按夏普比率排序
print(portfolio.sharpe_ratio().sort_values(ascending=False).head())

这段代码会测试所有可能的参数组合(90 种),并找出夏普比率最高的那一组。整个过程在我的机器上只需要几秒钟

用传统框架做同样的事?怕是要跑几个小时。


缺点也得说

学习曲线陡峭

你得对 numpy 和 pandas 的向量化操作非常熟悉,不然写出来的代码不仅慢,还容易出 bug。

不适合复杂策略

有些策略涉及大量条件判断和状态管理,用向量化的方式写起来很别扭,代码可读性也差。

实盘对接困难

VectorBT 的设计目标就是做回测,实盘交易不在它的考虑范围内。想用 VectorBT 的策略去跑实盘,得自己再写一套执行系统。


评分

维度评分
性能⭐⭐⭐⭐⭐ 10
易用性⭐⭐⭐ 6
功能完整度⭐⭐⭐⭐ 8
扩展性⭐⭐⭐⭐ 7
社区活跃度⭐⭐⭐⭐ 8
综合7.8

适合谁用

  • ✅ 需要快速验证大量策略想法的量化研究员
  • ✅ 对 numpy/pandas 已经比较熟悉的 Python 开发者
  • ✅ 做参数优化和因子挖掘的场景
  • ❌ 策略逻辑复杂、状态管理多的场景
  • ❌ 需要一套代码直接对接实盘的需求

天下武功,唯快不破。但快不是唯一。