The Problem
Quantitative traders need a single code‑base that can back‑test strategies on historic market data and run them live without rewriting logic. Existing stacks force separate back‑tester and execution engines, leading to drift between simulation and production results.
What This Does
nautilus_trader delivers a Rust‑centric, event‑driven engine with a Python front‑end. Core trading logic lives in the crates/ workspace (≈1 560 Rust source files) while the python/ package supplies a thin, idiomatic API for strategy authors.
Key entry points are in crates/adapters/architect_ax:
crates/adapters/architect_ax/bin/http_public.rs–mainstarts the HTTP server that exposes the public API.crates/adapters/architect_ax/src/data.rs–startboots the internal data pipelines.
Adapters for major venues (Binance, Bybit, BitMEX, etc.) live under crates/adapters/… and implement SBE codecs (e.g. exchange_info_response_codec.rs) that marshal binary messages to Rust structs.
How It Is Wired
- Process start –
maininhttp_public.rs(line 32) is the only top‑level entry point. It creates anAxEnvironmentviafrom_env, which reads secrets (Secrets::from_env()) – the sole outbound cryptographic operation.
- Environment bootstrap –
from_envpulls configuration from.env.example(API keys, URLs). The environment is then passed to the HTTP client (crates/adapters/architect_ax/src/http/client.rs), which owns the only network‑calling code (e.g.,base_url,cancel_all_requests).
- Message flow – Incoming HTTP requests are dispatched to handlers in
crates/adapters/architect_ax/src/websocket/…. The most‑used functions across the codebase are:from_str– 259 call sitesget_buf,get_buf_mut,set_limit– each >200 call sites (used by every SBE codec)
These buffer utilities form a hub: any change to their signature ripples through >600 functions, so they carry the widest blast radius.
- Adapter codecs – The Binance SBE codecs (e.g.,
exchange_info_response_codec.rs,new_order_full_response_codec.rs) each definewrap,encoded_length,get_buf_mut, etc. They are called from 5–36 other files and collectively account for >1 200 function definitions.
- External effects – Apart from the initial secret load, the only outbound calls are: HTTP client requests (network) File reads/writes (e.g., loading test JSON via
load_test_json) – 2 functions * Cryptographic secret handling – 7 functions
No database access is visible in the static graph; persistence is likely delegated to external services not compiled into the repo.
- Cycle / hub analysis – The call graph shows dense inter‑connections around the buffer utilities and SBE codec wrappers, but no obvious cycles. The concentration around
from_strand buffer helpers suggests any refactor there will require extensive test coverage.
How To Use It
# Clone the repo
git clone https://github.com/moses-y/nautilus_trader
cd nautilus_trader
# Build the Rust workspace (requires Rust 1.92)
cargo build --release
# Optional: run the Docker environment (DockerfileUbuntu + compose)
docker compose -f .docker/docker-compose.yml up --build
# Set required env vars (copy template)
cp .env.example .env
# edit .env with API keys, URLs, etc.
# Start the HTTP server (the documented entry point)
cargo run --bin http_public --manifest-path crates/adapters/architect_ax/Cargo.toml
The Python package can be installed from the python/ directory with pip install . after the Rust wheels are built (see github/actions/publish-wheels workflow for the exact build steps).
Real‑World Use
A quant writes a strategy in Python, imports nautilus_trader, and registers callbacks with the HTTP API. The same code can be executed against a historical data feed by pointing the AxEnvironment to a file‑based data source, then switched to live trading by swapping the environment to use the Binance adapter. No code changes are required between back‑test and live runs.
Code Health & Issues
- Medium – Enable Dependabot – 38 manifests lack an automated update bot (
.github/dependabot.ymlmissing). - Medium – Dependency vulnerability gate – No scan in CI; add
dependency-review-actionorosv-scanner. - Medium – Large test assets –
tests/integration_tests/adapters/betfair/resources/responses/betting_list_market_catalogue.json(41 MB) should be moved to Git LFS or external storage. - Low – Workflow timeouts –
.github/workflows/build-docs.ymland three others lacktimeout-minutes, risking stalled runs.
All other hygiene checks (tests, CI, Dockerfile, license, lockfile) are present.
The Bottom Line
nautilus_trader offers a solid, high‑performance Rust engine with a Python façade, suitable for teams that need tight parity between simulation and production. The codebase is well‑structured but hinges on a few core utilities (from_str, buffer helpers) that are hot spots for change. Addressing the medium‑severity health items (dependency automation, large binaries) will improve maintainability for production deployments. Ideal for quant teams comfortable with Rust‑Python interop and looking for an open‑source, event‑driven trading stack.