速度贼快的Python金融量化框架,我用1分钟回测了15个策略
大家好我是花姐,今天给大家分享一个回测速度超快的量化库——vectorbt
什么是 vectorbt?
说白了,vectorbt
就是一个干量化的“加速神器”。你拿它来写策略回测,效率高得吓人,重点是它不整事儿,不跟你搞什么面向对象那套绕来绕去的把戏,而是把所有策略、所有信号、所有数据,全都塞进 NumPy 和 pandas 这些数组对象里,一口气跑完——像是开了氮气加速。
它背后的操作很刚——NumPy 负责矢量化(就是同时对成千上万条数据一起动手),Numba 负责把 Python 的慢循环编译成机器码,快得跟 C 语言一个德行。当其它量化框架还在 for i in range(1000)
的时候,人家已经全局扫射干完了。
而且它还特别适合 Python 生态下的人——你要是爱用 pandas、喜欢写 Jupyter Notebook,那你会觉得 vectorbt 跟你简直是天生一对。
你用它可以:
- 几行代码搞定一套完整回测;
- 用 NumPy 的速度配 Python 的优雅;
- 参数调优简直不要太爽,一行代码跑完上百组组合;
- 可视化?自带 Plotly 交互图表;
- 能分析策略、调模型、连接 Telegram,甚至还能自动调度——简直像个“懒人工具箱”。
而它最厉害的地方是啥?用“向量思维”干掉了 OOP 模式在量化中的低效。
传统回测器像 backtrader,写起来“有模有样”,可一旦你要比较多个策略,或者做参数调优?对不起,嵌套循环、类的继承、数据结构耦合,一顿 debug 脑子嗡嗡的。
而 vectorbt 的理念非常简单暴力:
“策略是数据,就应该数组化。”
于是它就把所有参数组合都塞成了多维数组,在数据层面直接处理比较。啥意思?你不需要写一个策略跑一次,而是“一次性跑完一群策略”,爽不爽?
如何安装 vectorbt?
非常简单,一条命令:
pip install vectorbt
记得安装akshare库
pip install akshare
但注意:
- 建议用虚拟环境装,不然容易和其他库打架。
- 有些系统可能需要先装依赖,比如 Windows 下得提前装好
numpy
和wheel
。 vectorbt
会自动装numba
、plotly
、ipywidgets
等一些依赖。
实战:用 vectorbt + AKShare 实现一个双均线策略
接下来花姐用 vectorbt
来跑个经典的双均线策略——短期均线上穿长期就买,下穿就卖。示例股票用沪深300ETF,行情我们用 AKShare
库。
先贴代码:
import akshare as ak
import vectorbt as vbt
import pandas as pd
# 获取沪深300指数的历史数据
df = ak.stock_zh_a_hist(symbol="600519", period="daily",start_date="20200101",adjust="qfq")
print(df)
# 将日期列转换为 datetime 类型,并设置为索引
df['日期'] = pd.to_datetime(df['日期'])
df.set_index('日期', inplace=True)
# 获取收盘价
close = df['收盘']
# 计算短期和长期移动平均线
fast_ma = vbt.MA.run(close, window=5)
slow_ma = vbt.MA.run(close, window=20)
# 生成买入和卖出信号
entries = fast_ma.ma_crossed_above(slow_ma)
exits = fast_ma.ma_crossed_below(slow_ma)
# 创建投资组合
pf = vbt.Portfolio.from_signals(close, entries, exits, init_cash=100000)
# 输出投资组合的统计信息
print(pf.stats())
# 绘制投资组合的表现图
# pf.plot().show()
pf.plot().write_html("backtest_result.html")
你会发现回测速度贼快,基本上1分钟搞定,而且上手简单。
提示:
如果使用pf.plot().show()
无法打开网页可以使用pf.plot().write_html("backtest_result.html")
生成本地回测网页然后再打开
以下是回测结果:
Start 2020-01-02 00:00:00
End 2025-05-12 00:00:00
Period 1295
Start Value 100000.0
End Value 151556.13048
Total Return [%] 51.55613
Benchmark Return [%] 68.691599
Max Gross Exposure [%] 100.0
Total Fees Paid 0.0
Max Drawdown [%] 39.790511
Max Drawdown Duration 557.0
Total Trades 40
Total Closed Trades 39
Total Open Trades 1
Open Trade PnL 2355.907437
Win Rate [%] 38.461538
Best Trade [%] 56.150292
Worst Trade [%] -8.830222
Avg Winning Trade [%] 9.999109
Avg Losing Trade [%] -3.767649
Avg Winning Trade Duration 29.533333
Avg Losing Trade Duration 7.958333
Profit Factor 1.322108
Expectancy 1261.544181
到这里,你可能会问:“为啥用 vectorbt,这些我用 pandas 也能写”。
是啊,的确你也能写,但你得自己循环、管理仓位、计算手续费、处理跳空、图表还得自己画。关键你写完一个策略,再想调个参数……那是噩梦。
而用 vectorbt 呢?你只要换个参数列表,它能自动帮你把所有组合都跑一遍:
# 多窗口组合参数调优
fast_windows = [5, 10, 15]
slow_windows = [20, 50, 100]
# 使用 run_combs 方法计算所有窗口组合的均线
fast_ma, slow_ma = vbt.MA.run_combs(
close,
window=fast_windows + slow_windows,
r=2,
short_names=['fast', 'slow']
)
# 生成买入和卖出信号
entries = fast_ma.ma_crossed_above(slow_ma)
exits = fast_ma.ma_crossed_below(slow_ma)
# 创建投资组合
pf = vbt.Portfolio.from_signals(close, entries, exits, init_cash=100000)
# 遍历所有组合,逐个保存图表
for idx in pf.wrapper.columns:
print(pf[idx].stats())
fig = pf[idx].plot(title=f"组合 {idx} 的策略表现")
fig.write_html(f"combo_{idx}_result.html")
不到1分钟就可以看到各个均线组合的回测详情了
还可以:
# 找到收益率最高的参数组合
best = pf.total_return().idxmax()
print("最强组合:", best) # 最强组合: (15, 50)
几行代码,扫一遍整个参数空间。
容易踩坑的几个点(花姐亲踩)
- AKShare 的日期是字符串,要用
pd.to_datetime
转一下,要不 vectorbt 图表会飘 - 遇到停牌日会导致数据不连续,建议用
.fillna(method='ffill')
补齐缺失值 - 有时候 AKShare 会抽风,建议本地保存一份数据别被“接口失联”给噎住
vectorbt
默认不考虑手续费、滑点,你要自己加进去,别光看收益乐得太早
写在最后
不是你写得不够努力,而是你用错了工具。
双均线策略能不能赚钱另说,但如果你能用 vectorbt 跑出漂亮的数据分析图、调出一堆参数组合、洞察一条潜在规律——那你已经比大多数初学者走得远了。
OK,今天先讲这么多。
你要想我继续深入讲 vectorbt 的“参数调优玩法”或者“多策略组合框架”,你尽管吱声,我直接给你安排得明明白白~