Processes

All processes in market_model implement the Simulatable trait, which provides a uniform interface for the simulation runner.

Available processes

Geometric Brownian Motion

$$dS_t = \mu S_t dt + \sigma S_t dW_t$$

The simplest model. Log-normal returns, constant volatility. Closed-form expected value and variance.

Ornstein-Uhlenbeck

$$dX_t = \theta(\mu - X_t) dt + \sigma dW_t$$

Mean-reverting process with constant diffusion. Used for interest rates, spreads, or volatility.

Cox-Ingersoll-Ross

$$dv_t = \kappa(\theta - v_t) dt + \sigma \sqrt{v_t} dW_t$$

Non-negative mean-reverting process. Used for variance and intensity modeling. Full truncation enforces the non-negativity constraint.

Heston

$$dS_t = \mu S_t dt + \sqrt{v_t} S_t dW_t^S$$ $$dv_t = \kappa(\theta - v_t) dt + \sigma \sqrt{v_t} dW_t^v$$

Two-factor model with correlated Brownian motions. Captures the volatility smile. The Cholesky decomposition of the correlation matrix is applied in each step.

Jump Diffusion

$$dS_t = \mu S_t dt + \sigma S_t dW_t + dJ_t$$ $$dJ_t = (e^Z - 1) dN_t, \quad Z \sim \mathcal{N}(\mu_J, \sigma_J^2)$$

GBM with compound Poisson jumps and log-normal jump sizes. Models sudden large moves that a pure diffusion misses.

Bates

Heston with Merton-style log-normal jumps on the price process. Reduces to Heston when lambda = 0.

Hawkes

$$\lambda(t) = \mu + \int_0^t \phi(t-s) dN_s$$

Self-exciting intensity process. Two kernel options:

  • Exponential: $\phi(t) = \alpha e^{-\beta t}$ -- fast, one decay rate.
  • Power law: $\phi(t) = \frac{\alpha}{(c+t)^p}$ -- heavy-tailed decay.

Simulated via Ogata's thinning algorithm. Has dim() = 0 (no Brownian driver) because all randomness comes from the acceptance-rejection step.

Rough Ornstein-Uhlenbeck

Fractional OU with Hurst parameter $H$. The kernel $t^{H-1/2}$ is approximated by a sum of exponentials (Abi Jaber 2019). The number of factors controls the accuracy-speed tradeoff.

Adding a new process

  1. Create market_model/src/process/your_model.rs.
  2. Implement Simulatable with your state type, dim(), step(), and current().
  3. Add pub mod your_model and a re-export to process/mod.rs.
  4. Add a test comparing Monte Carlo moments against analytical expectations.
  5. Add a criterion benchmark against the GBM baseline.