Skip to content

Engine

BacktestEngine

Main backtest runner. Takes a strategy, data provider, and config; returns BacktestResults.

from replaybt import BacktestEngine

engine = BacktestEngine(
    strategy=my_strategy,
    data=my_data,
    config={...},
)
results = engine.run()

Constructor

BacktestEngine(
    strategy: Strategy,
    data: DataProvider,
    config: Optional[Dict] = None,
)

Config Keys

Key Type Default Description
initial_equity float 10000 Starting capital
default_size_usd float 10000 Default position size in USD
max_positions int 1 Maximum concurrent positions
slippage float 0.0002 Per-side slippage (0.02%)
taker_fee float 0.00015 Per-side taker fee (0.015%)
maker_fee float 0.0 Per-side maker fee
indicators Dict {} Indicator configurations
skip_signal_on_close bool True Skip on_bar when position closes
same_direction_only bool True Reject opposite-direction orders
sizer PositionSizer None Custom position sizer

Methods

Method Returns Description
run() BacktestResults Execute backtest
on(event, callback) None Register event listener
remove_listener(event, callback) None Remove event listener

Events

Event Callback Signature When
"bar" (bar: Bar) Every bar
"fill" (fill: Fill) Order fills
"exit" (fill: Fill, trade: Trade) Position closes
"signal" (order: Order) Signal emitted

MultiAssetEngine

Multi-symbol runner with time-synchronized bar processing and portfolio-level metrics.

from replaybt import MultiAssetEngine

engine = MultiAssetEngine(
    strategy=my_strategy,
    assets={"ETH": eth_data, "SOL": sol_data},
    config={...},
)
results = engine.run()  # -> MultiAssetResults

Constructor

MultiAssetEngine(
    strategy: Strategy,
    assets: Dict[str, DataProvider],
    config: Optional[Dict] = None,
)

Additional Config Keys

Key Type Default Description
symbol_configs Dict[str, Dict] {} Per-symbol config overrides
max_total_exposure_usd float None Portfolio-level exposure cap

Methods

Method Returns Description
run() MultiAssetResults Execute multi-asset backtest

StepEngine

Gym-like step/reset interface for RL agents.

from replaybt import StepEngine

env = StepEngine(data=my_data, config={...})
obs = env.reset()
while not obs.done:
    result = env.step(action)
    obs = result.observation

Constructor

StepEngine(
    data: DataProvider,
    config: Optional[Dict] = None,
    strategy: Optional[Strategy] = None,
)

Methods

Method Returns Description
reset() StepObservation Start new episode
step(action) StepResult Process one bar
done() bool Episode finished?
close() None Cleanup

StepObservation

Field Type Description
bar Bar Current bar
indicators Dict[str, Any] Indicator values
positions List[Position] Open positions
equity float Current equity
step_count int Steps taken
done bool Episode finished

StepResult

Field Type Description
observation StepObservation Next state
reward float PnL change this step
done bool Episode finished
info Dict[str, Any] Metadata

ExecutionModel

Handles slippage, fees, and gap protection.

Constructor

ExecutionModel(
    slippage: float = 0.0002,
    taker_fee: float = 0.00015,
    maker_fee: float = 0.0,
)

Methods

Method Returns Description
apply_entry_slippage(price, side) float Adverse entry slippage
apply_exit_slippage(price, side) float Adverse exit slippage
calc_fees(size_usd, is_maker) float Fee for one side
check_exit(pos, bar) Tuple[Optional[float], Optional[str]] Check if position should exit

Portfolio

Tracks positions, equity, trades, and drawdown.

Constructor

Portfolio(
    initial_equity: float = 10_000.0,
    default_size_usd: float = 10_000.0,
    execution: Optional[ExecutionModel] = None,
    max_positions: int = 1,
    sizer: Optional[PositionSizer] = None,
)

Properties

Property Type Description
has_position bool Any open positions
position Optional[Position] First position
position_count int Number of open positions
equity float Current equity
peak_equity float Peak equity seen
max_drawdown float Max drawdown ratio
positions List[Position] Open positions
trades List[Trade] Closed trades
fills List[Fill] All fills
total_fees float Cumulative fees
equity_curve List[Tuple[datetime, float]] Equity after each trade

Methods

Method Returns Description
can_open(group) bool Can open new position
positions_in_group(group) List[Position] Positions in group
open_position(bar, order, ...) Fill Open position
merge_position(idx, bar, limit_price, ...) Fill Merge into existing position
close_position(idx, price, reason, ...) Trade Close position
partial_close_position(idx, pct, price, ...) Trade Close fraction