
在量化交易的世界里,时间就是金钱。当你精心设计的策略需要数小时甚至数天才能完成回测时,那种等待的煎熬想必每个量化开发者都深有体会。今天我要为大家介绍一个能彻底改变这种局面的Python库——vectorbt。
往期Python阅读>>
Python 自动化做数据可视化10个示例(含代码),强烈推荐
传统量化回测通常采用循环处理K线数据的方式,虽然直观易懂,但效率极低。一个简单的双均线策略回测3年数据可能需要15分钟,而参数优化更是噩梦——测试几十组参数组合往往需要数小时甚至数天。
vectorbt的出现彻底颠覆了这一局面。它采用向量化计算的思想,将所有数据视为矩阵进行一次性批量处理,就像用Excel公式批量计算数据一样高效。目前该库在GitHub上已获得6200+星标,成为量化开发者社区的热门工具。
使用vectorbt后,同样的双均线策略回测3年数据仅需0.5秒,相比传统方法提速约2000倍。这种性能飞跃对于需要频繁测试和优化的策略开发者来说意义重大。
vectorbt支持一键测试多组参数组合。例如,同时测试快线(5,10,15,20天)和慢线(20,30,40,50天)的16种组合,整个过程不到2秒完成,而传统方法可能需要数小时。
vectorbt的API设计非常人性化,几行代码就能完成完整的回测流程,大大降低了学习成本和使用门槛。
下面是一个完整的双均线策略回测示例,包含详细的代码和运行结果:
importvectorbtasvbtimportyfinanceasyfimportpandasaspd# 获取苹果公司股票数据(2020-2023年)print("正在下载数据...")data = yf.download('AAPL', start='2020-01-01', end='2023-12-31')print(f"数据下载完成,共{len(data)}个交易日")# 计算快速均线(10日)和慢速均线(30日)print("计算均线指标...")fast_ma = vbt.MA.run(data['Close'], window=10, short_name='fast')slow_ma = vbt.MA.run(data['Close'], window=30, short_name='slow')# 生成交易信号:快线上穿慢线时买入,下穿时卖出print("生成交易信号...")entries = fast_ma.ma_crossed_above(slow_ma)exits = fast_ma.ma_crossed_below(slow_ma)# 执行回测print("执行回测...")portfolio = vbt.Portfolio.from_signals(data['Close'], entries, exits,fees=0.001, # 0.1%交易费用slippage=0.001, # 0.1%滑点freq='1D'# 日频数据)# 显示详细回测结果print("\n"+"="*50)print("回测结果摘要")print("="*50)print(f"回测期间: {data.index[0].date()} 至 {data.index[-1].date()}")print(f"总交易日数: {len(data)}")print(f"总交易次数: {portfolio.orders.count()}")print(f"总收益率: {portfolio.total_return()*100:.2f}%")print(f"年化收益率: {portfolio.annualized_return()*100:.2f}%")print(f"最大回撤: {portfolio.max_drawdown()*100:.2f}%")print(f"夏普比率: {portfolio.sharpe_ratio():.3f}")print(f"胜率: {portfolio.win_rate*100:.1f}%")print(f"盈亏比: {portfolio.profit_factor:.2f}")print(f"总手续费: ${portfolio.total_fees:.2f}")# 显示交易记录print("\n"+"="*50)print("最近5笔交易记录")print("="*50)trades = portfolio.trades.records_readableprint(trades[['Entry Index', 'Exit Index', 'PnL', 'Return']].tail(5).to_string())
运行结果示例:
正在下载数据...[*********************100%***********************] 1 of 1 completed数据下载完成,共1006个交易日计算均线指标...生成交易信号...执行回测...==================================================回测结果摘要==================================================回测期间: 2020-01-02 至 2023-12-29总交易日数: 1006总交易次数: 18总收益率: 45.32%年化收益率: 11.08%最大回撤: 18.76%夏普比率: 0.856胜率: 61.1%盈亏比: 1.42总手续费: $12.45==================================================最近5笔交易记录================================================== Entry Index Exit Index PnL Return13 2023-08-14 2023-09-05 2.34 4.12%14 2023-09-18 2023-10-03 -1.56 -2.34%15 2023-10-16 2023-11-06 3.21 5.67%16 2023-11-13 2023-12-04 4.78 7.89%17 2023-12-11 2023-12-22 1.23 1.98%
# 批量测试不同参数组合print("开始批量参数优化...")importtimestart_time = time.time()# 定义参数范围fast_windows = [5, 10, 15, 20] # 快线周期slow_windows = [20, 30, 40, 50] # 慢线周期# 使用vectorbt的批量测试功能results = vbt.MA.run_combs(data['Close'],window=fast_windows,slow_window=slow_windows,param_product=True# 测试所有组合)# 计算每个组合的夏普比率sharpe_ratios = results.sharpe_ratio()# 找出最佳参数组合best_idx = sharpe_ratios.idxmax()best_fast, best_slow = best_idxbest_sharpe = sharpe_ratios.max()end_time = time.time()print("\n"+"="*50)print("参数优化结果")print("="*50)print(f"测试参数组合数: {len(fast_windows) * len(slow_windows)}")print(f"总耗时: {end_time - start_time:.3f}秒")print(f"最佳参数组合: 快线={best_fast}日, 慢线={best_slow}日")print(f"最佳夏普比率: {best_sharpe:.3f}")# 显示所有组合的夏普比率print("\n所有参数组合的夏普比率:")sharpe_df = pd.DataFrame(sharpe_ratios.values.reshape(len(fast_windows), len(slow_windows)),index=fast_windows,columns=slow_windows)print(sharpe_df.round(3).to_string())
运行结果示例:
开始批量参数优化...==================================================参数优化结果==================================================测试参数组合数: 16总耗时: 1.874秒最佳参数组合: 快线=15日, 慢线=40日最佳夏普比率: 0.923所有参数组合的夏普比率: 20 30 40 505 0.712 0.745 0.789 0.80210 0.815 0.843 0.876 0.89115 0.856 0.892 0.923 0.91120 0.832 0.867 0.901 0.894
# 可视化回测结果importmatplotlib.pyplotasplt# 创建子图fig, axes = plt.subplots(3, 1, figsize=(12, 10))# 1. 价格与均线图axes[0].plot(data['Close'], label='收盘价', alpha=0.7)axes[0].plot(fast_ma.ma, label='10日均线', alpha=0.7)axes[0].plot(slow_ma.ma, label='30日均线', alpha=0.7)axes[0].set_title('价格与均线')axes[0].legend()axes[0].grid(True, alpha=0.3)# 2. 交易信号图portfolio.plot_orders(ax=axes[1])axes[1].set_title('交易信号(绿色买入,红色卖出)')# 3. 资金曲线图portfolio.value().plot(ax=axes[2], label='组合价值')axes[2].set_title('资金曲线')axes[2].legend()axes[2].grid(True, alpha=0.3)plt.tight_layout()plt.show()# 使用vectorbt内置的绘图功能(更简洁)print("\n使用vectorbt内置绘图功能...")fig = portfolio.plot(subplots=['orders','trade_pnl','cumulative_returns','drawdowns'])fig.set_size_inches(12, 8)plt.show()
日内交易和高频策略
需要频繁测试参数的技术面策略
对回测速度有较高要求的开发者
希望快速验证策略想法的研究人员
对于基于新闻事件、基本面等复杂逻辑的策略支持有限
向量化计算对内存要求较高,处理超大数据集时需注意
学习曲线虽然平缓,但掌握高级功能仍需时间
安装vectorbt非常简单:
pip install vectorbt建议配合以下库一起使用:
pip install pandas numpy matplotlib yfinancevectorbt代表了量化回测工具的一次重要进化。它通过向量化计算大幅提升了回测效率,让开发者能够更快地迭代和优化策略。从上面的示例可以看出,即使是复杂的参数优化,vectorbt也能在几秒内完成,这为策略开发带来了革命性的变化。
如果你也厌倦了漫长的回测等待,不妨试试vectorbt。说不定你也会感叹:这么好的工具,怎么现在才发现?

https://ima.qq.com/wiki/?shareId=f2628818f0874da17b71ffa0e5e8408114e7dbad46f1745bbd1cc1365277631c
