Market Making RL - simulation, experiments, and CLI
Project description
Market Making RL Agent
Docs: https://Aviral1303.github.io/Market-Making-RL-Agent/
Why this is useful
- End-to-end, deployable research stack: config-driven envs, MLflow tracking, CLI, REST API with async jobs, and DuckDB persistence
- Microstructure features that matter: OU price dynamics with regime switching, probabilistic fills, fees/slippage, multi-asset correlation, depth-aware quoting, size decisions
- Baselines and RL: Naive, Inventory-aware, Avellaneda–Stoikov, PPO; hyperparameter search with Optuna
At a glance
Benchmarks (best-of grid)
60s Quickstart
pip install mmrl
mmrl backtest
mmrl evaluate # Naive vs Rule-Based vs A–S vs PPO
mmrl analyze strategy_comparison.csv --plot # analyze your returns file
Examples
- Backtest + HTML report in one go
mmrl backtest
mmrl report results/$(ls -t results | head -n 1) --out report.html
- Run grid search and visualize
mmrl grid
python3 analysis/plot_grid_heatmaps.py
- Compare agents (rule-based and PPO if rl extra installed)
mmrl evaluate
- Programmatic backtest
from mmrl import run_backtest
cfg = {"run_tag": "script", "seed": 7, "steps": 1000, "output_dir": "results",
"agent": {"spread": 0.1, "inventory_sensitivity": 0.05},
"market": {"ou_enabled": True, "ou": {"mu": 100, "kappa": 0.05, "sigma": 0.5, "dt": 1.0},
"vol_regime": {"enabled": True, "high_sigma_scale": 3.0, "switch_prob": 0.02}},
"execution": {"base_arrival_rate": 1.0, "alpha": 1.5},
"fees": {"fee_bps": 1.0, "slippage_bps": 2.0, "maker_bps": -0.5, "taker_bps": 1.0}}
run_dir, metrics = run_backtest(cfg)
print(run_dir, metrics)
- Plug in your own data (CSV example)
from env.simple_lob_env import SimpleLOBEnv
from mmrl.data import load_adapter
env = SimpleLOBEnv()
adapter = load_adapter('mmrl.data.csv_adapter:CSVAdapter', path='data/example.csv', mapping={'mid_price': 'mid', 'best_bid': 'bid', 'best_ask': 'ask'})
for tick in adapter.iter_ticks():
state = env.step_from_tick(tick)
Programmatic API (Python)
from mmrl import run_backtest
cfg = {
"run_tag": "demo", "seed": 42, "steps": 500, "output_dir": "results",
"agent": {"spread": 0.1, "inventory_sensitivity": 0.05},
"market": {"ou_enabled": True, "ou": {"mu": 100, "kappa": 0.05, "sigma": 0.5, "dt": 1.0},
"vol_regime": {"enabled": True, "high_sigma_scale": 3.0, "switch_prob": 0.02}},
"execution": {"base_arrival_rate": 1.0, "alpha": 1.5},
"fees": {"fee_bps": 1.0, "slippage_bps": 2.0, "maker_bps": -0.5, "taker_bps": 1.0}
}
run_dir, metrics = run_backtest(cfg)
print(run_dir, metrics)
From source:
pip install -r requirements.txt
Colab Notebooks
Multi-asset
- Configure under
multi_assetinconfigs/inventory.yaml - Run:
python3 experiments/evaluate_multi_asset.py
python3 analysis/plot_multi_asset.py results/.../multi_asset_history.csv
API
- Start stack:
docker compose up -d redis worker api mlflow
curl http://localhost:8000/health
curl http://localhost:8000/config/schema # config JSON schema
- Submit jobs:
curl -X POST http://localhost:8000/backtest -H 'Content-Type: application/json' -d '{"steps": 200}'
curl -X POST http://localhost:8000/grid -H 'Content-Type: application/json' -d '{"execution": {"alpha_grid": [1.0, 1.5]}}'
curl http://localhost:8000/trades/<run_id>?limit=100
curl http://localhost:8000/runs/<run_dir_name>/artifacts
curl -L -o run.zip http://localhost:8000/runs/<run_dir_name>/download
Hyperparameter Optimization
python3 experiments/hyperopt.py
Notable features
- Multi-asset Gym wrapper with per-asset, per-level actions (offsets + sizes)
- Depth-aware agent placing quotes at multiple levels with regime-conditioned parameters
- DuckDB persistence of runs/metrics/trades and a
/trades/{run_id}endpoint - MLflow logging of params, metrics, artifacts with run IDs written per run
- CLI extras:
mmrl fetch-data(CCXT sample),mmrl config-validate,mmrl config-schema
Roadmap
- Postgres-backed storage and public demo deployment
- Size-aware RL policy across multi-asset Gym env
- Notebooks + Colab badges for quick experimentation
Packaging
- Install from source or build wheel with
python -m build(requiresbuild). - Optional extras:
mmrl[api]for FastAPI stackmmrl[rl]for Gymnasium/SB3
Data utilities
- Fetch sample trades to Parquet:
python3 -m mmrl.cli fetch-data --exchange binance --symbol BTC/USDT --limit 1000 --out data/btcusdt.parquet
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
mmrl-0.1.5.tar.gz
(38.4 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
mmrl-0.1.5-py3-none-any.whl
(45.2 kB
view details)
File details
Details for the file mmrl-0.1.5.tar.gz.
File metadata
- Download URL: mmrl-0.1.5.tar.gz
- Upload date:
- Size: 38.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6561bdb06d7457084bed40a7193917677b5ad917c60a94c7c182580cc54708a7
|
|
| MD5 |
ea8f75668c9940c6d7bda95d23e01fbe
|
|
| BLAKE2b-256 |
4c7c51d04db2f9a23344ca4e0236f579f515e7ff7c2095464ce330753b01116d
|
File details
Details for the file mmrl-0.1.5-py3-none-any.whl.
File metadata
- Download URL: mmrl-0.1.5-py3-none-any.whl
- Upload date:
- Size: 45.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aef6102b7534eaf0227d063ed244c66233eb62f9e47c725139fd9a5cd408bb44
|
|
| MD5 |
324ea9fdec8baacd64627bc009e179a3
|
|
| BLAKE2b-256 |
149a3a1cd9ee7c3892bf39602a52db24a8ce2a92ceda6765027a03eb628e3ca5
|