量化武器库:极速回测!vectorbt - 向量化回测的性能巅峰

B站影视 内地电影 2025-10-03 15:11 2

摘要:道友们,假期愉快!在精讲了 Backtrader 这位“事件驱动”的游侠之王后,你是否对它的运行速度,特别是在进行参数优化时,感到了一丝不耐烦?如果你需要在一分钟内测试上万种参数组合,Backtrader 恐怕就要力不从心了。

《量化武器库》系列专门聚焦那些能极大提升我们量化研究和实盘效率的工具,打造一个覆盖数据、回测、分析到实战的全流程工具箱。

大家好,我是木泽。

道友们,假期愉快!在精讲了 Backtrader 这位“事件驱动”的游侠之王后,你是否对它的运行速度,特别是在进行参数优化时,感到了一丝不耐烦?如果你需要在一分钟内测试上万种参数组合,Backtrader 恐怕就要力不从心了。

今天,我们来为武器库装备一件追求极致速度的“终极兵器”——vectorbt。它是向量化回测流派的杰出代表,利用 numpy 和 Numba 的强大威力,将回测速度推向了巅峰。准备好,体验风驰电掣的感觉吧!

(创作不易,感谢关注支持↑↑↑)

vectorbt 的世界里,没有复杂的对象和事件循环,它的核心是Numpy 数组。所有的数据、信号、参数,最终都会被表示成多维数组,然后用向量化的方式进行计算。它的工作流非常清晰:

准备数据: 将价格数据准备成 Pandas Series 或 DataFrame。生成信号: 用向量化函数,根据价格数据,生成一个布尔型的 `entries` (入场) 和 `exits` (出场) 信号数组。运行回测: 将价格和信号数组传入 `Portfolio.from_signals`。分析结果: 得到一个包含完整绩效指标的统计报告。

安装:

我们用同样的双均线策略来感受一下 vectorbt 的代码风格。你会发现它与 Backtrader 的面向对象风格截然不同,更像是一种函数式、数据流的风格。

import vectorbt as vbtimport pandas as pd# 1. 准备数据 (可以直接从yfinance下载)price = vbt.YFData.download('AAPL', start='2020-01-01').get('Close')# 2. 生成信号# 用 vbt.MA 指标类,一次性计算出快线和慢线fast_ma = vbt.MA.run(price, 10)slow_ma = vbt.MA.run(price, 30)# 用 .ma_crossed_above 和 .ma_crossed_below 生成信号数组entries = fast_ma.ma_crossed_above(slow_ma)exits = fast_ma.ma_crossed_below(slow_ma)# 3. 运行回测pf = vbt.Portfolio.from_signals(price, entries, exits)# 4. 分析和展示结果print(pf.stats)pf.plot.show

代码的精髓:

注意到吗?整个过程没有任何 for 循环!所有操作都是在整个数据序列上一次性完成的。`vbt.MA.run(price, 10)` 会返回一个包含指标值的对象,而 `ma_crossed_above` 则直接比较两个指标对象,生成一个布尔型的信号数组。这就是向量化的魅力。

vectorbt 真正恐怖的地方在于参数优化。它能将多个参数组合(比如不同均线周期)扩展成一个大的多维数组,然后只用一次计算,就得到所有参数组合的回测结果!

import numpy as np# 定义要测试的参数范围fast_windows = np.arange(5, 21, 5) # [5, 10, 15, 20]slow_windows = np.arange(20, 61, 10) # [20, 30, 40, 50, 60]# 一次性计算出所有参数组合的快线和慢线fast_ma, slow_ma = vbt.MA.run_combs(price, [fast_windows, slow_windows])# 生成所有参数组合的信号entries = fast_ma.ma_crossed_above(slow_ma)exits = fast_ma.ma_crossed_below(slow_ma)# 一次性运行所有组合的回测pf_comb = vbt.Portfolio.from_signals(price, entries, exits, freq='1D', init_cash=100000)# 找到总回报率最高的参数组合best_params = pf_comb.total_return.idxmaxprint(f"Best Parameters: Fast MA={best_params[0]}, Slow MA={best_params[1]}")# 绘制热力图pf_comb.total_return.vbt.heatmap.show

思维的转变:

使用 vectorbt 需要从“一次处理一个 bar”的事件驱动思维,转变为“一次处理整个序列”的向量化思维。你需要思考如何将你的策略逻辑,用 Numpy 的数组操作来表达。一旦完成了这个转变,你的回测效率将不可同日而语。

今天,我们领略了向量化回测之王 vectorbt 的惊人速度和独特魅力。它以 Numpy 数组为核心,通过向量化的方式,实现了无与伦比的回测和优化性能。它可能不如 Backtrader 灵活,无法模拟最复杂的交易逻辑,但在策略的初期探索和大规模因子筛选阶段,它的速度就是你最强大的“武器”。

你能想到哪些策略逻辑是 vectorbt 很难实现的?
这能帮助你更深刻地理解向量化回测的边界。

来源:木泽的量化笔记

相关推荐