Skip to content
项目

polakowo/vectorbt has 9,721 GitHub stars and 1,264 forks. GitHot measured +21 stars in 24 hours. Last checked 2026-11-07 05:59 UTC. Last push 2026-11-03.

这些数字如何统计

The research engine that gives you an unfair advantage. Run thousands of trading ideas before others finish one.

可以做什么

  • Fast, vectorized backtesting Research strategies at scale with pandas, NumPy, and Numba. Backtesting examples → - Optional Rust engine Use precompiled kernels for supported operations without JIT compilation. Rust engine →

实测星标增长

24小时
+21
7天
更新延迟
15天
更新延迟
1个月
更新延迟

各周期内的星标净变化,周期相互重叠,并非每日新增。缺失的测量保持空白。星标代表关注度,不代表软件质量。

README.zh-CN.md

原文

简体中文 / English | 功能 · 安装 · 示例 · 链接

让交易研究规模化。

VectorBT 是面向交易研究的 Python 工具库。探索市场数据,构建指标和信号,跨资产、跨时间周期比较数千种交易思路。借助 NumPy 数组、Numba 加速和可选的 Rust 引擎,只需几行 Python 代码即可开展大规模实验。


在同一工作流中,从探索价格形态到评估交易策略。查看交易、费用、回撤和投资组合表现,并通过交互式图表分析结果。VectorBT 面向交易者、研究人员和 AI 智能体,通过可组合的 Python API 将数据分析、策略模拟和可视化整合在一起。

VectorBT 是 VectorBT PRO 的开源社区版。 PRO 在此基础上提供并行计算、更多数据集成、投资组合优化、形态识别、事件预测、限价单、杠杆等功能, 以及其他 100 多项功能,并且每周持续新增功能。

查看 VectorBT 与 PRO 的对比,或浏览 PRO 功能示例。

功能

高速向量化回测

基于 pandas、NumPy 和 Numba,开展大规模策略研究。

回测示例 →

可选的 Rust 引擎

为支持的运算提供预编译内核,无需承担 JIT 编译开销。

Rust 引擎 →

原生集成 pandas 的 API

通过自定义访问器,直接对 pandas 对象执行高性能运算。

pandas 集成 →

灵活的广播机制

利用灵活的数组广播,开展多资产分析和大规模参数扫描。

广播 API →

丰富的指标生态

构建自定义指标,并使用 TA-Lib、Pandas TA 等工具集成。

指标功能 →

投资组合回测

分析交易、回撤和绩效,并集成 QuantStats。

投资组合分析 →

信号工具

生成、排序和映射交易信号,并分析其分布。

信号功能 →

内置数据获取功能

获取市场数据、执行预处理,并生成合成时间序列。

数据功能 →

稳健性测试

运行滚动优化,并为机器学习工作流生成标签。

稳健性测试 →

交互式可视化

通过 Plotly 图表、Jupyter 小部件和浏览器仪表板探索结果。

绘图功能 →

自动化工具

定时更新数据,并发送 Telegram 通知。

定时任务与通知 →

可组合的 Python API

组合功能模块,支持快速实验和由 AI 智能体驱动的工作流。

Python 工作流 →

安装

pip install -U vectorbt

安装可选的 Rust 引擎:

pip install -U "vectorbt[rust]"

安装所有可选集成(TA-Lib、Pandas TA 等):

pip install -U "vectorbt[full]"

同时安装所有可选集成和 Rust 引擎:

pip install -U "vectorbt[full,rust]"

示例

从 2014 年起向比特币投资 100 美元

import vectorbt as vbt

data = vbt.YFData.download("BTC-USD")
price = data.get("Close")

pf = vbt.Portfolio.from_holding(price, init_cash=100)
print(pf.total_profit())

输出:

19501.10906763755

交易双简单移动平均线(SMA)交叉策略

fast_ma = vbt.MA.run(price, 10)
slow_ma = vbt.MA.run(price, 50)
entries = fast_ma.ma_crossed_above(slow_ma)
exits = fast_ma.ma_crossed_below(slow_ma)

pf = vbt.Portfolio.from_signals(price, entries, exits, init_cash=100)
print(pf.total_profit())

输出:

34417.80960086067

[!TIP] VectorBT PRO

模拟限价单, 使用杠杆,并通过 合约乘数进行期货建模。

生成 1,000 个随机策略

import numpy as np

symbols = ["BTC-USD", "ETH-USD"]
data = vbt.YFData.download(symbols, missing_index="drop")
price = data.get("Close")

n = np.random.randint(10, 101, size=1000).tolist()
pf = vbt.Portfolio.from_random_signals(price, n=n, init_cash=100, seed=42)

mean_expectancy = pf.trades.expectancy().groupby(["randnx_n", "symbol"]).mean()
fig = mean_expectancy.unstack().vbt.scatterplot(xaxis_title="randnx_n", yaxis_title="mean_expectancy")
fig.show()

输出:

随机策略的平均交易期望收益

测试 10,000 种双 SMA 窗口组合

symbols = ["BTC-USD", "ETH-USD", "XRP-USD"]
data = vbt.YFData.download(symbols, missing_index="drop")
price = data.get("Close")

windows = np.arange(2, 101)
fast_ma, slow_ma = vbt.MA.run_combs(price, window=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(price, entries, exits, size=np.inf, fees=0.001, freq="1D")

fig = pf.total_return().vbt.heatmap(
    x_level="fast_window", y_level="slow_window", slider_level="symbol", symmetric=True,
    trace_kwargs=dict(colorbar=dict(title="Total return", tickformat="%")))
fig.show()

输出:

不同资产的双 SMA 窗口组合

[!TIP] VectorBT PRO

使用随机搜索对大型参数网格进行采样, 或通过条件参数 排除快均线窗口长于慢均线窗口等组合。 交叉验证教程 介绍了如何在训练数据上选择参数,并在后续时间段上进行评估。

查看任意策略配置的统计数据

print(pf[(10, 20, "ETH-USD")].stats())

输出:

Start                          2017-11-09 00:00:00+00:00
End                            2026-01-03 00:00:00+00:00
Period                                2978 days 00:00:00
Start Value                                        100.0
End Value                                    1604.093789
Total Return [%]                             1504.093789
Benchmark Return [%]                          866.094127
Max Gross Exposure [%]                             100.0
Total Fees Paid                               204.226289
Max Drawdown [%]                               70.734951
Max Drawdown Duration                 1095 days 00:00:00
Total Trades                                          81
Total Closed Trades                                   80
Total Open Trades                                      1
Open Trade PnL                                -14.232533
Win Rate [%]                                       41.25
Best Trade [%]                                120.511071
Worst Trade [%]                               -27.772271
Avg Winning Trade [%]                          27.265519
Avg Losing Trade [%]                           -9.022864
Avg Winning Trade Duration    32 days 20:21:49.090909091
Avg Losing Trade Duration      8 days 16:51:03.829787234
Profit Factor                                   1.275515
Expectancy                                     18.979079
Sharpe Ratio                                    0.861945
Calmar Ratio                                    0.572758
Omega Ratio                                      1.20277
Sortino Ratio                                   1.301377
Name: (10, 20, ETH-USD), dtype: object

绘制任意策略配置的图表

pf[(10, 20, "ETH-USD")].plot().show()

输出:

查看交易、缩放图表并切换投资组合基准曲线

为多个交易标的生成布林带动画

除了回测,VectorBT 还提供金融数据分析和可视化工具:

symbols = ["BTC-USD", "ETH-USD", "XRP-USD"]
data = vbt.YFData.download(symbols, period="6mo", missing_index="drop")
price = data.get("Close")
bbands = vbt.BBANDS.run(price)

def plot(index, bbands):
    bbands = bbands.loc[index]
    fig = vbt.make_subplots(
        rows=2, cols=1, shared_xaxes=True, vertical_spacing=0.15,
        subplot_titles=("%B", "Bandwidth"))
    fig.update_layout(showlegend=False, width=750, height=400)
    bbands.percent_b.vbt.ts_heatmap(
        trace_kwargs=dict(zmin=0, zmid=0.5, zmax=1, colorscale="Spectral", colorbar=dict(
            y=(fig.layout.yaxis.domain[0] + fig.layout.yaxis.domain[1]) / 2, len=0.5
        )), add_trace_kwargs=dict(row=1, col=1), fig=fig)
    bbands.bandwidth.vbt.ts_heatmap(
        trace_kwargs=dict(colorbar=dict(
            y=(fig.layout.yaxis2.domain[0] + fig.layout.yaxis2.domain[1]) / 2, len=0.5
        )), add_trace_kwargs=dict(row=2, col=1), fig=fig)
    return fig

vbt.save_animation(
    "bbands.gif", bbands.wrapper.index, plot, bbands,
    delta=90, step=3, fps=3, writer_kwargs=dict(loop=0))

输出:

100%|██████████| 31/31 [00:21<00:00,  1.21it/s]
布林带百分比位置和带宽的滚动热力图

访问网站,获取更多示例、文档和指南。

示例应用

K 线形态

以交互方式探索 K 线形态,并使用 VectorBT 回测其交易信号。

在应用中探索 K 线形态、查看交易,并比较策略统计数据

链接

许可证

本项目属于 fair-code,根据附带 Commons Clause 条款的 Apache 2.0 许可证分发。

源代码公开可用,任何个人或组织均可免费使用。但是,不得销售以本软件为主要内容的产品或服务。

如有疑问或希望申请许可证例外,请联系作者。

安装可选依赖项时,可能需要遵守更严格的许可条款。

贡献者

感谢所有为 VectorBT 作出贡献的人!

Star 历史

免责声明

本软件仅供学习使用。请勿投入您无法承受损失的资金。

使用本软件的风险由您自行承担。作者及关联方对您的交易结果不承担任何责任。

探索相关项目