This release adds support for Python 3.14 with the following limitations:
dYdX adapter extras ([dydx]) unavailable due to upstream coincurve compatibility (available on Python 3.12-3.13)
Interactive Brokers adapter extras ([ib]) unavailable due to upstream nautilus-ibapi compatibility (available on Python 3.12-3.13)
Enhancements
Added support for Python 3.14
Added Kraken integration adapter
Added Cap'n Proto (capnp) serialization for efficient zero-copy data interchange (opt-in via capnp feature flag in nautilus-serialization crate)
Added initial backtest visualization tearsheets with plotly
Added matching engine liquidity_consumption config option to track per-level consumption and prevent overfilling displayed book liquidity (default False to retain current behavior)
Added matching engine trade consumption tracking (when and ) to prevent multiple orders matching the same trade tick from collectively overfilling
liquidity_consumption=True
trade_execution=True
Added theme support to bars_with_fills chart (#3329), thanks @faysou
Added price protection support for market orders (#3065), thanks @Antifrajz
Added Polymarket Gamma API support for instrument loading (#3141), thanks @DeirhX
Added OKX historical trades requests
Added Tardis book_snapshot_output config option for tardis machine replays (default deltas to retain current behavior)
Added allow_overfills config option to ExecEngineConfig (default False) to handle order fills exceeding order quantity with warning instead of raising
Added overfill_qty field to orders for tracking fill quantities exceeding original order quantity
Introduced PositionAdjusted events for tracking quantity/PnL changes outside normal order fills (base currency commissions, funding payments, manual adjustments)
Upgraded continuous reconciliation for execution engine using position reports to detect missed fills
Breaking Changes
Dropped support for Python 3.11
Removed prob_fill_on_stop parameter from FillModel and FillModelConfig (stop orders have no queue position to simulate as triggers are deterministic when price reaches the trigger level)
Removed use_ws_trade_api config option from Bybit execution client (using WebSocket trade API only)
Renamed parse_instrument to parse_polymarket_instrument in Polymarket adapter for clarity
Renamed ExecTesterConfig.enable_buys to enable_limit_buys
Renamed ExecTesterConfig.enable_sells to enable_limit_sells
Changed ParquetDataCatalog.register_data to now treat files=[] as registering no files; pass files=None (default) to include all files
Standardized data catalog directory naming: Order book data directory names now use plural forms to align with the Rust catalog and Tardis Machine conventions; this ensures data written by the Python StreamingFeatherWriter can be read by the Rust catalog
order_book_delta/ → order_book_deltas/
order_book_depth10/ → order_book_depths/
Migration: Rename existing data directories to use plural forms:
# If you have existing order book data, rename the directories:
mv <your_data_path>/order_book_delta <your_data_path>/order_book_deltas
mv <your_data_path>/order_book_depth10 <your_data_path>/order_book_depths
Security
Added osv-scanner for Python dependency vulnerability scanning in pre-commit
Added cargo-vet for Rust supply chain security auditing
Hardened unsafe code with runtime checks and #![deny(unsafe_op_in_unsafe_fn)] lint
Hardened datetime conversions with overflow protection
Hardened CI workflows by pinning Docker images to SHA digests
Improved actor/component registry safety with ActorRef guards and runtime borrow tracking
Fixed code scanning security alerts
Fixes
Fixed uint64_t truncation bug in determine_trade_fill_qty for trade execution with high-precision mode
Fixed stop market order fill price in L1_MBP mode
Fixed cache dropped same-timestamp market data on insert
Fixed race condition in InstrumentProvider causing duplicate instrument initialization in shared providers
Fixed portfolio statistics various bugs and edge cases
Fixed SyntheticInstrument formula error during parsing with hyphened InstrumentId (#3257), thanks @Javdu10
Fixed balance recalculation to use raw fixed-point (#3356), thanks @kirill-gr1
Fixed matching engine GTD order expiry key mismatch (#3272), thanks for reporting @linimin
Fixed matching engine order modification for partial fills
Fixed matching engine L2/L3 partial fill quantity calculation on subsequent book updates
Fixed NETTING position flip snapshots and cache index cleanup (#3081), thanks @SarunasSS
Fixed incorrect handling of data responses in msgbus (#3310), thanks @filipmacek
Fixed data engine to use separate aggregators for historical data (#3326), thanks @faysou
Fixed bar execution generating fractional fill quantities (#3352), thanks @Johnkhk
Fixed BacktestResult.total_positions to match tearsheet count (#3148), thanks for reporting @2-5
Fixed risk engine negative price handling for spread instruments (#3136), thanks for reporting @q351941406
Fixed risk engine trailing stop order risk validations (#3160), thanks for reporting @GianC0
Fixed risk engine balance checks for cash borrowing
Fixed risk engine balance checks for position-reducing SELL orders (#3256), thanks for reporting @GianC0
Fixed spawned order client_id caching in ExecAlgorithm (#3122), thanks for reporting @kirill-gr1
Fixed parse_dates parameter in CSV loaders (#3132), thanks @maomao9-0
Fixed GreeksCalculator handling of missing price data (#3116), thanks for reporting @q351941406
Fixed StreamingFeatherWriter_setup_streaming with replace_existing config (#3234), thanks @cauta
Fixed conversion of streamed instruments to catalog (#3235), thanks @faysou
Fixed active liquidity calculation Pool profiler simulation (#3165), thanks @filipmacek
Fixed duplicate on_instrument callback in request flow for Python adapters (#3323), thanks @filipmacek
Fixed Redis index key parsing with use_instance_id
Fixed Betfair datetime encoding error in order status reports
Fixed Betfair login race condition during concurrent connections
Fixed Betfair parsing errors for undocumented codes
Fixed Betfair duplicate fills on startup/reconnect
Fixed Binance instrument info dict JSON serialization (#3128), thanks for reporting @woung717
Fixed Binance ADL orders with TRADE execution type
Fixed Binance Futures Algo Order API for conditional orders (#3287), thanks for reporting @KaizynX
Fixed Bybit historical bars requests partial (unclosed) bar filtering
Fixed Bybit WebSocket bars to respect timestamp_on_close config
Fixed BybitHttpClient type stub pyi signatures (#3238), thanks @sunlei
Fixed Databento historical client to support consolidated schemas (cmbp-1, cbbo-1s, cbbo-1m) in quote requests
Fixed Databento MBO data decoding when PRICE_UNDEF appears with non-zero precision
Fixed Databento Arrow serialization for PRICE_UNDEF (#3183), thanks for reporting @marloncalvo
Fixed Databento quote decoding with undefined bid/ask prices
Fixed Interactive Brokers quote tick subscriptions to use tick-by-tick data (#3135), thanks for reporting @genliusrocks
Fixed Interactive Brokers serialization of IBContractDetails (#3181), thanks @faysou
Fixed Interactive Brokers parsing of invalid prices (#3246), thanks @faysou
Fixed OKX pre-open instrument parsing and standardize enum usage (#3134), thanks for reporting @3wtz
Fixed OKX request_bars pagination halting prematurely in Range mode (#3145), thanks for reporting @3wtz
Fixed OKX request_bars pagination using correct backwards API semantics (#3145), thanks for reporting @3wtz
Fixed OKX FOK/IOC order type preservation across parsers (#3182), thanks @CuBeof
Improved trade execution matching with transient bid/ask override for trade_execution=True mode, ensuring limit orders fill correctly when trades occur at the limit price
Improved Stochastics indicator with additional parameters (#3296), thanks @mahmutf
Improved None handling in equality and comparison methods
Improved Actor.request_bars to enforce standard bar types (#3216), thanks @faysou