Python backtesting library for systematic strategies

Rust core, Python API. Realistic execution modeling, sub-second performance, reproducible research workflows.

$pip install manifoldbt
See the benchmark →

1,672 downloads on PyPI in the last 30 days

strategy.py
import manifoldbt as bt
from manifoldbt.indicators import close, sma, rsi

fast = sma(close, 20)
slow = sma(close, 50)
signal = bt.when((fast > slow) & (rsi(close, 14) < 70), 1.0, 0.0)

strategy = (
    bt.Strategy.create("momentum")
    .signal("signal", signal)
    .size(signal * 0.25)
    .stop_loss(pct=3.0)
    .take_profit(pct=8.0)
)

result = bt.run(strategy, config, store)
print(result.summary())
Same strategy, same data, real-time race
manifoldbt░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
raptorbt░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
vectorbt░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

Built-in visualizations

Publication-ready charts out of the box. Tearsheets, parameter sweeps, risk analytics, all with a single function call. Click a figure to see it in full.

Five of the built-in figures. Sweep maps, walk-forward folds, Monte Carlo fans and permutation tests are one call each as well, drawn on a real strategy in the research workflow →

Execution modeling

The gap between backtest and live performance is driven by execution assumptions. Each component is modeled independently and configurable per venue.

Fee model
Typical framework
Flat percentage or fixed cost
manifoldbt
Maker/taker split, minimum fee, per-venue configuration
Slippage
Typical framework
Fixed bps or ignored entirely
manifoldbt
Fixed-bps, spread-based, or size-aware volume-impact model, opt-in
Funding rates
Typical framework
Not modeled
manifoldbt
Per-bar funding accrual from the venue's historical funding-rate series
Borrow costs
Typical framework
Not modeled
manifoldbt
Short borrow charged per bar from an annual rate, per venue
Order types
Typical framework
Market orders only
manifoldbt
Market, limit, stop, stop-limit, market-if-touched, stop-loss, take-profit, trailing stop
Reproducibility
Typical framework
Depends on random seeds and data snapshots
manifoldbt
Deterministic bit-for-bit replay via cryptographic manifests

Data connectors

Built-in providers fetch and normalize market data into Arrow IPC. Parallel ingestion with progress tracking, import from any source.

Crypto exchanges

Binance logoBinance

Spot & perpetuals

spotperpetuals
Bybit logoBybit

Spot & perpetuals

spotperpetuals
Hyperliquid logoHyperliquid

Perpetuals L1

perpetuals
dYdX logodYdX

Perpetuals v4 (decentralized)

perpetuals
Bitstamp logoBitstamp

Spot, BTC, ETH, EUR & USD pairs

spot
Deribit logoDeribit

BTC & ETH options, futures and perpetuals

optionsfuturesperpetualsspot

Stocks, futures, FX and indices

Massive and Databento go down to tick. Yahoo and IEX are landing next, free and daily.

Yahoo Finance logoYahoo Finance

Stocks, ETFs, futures, FX, indices. Daily bars, back to 1970.

equitiesfuturesforexindices
Dukascopy logoDukascopy

Spot FX and metals, CFDs on indices, commodities and stocks. Bid and ask, 1m, majors since 2003.

forexmetalscommoditiesindicesequitiesspot
IEX
Soon

US equities and ETFs, IEX exchange tape

equitiesindices
Massive logoMassive
Pro

Stocks, ETFs, futures, options, forex, and crypto spot

equitiesoptionsfuturesforexindicesspot
Databento logoDatabento
Pro

CME, NASDAQ, OPRA, tick to daily

equitiesoptionsfuturesindices
CSV / DataFrame import, auto-detected format
MetaTrader 4Native CSV export
MetaTrader 5Native CSV/TSV export
Custom CSVtimestamp, OHLCV
DataFramepandas or Polars, in memory

All data is stored locally as Arrow IPC (per-symbol, multi-resolution), instant replay, no re-download.

Speed, measured in public

The engine is written in Rust and operates on Apache Arrow columnar arrays. Data flows through the pipeline with zero-copy semantics and SIMD-friendly memory layout.

These figures are ours. The engine is also measured in public CI against vectorbt and RaptorBT, all three installed from PyPI on a free GitHub runner, with the raw results published and the workflow open to anyone who wants to re-run it. See the reproducible benchmark →

sharpe512,000 combos
Illustrative parameter sweep heatmap: Sharpe ratio across two strategy parameters in red, amber and green, with a green plateau in the middle marked at 1.26 and red along the bottom.
Every combination, scored. Trade the plateau, not the lucky cell.

Write it with your agent

Ask an agent for a backtest and it hand-rolls one in pandas, fills and fees included, and the numbers often come out wrong without a single error to warn you. Give it Manifold-BT and the docs over MCP, and it gets the strategy right more than three times as often.

Works withClaude CodeCodexCursor
Success rate24 attempts · same 8 tasks · Haiku 4.5
Agent without a framework
21%
Agent + manifoldbt
3.6× more75%
How it was measured →

Research tools

Pro

Built-in tools to validate strategies before deploying capital. Every analysis runs in Rust, no Python bottlenecks.

Walk-forward optimization

Split your data into train/test folds. Optimize parameters in-sample, validate out-of-sample. Compare stitched OOS equity against the full backtest to detect overfitting.

bt.plot.walk_forward(wf, mode="bars")
Walk-forward, IS vs OOS Sharpe per fold
bt.plot.walk_forward(wf, mode="stitched", full_result=result)
Stitched OOS equity vs full backtest

Monte Carlo analysis

Bootstrap returns to estimate tail risk and P(ruin), or permute return order to measure path dependency and drawdown distribution.

bt.plot.monte_carlo(result, method="bootstrap")
Monte Carlo bootstrap, fan chart with P(ruin)

Safety checks

Pro

Automated diagnostics that catch common backtesting pitfalls. Run them before trusting any result.

Lookahead bias detection

Tests every signal for future data leakage and names the one that leaks. Catches the bugs that silently inflate a backtest.

$ bt.diagnostics.detect_lookahead(strategy, config, store)
 
Lookahead Bias Detection Report
================================
 
Tolerance: 1.0%
 
Signal 'fast' no future data ok
Signal 'slow' no future data ok
Signal 'rsi' no future data ok
Signal 'entry' no future data ok
Position sizing no future data ok
 
Result: CLEAN - no lookahead bias detected

Exposure stability

Verifies that strategy exposure is consistent when you extend or truncate the backtest period. Detects regime-dependent behavior.

$ bt.diagnostics.check_exposure_stability(strategy, config, store)
 
Exposure Stability Report
=========================
 
Exposure drift, window 1: 0.3% ok
Exposure drift, window 2: 0.8% ok
Regime sensitivity: stable across 3 windows
 
Result: STABLE - exposure consistent across time ranges

Pricing

The full engine is free. Pro lifts the research caps. Researcher adds the tick layer and the GPU. Firm adds distributed compute and a named contact.

Community
Free
Full engine, no time limit
No card, no account
pip install manifoldbt
  • Rust-powered engine
  • All 104 indicators
  • Multi-asset
  • Crypto, FX & stock connectors, CSV / DataFrame import
  • MCP server (AI agent integration)
  • Prop-firm account rules
  • Engine resolution: 1m
  • Timeseries output: Daily
  • Monte Carlo resampling: 1,000 sims
  • Parameter sweeps (all-core, 2-D, batch): 256 combos
Pro
$16/mo
No caps, 1-second bars
$190 billed yearly
  • Rust-powered engine
  • All 104 indicators
  • Multi-asset
  • Crypto, FX & stock connectors, CSV / DataFrame import
  • MCP server (AI agent integration)
  • Prop-firm account rules
  • Engine resolution: 1s
  • Timeseries output: Up to 1s
  • Monte Carlo resampling: Unlimited
  • Parameter sweeps (all-core, 2-D, batch): Unlimited
  • Safety checks (lookahead, exposure)
  • Cross-exchange backtesting
  • Databento & Massive connectors
  • Built-in WFO
Researcher
$33/mo
Tick data, real fills, GPU
$390 billed yearly
  • Rust-powered engine
  • All 104 indicators
  • Multi-asset
  • Crypto, FX & stock connectors, CSV / DataFrame import
  • MCP server (AI agent integration)
  • Prop-firm account rules
  • Engine resolution: Tick
  • Timeseries output: Up to 1s
  • Monte Carlo resampling: Unlimited
  • Parameter sweeps (all-core, 2-D, batch): Unlimited
  • Safety checks (lookahead, exposure)
  • Cross-exchange backtesting
  • Databento & Massive connectors
  • Built-in WFO
  • GPU acceleration
  • Order flow from the tape
  • Real bid / ask (BBO)
  • Tick-resolved fills
  • L2/L3 order book & queue position
Firm
From$490/mo
Distributed compute, SLA
Annual contract
  • Rust-powered engine
  • All 104 indicators
  • Multi-asset
  • Crypto, FX & stock connectors, CSV / DataFrame import
  • MCP server (AI agent integration)
  • Prop-firm account rules
  • Engine resolution: Tick
  • Timeseries output: Up to 1s
  • Monte Carlo resampling: Unlimited
  • Parameter sweeps (all-core, 2-D, batch): Unlimited
  • Safety checks (lookahead, exposure)
  • Cross-exchange backtesting
  • Databento & Massive connectors
  • Built-in WFO
  • GPU acceleration
  • Order flow from the tape
  • Real bid / ask (BBO)
  • Tick-resolved fills
  • L2/L3 order book & queue position
  • Managed & distributed compute
  • Connectors built for your data
  • Priority support: Contractual SLA

In detail: what Pro unlocks, what Researcher adds, what Firm covers. Prices exclude tax.

FAQ

Learn backtesting in Python

Step-by-step guides, runnable strategy walkthroughs, and honest comparisons, all built on realistic, reproducible backtests.

Guides

Or browse 15 Python trading strategies, each with runnable code and a backtest, see all strategies →

Run it on your own strategy

The full engine is free, on your machine, with your data. The speed figures on this page come from a public CI run, if you would rather check them first.

$pip install manifoldbt
See the benchmark →