性能¶
DoriBT 将快速回测与完整交易账本放在同一次运行中。2520 日 × 100 标的组合,Numba 热运行中位数为 0.147 秒,比 Python 后端快约 6.6 倍。 100 组独立组合的完整扫描中位数为 19.13 秒。
与同类框架的速度对比¶
以下是同一组合输入的热运行中位数:2520 个交易日、100 个标的、固定股数目标,收盘决策、下一开盘成交。计时包含引擎调用,以及现金、持仓、权益和逐笔成交的输出提取。
实现 |
热运行耗时 |
|---|---|
DoriBT Python |
0.970 秒 |
DoriBT Numba |
0.147 秒 |
vectorbt Numba |
0.096 秒 |
vectorbt Rust |
0.075 秒 |
Backtrader |
18.965 秒 |
Zipline-reloaded |
7.151 秒 |
为什么选择 DoriBT? 在这个日线组合场景中,0.147 秒已接近 vectorbt Numba 的 0.096 秒。DoriBT 同时提供开箱即用的 A 股/ETF 历史规则和完整交易账本:接入自有行情,选择规则分类,用普通 Python 函数或目标数组写策略,就能反复研究并追查每次成交。基础包只依赖 NumPy,适合直接放进现有研究脚本。
日线与分钟的复杂成交¶
当研究涉及部分成交、T+1、持续目标与权重重算时,DoriBT 同样提供快速回放。以下对照使用日线 252 日 × 100 标的,或分钟 25 日 × 每日 48 根 bar × 100 标的;各场景使用对应的目标与订单适配器。
场景 |
DoriBT Numba |
DoriBT Numba+原生扩展 |
vectorbt |
|---|---|---|---|
日线稀疏预计算目标 |
0.01358 秒 |
0.01383 秒 |
0.02694 秒 |
分钟稀疏预计算目标 |
0.02966 秒 |
0.02205 秒 |
0.03916 秒 |
分钟部分成交 |
0.04183 秒 |
0.03106 秒 |
0.08849 秒 |
分钟 T+1、涨跌停与状态 |
0.38271 秒 |
0.12345 秒 |
0.08228 秒 |
分钟执行时点权重,持续再平衡 |
0.98922 秒 |
0.32612 秒 |
0.18955 秒 |
全部 17 个对照场景中,DoriBT Numba 在 10 个场景里用时更短。可选原生扩展又把分钟持续权重再平衡从 0.989 秒降到 0.326 秒,把 T+1、涨跌停和状态约束场景从 0.383 秒降到 0.123 秒。完整订单、意图、成交和税务记录随结果一并返回。
查看全部 17 个场景
场景 |
DoriBT Numba(秒) |
加原生扩展(秒) |
vectorbt(秒) |
|---|---|---|---|
日线稀疏预计算目标 |
0.01358 |
0.01383 |
0.02694 |
日线密集预计算目标 |
0.09293 |
0.09706 |
0.05285 |
分钟稀疏预计算目标 |
0.02966 |
0.02205 |
0.03916 |
分钟密集预计算目标 |
0.77014 |
0.31510 |
0.17574 |
日线稀疏目标回调 |
0.04242 |
0.04126 |
0.23280 |
日线密集目标回调 |
0.28933 |
0.30782 |
1.01183 |
分钟稀疏目标回调 |
0.10332 |
0.10063 |
0.73097 |
分钟密集目标回调 |
1.64940 |
1.63963 |
4.54700 |
日线共享资金 |
0.04442 |
0.04448 |
0.02973 |
日线费用舍入 |
0.09360 |
0.09123 |
0.06135 |
分钟部分成交 |
0.04183 |
0.03106 |
0.08849 |
分钟 T+1、涨跌停与状态 |
0.38271 |
0.12345 |
0.08228 |
分钟有状态订单 |
0.38697 |
0.37244 |
1.96526 |
日线收盘权重,仅首次定量 |
0.01392 |
0.01103 |
0.02545 |
日线收盘权重,持续再平衡 |
0.13552 |
0.06959 |
0.05829 |
分钟执行时点权重,仅首次定量 |
0.03142 |
0.02342 |
0.03820 |
分钟执行时点权重,持续再平衡 |
0.98922 |
0.32612 |
0.18955 |
多组参数与组合研究¶
100 组 SMA 参数,每组独立运行 100 个标的、2520 日,合计 2520 万个标的-bar、1393518 笔成交:
实现 |
完整扫描中位数 |
|---|---|
DoriBT Numba |
19.131 秒 |
DoriBT Numba+原生扩展 |
20.036 秒 |
vectorbt Numba |
7.677 秒 |
vectorbt Rust |
6.744 秒 |
DoriBT 使用 100 次公共 API 调用,vectorbt 每批处理 10 个独立账户。DoriBT 的每次运行都保留独立账户和完整记录,便于比较参数、追查某组异常成交,以及导出单独的研究报告。
10 组单标的 × 2520 日的小批量测量中,DoriBT Numba 为 0.063 秒,vectorbt Rust 为 0.017 秒。更多工作流、首次运行及逐轮数据见页末复现资料。
0.6.2:长历史面板回放更快¶
1633 日 × 219 证券的真实历史面板包含上市前、停牌和退市后区间。0.6.2 将这些合法区间的权重目标一起放入完整编译循环,并按规则有效日期批量准备数据。
下表为三组完整研究回放的暖态中位数,每组重复 10 次;计时包含目标转换、数值准备、Backtest.run、完整记录及研究侧输出,市场数据构造另计。
初始资金/参与率/滑点 |
0.6.1 Numba |
0.6.2 Python |
0.6.2 Numba |
|---|---|---|---|
30 万元/10%/5bp |
2.561 秒 |
1.646 秒 |
1.270 秒 |
3000 万元/5%/5bp |
1.872 秒 |
1.877 秒 |
1.451 秒 |
30 万元/10%/5.01bp |
1.846 秒 |
1.638 秒 |
1.304 秒 |
新版 Numba 回放速度为旧版的 1.29—2.02 倍。三组各 10 次回放累计由 63.82 秒降到 40.57 秒,节省约 36% 的回放时间。每日账户和完整交易账本逐项相同。
首次运行与重复运行¶
Numba 首次运行会编译内核,之后可复用缓存。在上述面板的首组测量中,0.6.2 的空缓存首次回放为 18.24 秒,已有磁盘缓存的新进程为 3.80 秒,同进程暖态中位数为 1.27 秒。市场数据构造约 8—9 秒。
重复研究时,复用 MarketData 和 Backtest,把已经算好的信号交给预计算目标;使用 execution_plan 查看实际编译路径。预计算目标提供具体用法。
Python 版本怎么选¶
新环境推荐 Python 3.15。在相同人工面板、NumPy 2.5.4、Numba 0.68.0 下,三个解释器的完整结果一致,3.15 的本机测量用时最短:
CPython |
Python 后端中位数 |
Numba 中位数 |
|---|---|---|
3.13.16 |
1.431 秒 |
0.568 秒 |
3.14.8 |
1.129 秒 |
0.507 秒 |
3.15.0 |
0.998 秒 |
0.460 秒 |
Python 3.13 和 3.14 也受支持,旧环境可直接升级 DoriBT。安装页列出依赖组合。
测量与复现¶
跨框架测量采用 DoriBT 0.6.0,在 Linux/AMD EPYC 9V74 上以单线程运行;0.6.2 长面板及 Python 版本测量在 Windows 11/Ryzen 7 9800X3D 上运行。日线基准采用无费用、无交易限制的固定股数目标,复杂成交矩阵采用对应的费用和交易假设。完整输入、精确包版本、每轮结果及输出核对均已归档。
跨框架复现资料:全部配置、计时边界、冷启动、内存和替代工作流
0.6.2 测量资料:三组研究回放、Python 版本、证券规模与上市分布