Single-asset bar simulation
Median warm runtime for nine correctness-matched backtest APIs across 1K, 10K, and 100K bars.
Tools measured in this benchmark
Open a tool page for its code examples, strengths, and limits. Exact versions are listed in the technical details.
VectorBT
Uses labeled arrays for broad searches and compiled code for portfolio steps
Explore toolVectorBT PRO
Uses labeled arrays for broad searches and compiled code for steps that must run in order
Explore toolBacktesting.py
Precalculated indicators with one strategy call per bar
Explore toolPyBroker
Runs callbacks for each symbol and uses compiled code for heavy calculations
Explore toolLumibot
Runs one strategy interface against historical data or a broker
Explore toolZipline Reloaded
Runs scheduled strategy events over local data bundles and Pipeline factors
Explore toolBacktrader
Runs strategy and broker logic one bar at a time
Explore toolBlankly
Runs the same callback-style strategy in tests and through exchange connectors
Explore toolRQAlpha
Processes market events and adds data, risk, and analysis through plugins
Explore toolWarm runtime by bar count
Median wall-clock time for a complete public backtest call plus result extraction. Lower is faster. Runtime uses a logarithmic scale.
Different engine designs produce very different scaling curves
Backtesting.py is lowest at 1K bars, while VectorBT PRO is lowest at 10K and 100K. Full event, calendar, and broker workflows grow more steeply in this narrow signal-and-fill workload.
See exactly how the result was produced
Exact values
| Input bars | Backtesting.py | Backtrader | Blankly | Lumibot | PyBroker | RQAlpha | VectorBT | VectorBT PRO | Zipline Reloaded |
|---|---|---|---|---|---|---|---|---|---|
| 1K | 5.48 ms | 45.04 ms | 18.02 ms | 835.19 ms | 16.76 ms | 241.48 ms | 5.58 ms | 10.67 ms | 1,358.99 ms |
| 10K | 21.72 ms | 465.73 ms | 169.70 ms | 8,070.53 ms | 116.30 ms | 2,270.12 ms | 8.39 ms | 11.30 ms | 4,283.20 ms |
| 100K | 187.91 ms | 4,598.52 ms | 3,741.20 ms | 85,843.34 ms | 1,182.05 ms | 22,590.99 ms | 51.82 ms | 14.90 ms | 110,872.93 ms |
Environment
- Apple M3, 8 logical cores, 24 GB RAM
- macOS 26.5.2, arm64
- CPython 3.11.8
- Backtesting.py 0.6.6, Backtrader 1.9.78.123
- Blankly 1.18.25b0, Lumibot 3.6.5, PyBroker 2.0.1
- RQAlpha 6.4.0, VectorBT 1.1.0, VectorBT PRO 2026.9.5
- Zipline Reloaded 3.1.1
Procedure
- 1K, 10K, and 100K synthetic minute bars
- 2 warmups and 5 measured repetitions
- One share, next-open fills, zero fees and slippage
- Imports, data generation, and first-use compilation excluded
- Fill bar, side, price, count, and final equity checked on every run
Scope
Read this as a narrow API workload. The release compares nine public backtest workflows under matching fill rules. It does not compare feature depth, data ingestion, optimization, live trading, or framework suitability.
Peak RSS was not measured consistently, so this release does not include a memory chart. Runtime describes this exact public-API workload, not overall framework quality.
Reproduce and inspect
The downloadable files preserve the measured values, available result detail, environment record, and checksums.
See the editorial process for the publication standard.
Download the data
Download the chart values, detailed results, release details, or file checksums separately.