Skip to content

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.bin

Output 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.bin

Prepare Options

FlagDescription
--ticker-data <PATH>Path to bookTicker data (.log, .csv, or .parquet)
--trade-data <PATH>Path to aggTrades data
--trades-onlySynthesize 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
FlagDescriptionDefault
-d, --data <PATH>Path to prepared data file(required)
--balance <FLOAT>Initial balance in USD10000
--leverage <FLOAT>Leverage multiplier1.0
--taker-fee <FLOAT>Taker fee rate0.0004
--maker-fee <FLOAT>Maker fee rate0.0002
--slippage <FLOAT>Slippage percentage0.0001
-p, --param <KEY=VALUE>Strategy parameters (repeatable)
-v, --verbosePrint individual tradesfalse

Via Dashboard

  1. Go to Backtests > New Backtest
  2. Select a strategy
  3. Configure symbols, date range, fees, leverage
  4. Click Run

Results stream in real-time via WebSocket.

Results

Each backtest produces:

MetricDescription
Total PnLNet profit/loss percentage
Win RatePercentage of winning trades
Max DrawdownLargest peak-to-trough decline
Sharpe RatioRisk-adjusted return
Profit FactorGross profit / gross loss
Trade CountTotal number of round-trip trades
Scorepnl% / (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

tradectl — Automate Crypto Trading