This page catalogues every configurable option across the three crates
and shows which combinations are compatible. Use it to determine what
model, solver, and engine setup fits your use case.
The solver crate provides 9 pre-built optimal control models. Each
implements Model<N> for a specific state dimension and set of dynamics.
Model N State variables Liquidation cost Inventory bounds Drift Impact Unique feature
AvellanedaStoikov2 q, S No (hardcoded zero) No No No Base AS: constant intensity A
AvellanedaDrift2 q, S No No Yes (mu) No Drifting mid-price
AvellanedaImpact2 q, S Hardcoded quadratic No No Yes (xi) Permanent market impact
AvellanedaHawkes2 q, lambda Yes Yes No No Self-exciting intensity
BilateralHawkes3 q, lambda+, lambda- Yes Yes No No Separate buy/sell intensities
BilateralHawkesOFI3 q, lambda+, lambda- Yes Yes No Yes (eta_ofi) OFI adverse selection
Heston2 q, v Yes Yes No No Stochastic volatility (CIR)
HestonHawkes3 q, v, lambda No (hardcoded zero) No No No Combined Heston + Hawkes
AmericanPut1 S Hardcoded (K-S)+ No Yes (mu) No Non-market-making benchmark
Condition Value at expiry Supported by
ZeroV(T) = 0 for all statesAll 9 models
LiquidationCost`V(T) = - q
Models that do not expose with_terminal_condition have hardcoded terminal
values (usually zero, or a model-specific expression like -0.5*xi*q^2 for
AvellanedaImpact). To apply uniform terminal liquidation at the backtest
level, use run_backtest_with_liquidation from the engine.
Behaviour Models
Constant volatility AvellanedaStoikov, AvellanedaDrift, AvellanedaImpact
Stochastic volatility Heston, HestonHawkes
Mean-reverting intensity AvellanedaHawkes, BilateralHawkes, BilateralHawkesOFI, HestonHawkes
Jump diffusion on price (via market_model processes fed to engine, not via solver models)
Permanent market impact AvellanedaImpact, BilateralHawkesOFI
Order flow imbalance BilateralHawkesOFI (eta_ofi > 0)
Drifting mid-price AvellanedaDrift
Both numerical solvers accept any Model<N> implementation.
Solver Method Best for Time discretisation
PolicyIterationSolverFinite difference on a grid N <= 3, high accuracy Implicit, Explicit, Crank-Nicolson, Strang ADI
BsdeSolverLeast-squares Monte Carlo regression N >= 3, scales better with dimension Forward-backward with basis functions
Solver Scheme options Linear solver
PolicyIterationSolverImplicit (default: Crank-Nicolson), Explicit, StrangAdiSOR, Thomas (tridiagonal), LAPACK dgtsv
BsdeSolverPolynomial basis (Power, Hermite, Chebyshev, Laguerre), degree 1-6, scaling wrapper Custom regression (SVD via faer)
All strategies implement Strategy and consume Observation (filtered by
ObservationFilter) to emit OrderRequests.
Strategy Table dims Table axes Maturity Source of optimal spreads
AvellanedaStoikovStrategy(none) — Production Analytical formula, optional vol estimation
AvellanedaStoikovExactStrategy2D [q, tau] Production Exact GBM matrix ODE solution
AvellanedaStoikovHestonStrategy3D [q, v, tau] Production Precomputed FDM Heston tables
AvellanedaStoikovHawkesStrategy3D [q, lambda, tau] Production Precomputed FDM Hawkes tables
AvellanedaStoikovBilateralHawkesStrategy4D [q, lambda+, lambda-, tau] Production Precomputed FDM BilateralHawkes tables
AvellanedaStoikovBilateralHawkesOFIStrategy4D [q, lambda+, lambda-, tau] Production Precomputed FDM BilateralHawkesOFI tables
ConstantSymmetricStrategy(none) — Production Fixed half-spread
ZeroIntelligenceStrategy(none) — Production Uniform random half-spread
RandomStrategy(none) — Production Random side with small price jitter
ExternalStrategy(none) — Production Externally injected via set_pending_requests
Strategy Compatible solver model
AvellanedaStoikovStrategyAvellanedaStoikov, AvellanedaDrift
AvellanedaStoikovExactStrategyAvellanedaStoikov
AvellanedaStoikovHestonStrategyHeston
AvellanedaStoikovHawkesStrategyAvellanedaHawkes
AvellanedaStoikovBilateralHawkesStrategyBilateralHawkes
AvellanedaStoikovBilateralHawkesOFIStrategyBilateralHawkesOFI
ConstantSymmetricStrategy / ZI / RandomAny (model-agnostic)
Two matcher implementations determine how limit orders get filled.
Matcher Fill mechanisms Hawkes support Features
SimpleMatcherAggressive crossing at BBO No Deterministic, zero configuration
StochasticMatcherAggressive + sweep + Poisson arrival Unilateral or bilateral Configurable k, a, alpha, beta
Mode Builder a_eff(t) Parameters exposed
No Hawkes default a (constant) —
Unilateral .with_hawkes(alpha, beta)a + excitation(t) hawkes_intensity
Bilateral .with_bilateral_hawkes(alpha, beta)Separate per side hawkes_buy_intensity, hawkes_sell_intensity
Source Processes Output Ground truth
SimulatedDataSource<P>GBM, Heston, Bates BBO + vol + drift + params Optional (filtered by ObservationFilter)
ParquetDataSourceFile replay BBO only None
Function Terminal liquidation Custom lookback Use case
run_backtestNo No (default 10) Default path
run_backtest_with_liquidationYes ( q * half_spread)
run_backtest_lookbackNo Yes (custom steps) Custom adverse selection window
Return, annualised return, volatility, Sharpe, Sortino, max drawdown,
total trades, final equity, mean/max/min inventory, adverse selection (bps),
realised edge (bps), inventory variance, PnL spread, PnL directional,
fill buy/sell counts, mean hold time, terminal liquidation cost.
Mode Constructor Visible to strategy
Transparent transparent()BBO, portfolio, volatility, drift, all parameters
Opaque opaque()BBO, portfolio only
Partial Struct fields BBO, portfolio, selected parameters via whitelist
Field Purpose
Model Heston process (fixed, not configurable per env)
Matcher StochasticMatcher with bilateral Hawkes when hawkes_alpha > 0
Strategy ExternalStrategy (actions injected per step)
State (6D) [mid, inventory, variance, lambda_buy, lambda_sell, time_remaining]
Action (2D) [bid_distance, ask_distance] from mid
Reward PnL or DiffSharpe, minus inventory penalty
Parallelism rayon across N independent envs