Python backtesting infrastructure for systematic strategies
Python library, Rust core. Realistic execution modeling, sub-second performance, reproducible research workflows.
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())Built-in visualizations
Publication-ready charts out of the box. Tearsheets, parameter sweeps, risk analytics, all with a single function call.




Execution modeling
The gap between backtest and live performance is driven by execution assumptions. Each component is modeled independently and configurable per venue.
| Dimension | Typical framework | manifoldbt |
|---|---|---|
| Fee model | Flat percentage or fixed cost | Maker/taker split, minimum fee, per-venue configuration |
| Slippage | Fixed bps or ignored entirely | Fixed-bps, spread-based, or size-aware volume-impact model, opt-in |
| Funding rates | Not modeled | Per-bar funding accrual from the venue's historical funding-rate series |
| Borrow costs | Not modeled | Short borrow charged per bar from an annual rate, per venue |
| Order types | Market orders only | Market, limit, stop, stop-limit, market-if-touched, stop-loss, take-profit, trailing stop |
| Reproducibility | Depends on random seeds and data snapshots | Deterministic bit-for-bit replay via cryptographic manifests |
Features
Data connectors
Built-in providers fetch and normalize market data into Arrow IPC. Parallel ingestion with progress tracking, import from any source.
Spot & perpetuals
Perpetuals L1
Perpetuals v4 (decentralized)
Spot, BTC, ETH, EUR & USD pairs
Stocks, ETFs, futures, options, forex
CME, NASDAQ, OPRA, tick to daily
All data is stored locally as Arrow IPC (per-symbol, multi-resolution), instant replay, no re-download.
Performance
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.

Research workflow
A stat arb strategy using Ornstein-Uhlenbeck mean-reversion, built entirely with the expression DSL.
import manifoldbt as bt
from manifoldbt.expr import col, lit, symbol_ref
from manifoldbt.indicators import close, kalman
# Spread construction
pair_close = symbol_ref("ETHUSDT", "close")
ratio = close / (pair_close + lit(1e-12))
# Kalman equilibrium
equilibrium = kalman(ratio, q=1e-4, r=1e-2)
spread = ratio - equilibrium
# OU parameter (mean-reversion speed)
neg_theta = spread.linreg_slope(28)
# Z-score signal
spread_z = spread.zscore(28).ewm_mean(8)
raw = (lit(0.0) - spread_z) * lit(0.05)
signal = bt.when(
(neg_theta < lit(0.0))
& ((spread_z > lit(0.5)) | (spread_z < lit(-0.5))),
raw,
lit(0.0),
)
strategy = (
bt.Strategy.create("ou_stat_arb")
.signal("spread_z", spread_z)
.signal("neg_theta", neg_theta)
.signal("signal", signal)
.size(col("signal"))
)
result = bt.run(strategy, config, store)
print(result.summary())Expression DSL
Signals are declared as composable expressions, evaluated vectorized across the full time series, no Python loops or row-by-row callbacks. Execution is then simulated event by event for realistic fills.
Symbol references
Cross-asset data access via symbol_ref(). Build spreads, ratios, and relative-value signals that reference any symbol in the universe.
Walk-forward validation
Out-of-sample testing with rolling train/test splits. Parameter stability analysis prevents overfitting to a single period.
Manifest replay
Every backtest produces a cryptographic manifest. Replay any result bit-for-bit, months later, on a different machine.
Research tools
ProBuilt-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.


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

Safety checks
ProAutomated 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 okSignal 'slow' no future data okSignal 'rsi' no future data okSignal 'entry' no future data okPosition sizing no future data okResult: 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% okExposure drift, window 2: 0.8% okRegime sensitivity: stable across 3 windowsResult: STABLE - exposure consistent across time ranges
Pricing
- Rust-powered engine
- All 35+ indicators
- Multi-asset
- CSV / DataFrame import
- Engine resolution: 1m
- Timeseries output: Daily
- Monte Carlo resampling: 1,000 sims
- Parameter sweeps (all-core, 2-D, batch): 256 combos
- Crypto connectors (Binance, Bybit, Hyperliquid, dYdX, Bitstamp)
- MCP server (AI agent integration)
- Tearsheets & export
- Seats: 1
- Rust-powered engine
- All 35+ indicators
- Multi-asset
- CSV / DataFrame import
- Engine resolution: 1m
- Timeseries output: Up to 1m
- Monte Carlo resampling: Unlimited
- Parameter sweeps (all-core, 2-D, batch): Unlimited
- Crypto connectors (Binance, Bybit, Hyperliquid, dYdX, Bitstamp)
- MCP server (AI agent integration)
- Tearsheets & export
- Safety checks (lookahead, exposure)
- Cross-exchange backtesting
- Databento & Massive connectors
- Built-in WFO
- GPU acceleration
- Seats: 1
- Rust-powered engine
- All 35+ indicators
- Multi-asset
- CSV / DataFrame import
- Engine resolution: 1m
- Timeseries output: Up to 1m
- Monte Carlo resampling: Unlimited
- Parameter sweeps (all-core, 2-D, batch): Unlimited
- Crypto connectors (Binance, Bybit, Hyperliquid, dYdX, Bitstamp)
- MCP server (AI agent integration)
- Tearsheets & export
- Safety checks (lookahead, exposure)
- Cross-exchange backtesting
- Databento & Massive connectors
- Built-in WFO
- GPU acceleration
- Seats: 5
- Managed compute (cloud sweeps, Monte Carlo, WFO)
- Included compute credits: 5,000/mo
- Hosted data credits (Databento, Massive): 5,000/mo
- Usage dashboard, spend caps & alerts
- Pay-as-you-go overage
- Priority support: Direct channel
In detail: what Pro unlocks, what Team includes, what Firm adds
FAQ
Learn backtesting in Python
Step-by-step guides, runnable strategy walkthroughs, and honest comparisons, all built on realistic, reproducible backtests.
Guides
- How to Backtest a Trading Strategy
A step-by-step Python walkthrough: from raw bars to a realistic backtest and a tearsheet.
- What Is Backtesting?
What backtesting is, why it works, where it lies to you, and how to do it honestly in Python.
- Algorithmic Trading in Python
The libraries, the workflow, and a runnable parameter sweep to research systematic strategies.
- Walk-Forward Optimization in Python
Optimize in-sample, validate out-of-sample, fold by fold, the honest way to tune parameters.
Compared to other libraries
- Manifold-BT vs RaptorBT
Two Rust engines, benchmarked head to head: both fast on one call, but Manifold-BT is 10 to 20x faster on the parameter sweeps that validate a strategy.
- Manifold-BT vs Freqtrade
An honest comparison: fast, realistic backtesting versus live crypto trading, and when to use each.
- Manifold-BT vs vectorbt
Rust engine with vectorized signals and a sequential fills pass, versus vectorized NumPy: speed, realism, path-dependent logic.
- Manifold-BT vs Backtrader
A fast, realistic research engine versus a mature pure-Python framework, and when each fits.
- Manifold-BT vs NautilusTrader
A research backtesting library with fast parameter sweeps and GPU, versus a full event-driven platform built for live trading and backtest-to-live parity.
Or browse 15 Python trading strategies, each with runnable code and a backtest, see all strategies →