Implementation Matrix

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.

Models

The solver crate provides 9 pre-built optimal control models. Each implements ControlProblem<N> for a specific state dimension and set of dynamics; models solved on a diffusive grid also implement the FD-specific PdeProblem<N> transport contract. All models are solved rigorously — they discretize the exact HJB PDE without approximation. See Rigor Reference for the full mapping of HJB to method.

ModelNState variablesHJB solvedFDBSDERigor
AvellanedaStoikov2q, SCARA AS HJBYesYesRigorous
AvellanedaDrift2q, SCARA AS HJB + price driftYesYesRigorous
AvellanedaImpact2q, SCARA AS HJB + market impactYesYesRigorous
AvellanedaHawkes2q, lambdaCARA AS HJB + unilateral HawkesYesYesRigorous
BilateralHawkes3q, lambda+, lambda-CARA AS HJB + bilateral HawkesYesYesRigorous
BilateralHawkesOFI3q, lambda+, lambda-CARA AS HJB + bilateral Hawkes + OFIYesYesRigorous
Heston2q, vCARA AS HJB + Heston volYesYesRigorous
HestonHawkes3q, v, lambdaCARA AS HJB + Heston + HawkesYesYesRigorous
AmericanPut1SOptimal stopping HJBYesNoRigorous

Terminal conditions

ConditionValue at expirySupported by
Zero\(V(T) = 0\) for all statesAll 9 models
LiquidationCost\(V(T) = -\lvert q \rvert \cdot half\_spread\)AvellanedaHawkes, BilateralHawkes, BilateralHawkesOFI, Heston

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.

Price behaviours captured

BehaviourModels
Constant volatilityAvellanedaStoikov, AvellanedaDrift, AvellanedaImpact
Stochastic volatilityHeston, HestonHawkes
Mean-reverting intensityAvellanedaHawkes, BilateralHawkes, BilateralHawkesOFI, HestonHawkes
Jump diffusion on price(via market_model processes fed to engine, not via solver models)
Permanent market impactAvellanedaImpact, BilateralHawkesOFI
Order flow imbalanceBilateralHawkesOFI (eta_ofi > 0)
Drifting mid-priceAvellanedaDrift

Solvers

Both numerical solvers accept any ControlProblem<N> implementation. The grid-based PolicyIterationSolver additionally requires PdeProblem<N> for the implicit, Crank-Nicolson, and Strang-ADI schemes; explicit Euler only needs ControlProblem.

SolverMethodBest forTime discretisation
PolicyIterationSolverFinite difference on a gridN <= 3, high accuracyImplicit, Explicit, Crank-Nicolson, Strang ADI
BsdeSolverLeast-squares Monte Carlo regressionN >= 3, scales better with dimensionForward-backward with basis functions
SolverScheme optionsLinear solver
PolicyIterationSolverImplicit (default: Crank-Nicolson), Explicit, StrangAdiSOR, Thomas (tridiagonal), LAPACK dgtsv
BsdeSolverPolynomial basis (Power, Hermite, Chebyshev, Laguerre), degree 1-6, scaling wrapperCustom regression (SVD via faer)

Engine strategies

All strategies implement Strategy and consume Observation (filtered by ObservationFilter) to emit OrderRequests.

StrategyTable dimsSolution sourceHJB solvedRigor
AvellanedaStoikovExactStrategy2DExact matrix ODE tablesCARA AS HJBRigorous
AvellanedaStoikovHestonStrategy3DPrecomputed FDM Heston tablesCARA AS HJB + Heston volRigorous
AvellanedaStoikovHawkesStrategy3DPrecomputed FDM Hawkes tablesCARA AS HJB + HawkesRigorous
AvellanedaStoikovBilateralHawkesStrategy4DPrecomputed FDM BilateralHawkes tablesCARA AS HJB + bilateral HawkesRigorous
AvellanedaStoikovBilateralHawkesOFIStrategy4DPrecomputed FDM BilateralHawkesOFI tablesCARA AS HJB + bilateral Hawkes + OFIRigorous
AvellanedaStoikovStrategyAS analytical formulaNone (inline approximation)Approximation
ConstantSymmetricStrategyFixed half-spreadNoneHeuristic
KellyStrategy2DOnline mu/sigma est. + AS formulaNone (CARA ansatz, no log-utility HJB)Heuristic
KellyRigorousStrategy3DPrecomputed FDM Kelly tablesLog-utility HJB (x-reduced)Rigorous
ZeroIntelligenceStrategyUniform random half-spreadNoneHeuristic
RandomStrategyRandom side + price jitterNoneHeuristic
SignalEngineStrategyMA / RSI / multi-signal votingNoneHeuristic
ExternalStrategyExternally injectedN/AN/A

Strategy to model mapping

StrategyCompatible solver model
AvellanedaStoikovStrategyAvellanedaStoikov, AvellanedaDrift
AvellanedaStoikovExactStrategyAvellanedaStoikov
AvellanedaStoikovHestonStrategyHeston
AvellanedaStoikovHawkesStrategyAvellanedaHawkes
AvellanedaStoikovBilateralHawkesStrategyBilateralHawkes
AvellanedaStoikovBilateralHawkesOFIStrategyBilateralHawkesOFI
ConstantSymmetricStrategy / ZI / Random / KellyAny (model-agnostic)

Matchers

Two matcher implementations determine how limit orders get filled.

MatcherFill mechanismsHawkes supportFeatures
SimpleMatcherAggressive crossing at BBONoDeterministic, zero configuration
StochasticMatcherAggressive + sweep + Poisson arrivalUnilateral or bilateralConfigurable k, a, alpha, beta

StochasticMatcher Hawkes modes

ModeBuildera_eff(t)Parameters exposed
No Hawkesdefaulta (constant)
Unilateral.with_hawkes(alpha, beta)a + excitation(t)hawkes_intensity
Bilateral.with_bilateral_hawkes(alpha, beta)Separate per sidehawkes_buy_intensity, hawkes_sell_intensity

Data sources

SourceProcessesOutputGround truth
SimulatedDataSource<P>GBM, Heston, BatesBBO + vol + drift + paramsOptional (filtered by ObservationFilter)
ParquetDataSourceFile replayBBO onlyNone

Backtesting

FunctionTerminal liquidationCustom lookbackUse case
run_backtestNoNo (default 10)Default path
run_backtest_with_liquidationYes (\(\lvert q \rvert \cdot half\_spread\))NoConsistent with LiquidationCost terminal condition
run_backtest_lookbackNoYes (custom steps)Custom adverse selection window

BacktestResult metrics

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.


Observation filtering

ModeConstructorVisible to strategy
Transparenttransparent()BBO, portfolio, volatility, drift, all parameters
Opaqueopaque()BBO, portfolio only
PartialStruct fieldsBBO, portfolio, selected parameters via whitelist

VecEnv

FieldPurpose
ProcessGBM, Heston, or Bates (configurable via VecEnvProcess enum)
MatcherStochasticMatcher with bilateral Hawkes when \(hawkes\_alpha > 0\)
StrategyExternalStrategy (actions injected per step)
State (5D GBM)[mid, inventory, lambda_buy, lambda_sell, time]
State (6D Heston/Bates)[mid, inventory, variance, lambda_buy, lambda_sell, time]
Action (2D)[bid_distance, ask_distance] from mid
RewardPnL or DiffSharpe, minus inventory penalty
ParallelismSequential across N independent envs