Backtesting
tradectl backtests replay historical market data through your strategy with a simulated exchange that handles order fills, TP/SL, slippage, and fees.
Data Model
Backtests use two data sources:
- bookTicker — best bid/ask snapshots (20ms max-bid windowed)
- aggTrades — aggregated trade events
Raw data is prepared into optimized formats using the CLI:
bash
tradectl prepare \
--ticker-data data/raw/bookTicker.log \
--trade-data data/raw/aggTrades.log \
-o data/prepared.binOutput formats:
- Parquet (
.parquet, ZSTD compressed) — ~360ms load time - Zero-copy binary (
.bin, mmap) — ~18µs load time
Use tradectl convert to switch between formats:
bash
tradectl convert -i data/prepared.parquet -o data/prepared.binPrepare Options
| Flag | Description |
|---|---|
--ticker-data <PATH> | Path to bookTicker data (.log, .csv, or .parquet) |
--trade-data <PATH> | Path to aggTrades data |
--trades-only | Synthesize tickers from trades when bookTicker unavailable |
--ticker-bucket-ms <N> | Ticker synthesis bucket (default: 100) |
--buffer-ms <N> | Ticker windowing buffer (default: 20, 0 = no windowing) |
-o, --output <PATH> | Output path (.bin or .parquet) |
Running a Backtest
Via CLI
bash
tradectl backtest \
-d data/prepared.bin \
--leverage 5 \
--taker-fee 0.0004 \
--maker-fee 0.0002 \
--slippage 0.0001 \
--balance 10000 \
-p order_size=0.1 \
-v| Flag | Description | Default |
|---|---|---|
-d, --data <PATH> | Path to prepared data file | (required) |
--balance <FLOAT> | Initial balance in USD | 10000 |
--leverage <FLOAT> | Leverage multiplier | 1.0 |
--taker-fee <FLOAT> | Taker fee rate | 0.0004 |
--maker-fee <FLOAT> | Maker fee rate | 0.0002 |
--slippage <FLOAT> | Slippage percentage | 0.0001 |
-p, --param <KEY=VALUE> | Strategy parameters (repeatable) | — |
-v, --verbose | Print individual trades | false |
Via Dashboard
- Go to Backtests > New Backtest
- Select a strategy
- Configure symbols, date range, fees, leverage
- Click Run
Results stream in real-time via WebSocket.
Results
Each backtest produces:
| Metric | Description |
|---|---|
| Total PnL | Net profit/loss percentage |
| Win Rate | Percentage of winning trades |
| Max Drawdown | Largest peak-to-trough decline |
| Sharpe Ratio | Risk-adjusted return |
| Profit Factor | Gross profit / gross loss |
| Trade Count | Total number of round-trip trades |
| Score | pnl% / (1 + max_dd%) * trade_factor |
Plus an equity curve, drawdown curve, and full trade log.
Simulated Exchange
The InMemoryExchange simulates real exchange behavior:
- Market and limit orders
- Take-profit and stop-loss execution
- Configurable slippage (in ticks)
- Configurable maker/taker fees
- Leverage and margin
- Partial fills