速度贼快的Python金融量化框架,我用1分钟回测了15个策略

0 阅读5分钟

速度贼快的Python金融量化框架,我用1分钟回测了15个策略

大家好我是花姐,今天给大家分享一个回测速度超快的量化库——vectorbt image.png

什么是 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 下得提前装好 numpywheel
  • vectorbt 会自动装 numbaplotlyipywidgets 等一些依赖。

实战:用 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

image.png

到这里,你可能会问:“为啥用 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分钟就可以看到各个均线组合的回测详情了

image.png 还可以:

# 找到收益率最高的参数组合
best = pf.total_return().idxmax()
print("最强组合:", best) # 最强组合: (15, 50)

几行代码,扫一遍整个参数空间。


容易踩坑的几个点(花姐亲踩)

  • AKShare 的日期是字符串,要用 pd.to_datetime 转一下,要不 vectorbt 图表会飘
  • 遇到停牌日会导致数据不连续,建议用 .fillna(method='ffill') 补齐缺失值
  • 有时候 AKShare 会抽风,建议本地保存一份数据别被“接口失联”给噎住
  • vectorbt 默认不考虑手续费、滑点,你要自己加进去,别光看收益乐得太早

写在最后

不是你写得不够努力,而是你用错了工具。

双均线策略能不能赚钱另说,但如果你能用 vectorbt 跑出漂亮的数据分析图、调出一堆参数组合、洞察一条潜在规律——那你已经比大多数初学者走得远了。


OK,今天先讲这么多。

你要想我继续深入讲 vectorbt 的“参数调优玩法”或者“多策略组合框架”,你尽管吱声,我直接给你安排得明明白白~