第一次跑通的震撼
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 开发者
- ✅ 做参数优化和因子挖掘的场景
- ❌ 策略逻辑复杂、状态管理多的场景
- ❌ 需要一套代码直接对接实盘的需求
天下武功,唯快不破。但快不是唯一。