Market Making Library
A comprehensive Rust library implementing quantitative market making strategies based on the Avellaneda-Stoikov model and extensions. This library provides production-ready components for building automated market making systems for financial markets.
Overview
Market making is the practice of simultaneously providing buy (bid) and sell (ask) quotes in a financial market. The market maker profits from the bid-ask spread while providing liquidity to the market.
Key Challenges Addressed
- Inventory Risk: Dynamic quote skewing based on position
- Adverse Selection: Order flow toxicity detection with VPIN
- Optimal Pricing: Stochastic control theory for spread optimization
- Risk Management: Circuit breakers, drawdown limits, and position controls
- Multi-Asset: Correlation-aware portfolio risk management
Features
Strategy Models
- Avellaneda-Stoikov: Classic optimal market making with reservation price
- GLFT Extension: Guéant-Lehalle-Fernandez-Tapia with terminal penalties
- Grid Trading: Multi-level order placement with geometric/arithmetic spacing
- Adaptive Spread: Dynamic spread adjustment based on order book imbalance
- Depth-Based Offering: Size adjustment based on market depth
Risk Management
- Position Limits: Maximum inventory size controls
- Notional Limits: Maximum value at risk
- Circuit Breakers: Automatic trading halts on adverse conditions
- Drawdown Tracking: Peak-to-trough monitoring with configurable limits
- Alert System: Configurable alerts for critical events
- Portfolio Risk: Correlation matrix and multi-asset VaR
Analytics
- Order Flow Analysis: Trade flow imbalance and toxicity metrics
- VPIN Calculator: Volume-synchronized probability of informed trading
- Order Intensity Estimation: Fill rate modeling for parameter calibration
- Live Metrics: Real-time operational metrics with atomic counters
- Prometheus Export: Optional metrics export with Grafana dashboard
Backtesting
- Event-Driven Engine: Tick-by-tick simulation
- Fill Models: Immediate, queue position, probabilistic, market impact
- Performance Metrics: Sharpe, Sortino, Calmar, max drawdown, profit factor
- Slippage Models: Fixed, percentage, volatility-based
Execution
- Exchange Connector Trait: Abstract interface for any exchange
- Order Manager: Order lifecycle management with state tracking
- Latency Tracking: Histogram-based latency measurement
- Mock Connector: Testing without real exchange connectivity
Parameter Calibration
- Risk Aversion (γ): Calibration from inventory half-life
- Order Intensity (k): Estimation from historical fill rates
- Volatility Regimes: Automatic detection and parameter adjustment
The Avellaneda-Stoikov Model
The Avellaneda-Stoikov model (2008) solves the optimal market making problem using stochastic control theory. Key formulas:
Reservation Price
r = s - q × γ × σ² × (T - t)
Optimal Spread
spread = γ × σ² × (T - t) + (2/γ) × ln(1 + γ/k)
Where:
s: Mid priceq: Current inventoryγ: Risk aversion parameterσ: VolatilityT - t: Time remainingk: Order arrival intensity
Modules
- [
strategy]: Quote generation algorithms (A-S, GLFT, Grid, Adaptive) - [
position]: Inventory tracking and PnL management - [
market_state]: Market data and volatility estimation - [
risk]: Limits, circuit breakers, alerts, and portfolio risk - [
analytics]: Order flow, VPIN, intensity estimation, live metrics - [
execution]: Exchange connectivity, order management, latency tracking - [
backtest]: Historical simulation with fill models and metrics - [
types]: Common types, decimals, and error definitions - [
prelude]: Convenient re-exports of commonly used types
Quick Start
use *;
// Calculate optimal quotes using Avellaneda-Stoikov
let mid_price = dec!;
let inventory = dec!;
let risk_aversion = dec!; // γ
let volatility = dec!;
let time_to_terminal_ms = 3600_000; // 1 hour
let order_intensity = dec!; // k
let = calculate_optimal_quotes.unwrap;
println!;
Feature Flags
prometheus: Enable Prometheus metrics export (addsprometheus,hyper,tokiodependencies)serde: Enable serialization/deserialization for all types (enabled by default)
Examples
Risk Management
use *;
// Set up position limits
let limits = new.unwrap;
// Check if order is allowed
let allowed = limits.check_order.unwrap;
// Circuit breaker for automatic trading halts
let config = new.unwrap;
let breaker = new;
Backtesting
use *;
// Configure backtest
let config = default
.with_initial_capital
.with_fee_rate
.with_slippage;
// Run backtest with your strategy
let mut engine = new;
let result = engine.run;
println!;
println!;
println!;
Portfolio Risk
use *;
use dec;
// Create correlation matrix
let btc = new;
let eth = new;
let mut matrix = new;
matrix.set_correlation.unwrap;
// Calculate portfolio risk
let mut portfolio = new;
portfolio.set_position;
portfolio.set_position;
let calculator = new;
let vol = calculator.portfolio_volatility.unwrap;
🛠 Makefile Commands
This project includes a Makefile with common tasks to simplify development. Here's a list of useful commands:
🔧 Build & Run
🧪 Test & Quality
📦 Packaging & Docs
📈 Coverage & Benchmarks
🧪 Git & Workflow Helpers
🤖 GitHub Actions (via act)
ℹ️ Requires act for local workflow simulation and cargo-tarpaulin for coverage.
Contribution and Contact
We welcome contributions to this project! If you would like to contribute, please follow these steps:
- Fork the repository.
- Create a new branch for your feature or bug fix.
- Make your changes and ensure that the project still builds and all tests pass.
- Commit your changes and push your branch to your forked repository.
- Submit a pull request to the main repository.
If you have any questions, issues, or would like to provide feedback, please feel free to contact the project maintainer:
Contact Information
- Author: Joaquín Béjar García
- Email: jb@taunais.com
- Telegram: @joaquin_bejar
- Repository: https://github.com/joaquinbejar/market-maker-rs
- Documentation: https://docs.rs/market-maker-rs
We appreciate your interest and look forward to your contributions!
License: MIT