NautilusTrader 2.0.0rc7
Released on 15th October 2026 (UTC).
Note
This release removes support for Python 3.12 and supports Python 3.13 and 3.14 (#4676).
Enhancements
- Added negative price support for futures, except inverse futures (#5190), thanks @DeLuke84
- Added
Clock.set_timer_zonedandCalendarSchedulefor local calendar recurrence, thanks @faysou - Added
time_bars_time_zoneandtime_zoneoverrides for local calendar bars, thanks @faysou - Added
BacktestDataConfig.batch_deltasfor batched book delta replay (#5215), thanks for reporting @nicezic - Added candidate option IDs for supported CME Globex and OSI equity/index contracts, thanks @faysou
- Added reference instruments to
OptionSeriesIdwith compatible derived-reference serialization, thanks @faysou - Added
OptionSideFilterandStrikeSearchProfilemodel types for option selection, thanks @faysou - Added tick scheme registration, thanks @faysou
- Added WebSocket peer-close callbacks to control automatic reconnection
- Added Rust
QuoteTick::has_same_bid_askto compare prices and sizes independently of instrument IDs and timestamps - Added
YieldCurvecustom data for catalog storage and backtest replay, including Python, thanks @faysou - Added
HttpClientbuilderredact_urlto omit the request origin from client-added diagnostics - Added Bybit public liquidation custom data for linear and inverse contracts (#5152), thanks @Martingale42
- Added Databento live bars, book depth, statistics, and imbalance subscriptions (#5201), thanks @faysou
- Added Derive adapter support for API v3
- Added Derive order book recovery for missing and stale snapshots
- Added Interactive Brokers subscription idle events (#5041), thanks @faysou
- Added Kraken Spot L2 checksum validation and resync on mismatch (#5219), thanks @zhaow-de
- Added Lighter native transaction batching with automatic splitting for order lists and batch operations
- Added Lighter native OTO, OCO, and OTOCO order groups with normalized Nautilus relationships
Breaking Changes
- Removed
HttpClient::request_with_url_redacted; userequestwith builderredact_url(true) - Removed
HttpClient::request_with_params_url_redacted; userequest_with_paramswith builderredact_url(true) - Removed
TickSchemeError::TickNotFinite; remove this arm from tick error matches - Removed Interactive Brokers connection wrappers; use
ibapi::Client(#5041), thanks @faysou - Removed Interactive Brokers
ErrorCategoryandInteractiveBrokersErrorKindexports (#5041), thanks @faysou - Removed Polymarket 30-second TWAP support; use
window_seconds=60(#5296) - Renamed
YieldCurveDatatoYieldCurve - Renamed Polymarket reference-price types to drop
Rtds, without aliases (#5296) - Renamed Polymarket
base_url_rtdstobase_url_reference_prices(#5296) - Replaced Interactive Brokers symbology functions with
Symbologymethods (#5041), thanks @faysou - Changed
BacktestNodeto batch book deltas by default, so fills can differ; setbatch_deltas=Falseto opt out - Changed batched
BacktestNodereplay to reject deltas without a closingF_LAST;batch_deltas=Falseopts out - Changed
VirtualTimer/LiveTimer:interval_ns->interval: TimerInterval; matchTimerInterval::Fixed - Changed
DataEngineConfig/LiveDataEngineConfig: addtime_bars_time_zone; useNonefor UTC alignment - Changed
TimeBarAggregator::newto requirejiff::tz::TimeZone; passTimeZone::UTCfor UTC bars - Changed
Orderto requirenon_reopened_voided_qty(#5133), thanks @abhijeetvichare76 - Changed
ReconciliationResultliterals; add emptyorder_only_fill_keys(#5114), thanks @zhaow-de - Changed
PortfolioGreeks::from(GreeksData)to apply the contract multiplier - Changed
GreeksData::new,PortfolioGreeks::new, andYieldCurve::newto takets_eventandts_initlast - Changed calculated Greeks topics to
data.GreeksData.underlying={underlying}.instrument_id={instrument_id} - Changed
GreeksCalculator::subscribe_greeksto match underlying symbols exactly; pass"*", not"", for all - Changed
register_custom_data_classto raiseValueErrorfor another class using a PyO3 Rust type's name - Changed
OptionSeriesId::newto require a reference instrument; usenew_derivedto derive it - Changed
OptionSeriesId::from_expiryandfrom_expiry_ns; passNoneas the final argument to derive a reference - Changed
OptionSeriesId::from_crypto_optionand struct literals to requireunderlying_instrument_id - Changed
OptionSeriesIdequality, hashing, and ordering to include the reference instrument - Changed
OptionSeriesIdstrings with fractional expiries, including topics and handler IDs, to retain nanoseconds - Changed
OptionSeriesIdto reject empty or whitespace-only underlying symbols when deriving a reference - Changed
FixedTickScheme::newto acceptPrice; usePrice::from("0.05")instead of a float - Changed
FixedTickSchemeRounder::newto acceptPrice; usePrice::from("0.05")instead of a float - Changed
TickSchemeError::TickNotPositive.ticktoPriceand added variants; update exhaustive matches - Changed fixed tick navigation to return
Nonefor incompatible precision; choose one that represents the tick - Changed Deribit position
leveragetoOption<Decimal>(#5240), thanks @abhijeetvichare76 - Changed
DeriveDataClientConfig:book_snapshot_timeout_secs/book_stale_threshold_secsor..Default::default() - Changed
DeriveWsMessageto includeBookSubscription; update exhaustive matches - Changed Interactive Brokers contract and security filters to reject unknown values (#5041), thanks @faysou
- Changed Interactive Brokers provider loaders; use
load_with_return_async(#5041), thanks @faysou - Changed
KrakenDataClientConfigliterals; addvalidate_l2_checksum: true(#5219), thanks @zhaow-de - Changed Kraken futures edit request literals; add
qty_mode: None(#5314), thanks @zhaow-de - Changed
OKXAmendAlgoOrderRequestliterals to requirenew_trigger_px_type; useNoneto omit it - Changed Polymarket reference prices to PolyBolt; configure CLOB L2 credentials (#5296), thanks @yashwardhan-gautam
- Changed Polymarket crypto reference symbols to lowercase USD pairs such as
btcusd(#5296) - Changed Polymarket reference prices to exact decimals with
source; equity dropsfull_accuracy_value(#5296)
Security
- Fixed provider text and URL secret exposure in client diagnostics, thanks for reporting @Strategizm
- Fixed Interactive Brokers gateway passwords appearing in debug and serialized output (#5041), thanks @faysou
- Fixed Kraken Spot L3 malformed WebSocket messages aborting the process (#5319), thanks @zifulifufu
Fixes
- Fixed non-reopened voided quantity returning to working leaves after updates (#5133), thanks @abhijeetvichare76
- Fixed maker/taker commission sign at negative prices
- Fixed Python indicator constructors aborting the process on invalid periods or oversized capacities
- Fixed cached custom currencies and their dependents missing after Redis restart (#5195), thanks @zhaow-de
- Fixed cache open-order queries retaining submitted orders after cancel or modify rejections
- Fixed instrument purging hiding order and position history and breaking PnL queries (#5304), thanks @imbolc
- Fixed Parquet catalog row order for equal
ts_inittimestamps (#5267), thanks @ragen1337 - Fixed streaming Parquet promotion of
OrderBookDelta.clear()snapshots (#5268), thanks for reporting @hellow-star - Fixed monthly time bars drifting after a clamped month-end origin offset
- Fixed queued time-bar callbacks affecting aggregation after a stop or restart
- Fixed released emulated orders sending stale order initialization (#5169), thanks @jrile018
- Fixed cancel rejection delivery for active orders while preserving their state (#5270), thanks @riven314
- Fixed late modify rejection delivery for submitted orders without reverting amended terms
- Fixed reconciliation rejecting fills on a pending order when a
Filledreport exceeds its quantity - Fixed replacement reconciliation losing native fill IDs and duplicating inferred fills
- Fixed reconciliation losing fills for orders spanning a flat position boundary (#5114), thanks @zhaow-de
- Fixed simulated OTO releases reviving children canceled earlier in the same callback
- Fixed simulated reduce-only quote-quantity stops converting their resized quantity again
- Fixed simulated released bracket exits canceled with partially filled entries (#5159), thanks @abhijeetvichare76
- Fixed simulated bracket exits rejected as reduce-only before entry fills reached the cache (#5248), thanks @awss1i
- Fixed trailing stop prices falling between price increments (#5241), thanks @abhijeetvichare76
- Fixed duplicate account states and incorrect locked margins during funding settlements (#5249), thanks @XBeg9
- Fixed
RiskEnginenotional limits for negative prices - Fixed
RiskEnginefree balance checks omitting unacknowledged orders (#5184), thanks @ngarid - Fixed calculated margin equity omitting option value (#5252), thanks for reporting @abhijeetvichare76
- Fixed
GreeksCalculatorunderlying resolution across venues (#5234), thanks @awss1i - Fixed portfolio Greeks omitting multipliers before filtering and aggregation, including futures
- Fixed portfolio Greeks panics when calculations, subscribers, or filters write to the cache
- Fixed missing Python Greeks conversion, scalar-left multiplication, and portfolio addition
- Fixed position report
ts_closednanosecond precision with open rows (#5301), thanks @bfs2021 - Fixed
BacktestNodestreaming runs leaving the engine running after a data load failure - Fixed Binance Spot quote-sized market orders remaining open after full execution
- Fixed Bybit stale WebSocket subscriptions blocking subscriptions after reconnect (#5250), thanks @Martingale42
- Fixed Bybit failed quote subscriptions retaining shared order book references (#5258), thanks @Martingale42
- Fixed Bybit incomplete position reports causing held positions to reconcile as flat
- Fixed Bybit option quotes repeating when only timestamps change
- Fixed Databento data client intraday requests failing to resolve price precision
- Fixed Deribit position reports failing on fractional leverage (#5240), thanks @abhijeetvichare76
- Fixed Deribit duplicate fills from order responses and user trade subscriptions
- Fixed Derive accepting null or empty order book prices and amounts as zero
- Fixed Derive fill history marked complete when trades lack trade or venue order IDs
- Fixed dYdX quotes repeating when only timestamps change
- Fixed Hyperliquid HIP-4 outcome price and size precision (#5266), thanks @vignesh-chaturvedi
- Fixed Hyperliquid place and modify requests retaining trailing zeros in signed order values
- Fixed Hyperliquid cancel actions to omit explicit
fast: Some(false)flags - Fixed Hyperliquid account updates retaining balances reported at zero (#5210), thanks @XBeg9
- Fixed Hyperliquid reduce-only filled order lookups overstating fill quantity (#5222), thanks @XBeg9
- Fixed Hyperliquid canceled replacements leaving orders open when acceptance updates are missing
- Fixed Hyperliquid recovery sending corrective reductions for canceled replacement orders
- Fixed Hyperliquid stop-market replacement updates causing order-state panics
- Fixed Hyperliquid order closure after partial-fill rejections
- Fixed Hyperliquid dropping late fill reports after orders close
- Fixed Interactive Brokers order ID reuse after completed orders (#5284), thanks @honvl
- Fixed Interactive Brokers account balances and margins remaining stale after connect (#5041), thanks @faysou
- Fixed Interactive Brokers execution queries replaying historical fills as live fills (#5041), thanks @faysou
- Fixed Interactive Brokers spread fills arriving before their leg fills (#5041), thanks @faysou
- Fixed Interactive Brokers invalid single orders staying initialized (#5274), thanks @faysou
- Fixed Interactive Brokers order tags overriding tracked order fields and sides (#5274), thanks @faysou
- Fixed Interactive Brokers quote-sized order validation after applying tags (#5274), thanks @faysou
- Fixed Interactive Brokers duplicate position reports inflating startup quantities (#5274), thanks @faysou
- Fixed Interactive Brokers entry price recovery across flat crossings and combo fills (#5274), thanks @faysou
- Fixed Interactive Brokers connecting with order IDs above the client partition (#5306), thanks @honvl
- Fixed Kraken spot and futures wallets retaining balances reported at zero (#5186), thanks @zhaow-de
- Fixed Kraken futures margin currencies, aggregation, and maintenance requirements (#5199), thanks @zhaow-de
- Fixed Kraken spot order lookups failing on unrelated pairs (#5295), thanks @zhaow-de
- Fixed Kraken futures reads silently omitting unresolved live orders and positions (#5217), thanks @zhaow-de
- Fixed Kraken spot and futures reads silently omitting unparsable open orders (#5295), thanks @zhaow-de
- Fixed Kraken futures order-history parsing and filled-order pricing (#5247), thanks @zhaow-de
- Fixed Kraken futures status reports restoring full client order IDs (#5293), thanks @zhaow-de
- Fixed Kraken futures startup reconciliation omitting order history (#5114), thanks @zhaow-de
- Fixed Kraken futures quotes repeating when only timestamps change
- Fixed Kraken futures quotes using stale books when joining an existing order book subscription
- Fixed Kraken futures edits increasing partially filled orders by their filled quantity (#5314), thanks @zhaow-de
- Fixed Kraken spot reports using fill prices as limit prices (#5315), thanks @zhaow-de
- Fixed Kraken spot and futures lookups reporting absent orders from partial reads (#5311), thanks @zhaow-de
- Fixed Lighter transaction nonce send ordering under concurrent preparation
- Fixed Lighter
CancelAllOrdersto select cached orders only from the execution account - Fixed Lighter batch cancel outcome recovery and overlapping cancellation rejection handling
- Fixed Lighter single and batch modify failures remaining pending after admission
- Fixed Lighter fills and order updates preceding modification confirmation
- Fixed Lighter duplicate fill reports across HTTP history pages
- Fixed OKX conditional order amendments dropping prices (#5275), thanks for reporting @ProfitChef
- Fixed Polymarket modify canceling a working order when the signed replacement is below the market minimum
- Fixed Polymarket recovered BUY overfills being rejected instead of raising order quantity
- Fixed Polymarket free balance treating BUY fill spend as available before the venue collateral total reflects it
- Fixed Polymarket bounded restarts marking cached closed orders as incomplete
- Fixed Polymarket bounded restarts omitting confirmed partial fills from resting orders
- Fixed Polymarket execution disconnect overrunning the node disconnect timeout with an in-flight cancel
- Fixed Sandbox cached quote and trade replay replenishing consumed liquidity on order submissions
Internal Improvements
- Added
BacktestNodebook delta replay benchmark comparing batched and individual dispatch - Migrated OKX built-in WebSocket URLs to port 443 for live and demo environments
- Ported the Interactive Brokers adapter to the
ibapiv5.0.0 API (#5041), thanks @faysou - Improved Kraken margin entry average and net-short test coverage (#5214), thanks @zhaow-de
- Improved Lighter report generation with HTTP collection on runtime workers (#5216)
- Improved Lighter execution race coverage and grouped-order signer validation
- Refined backtest replay with shared ordered batch consumption, thanks @faysou
- Refined shared pointer cloning in data, infrastructure, CLI, and event store code (#5236, #5289), thanks @mirooon
- Refined shared pointer cloning in network clients and transports (#5294), thanks @mirooon
- Refined Hyperliquid unified account tests to use JSON fixtures (#5220), thanks @XBeg9
- Optimized core string formatting, precision parsing, and API key masking allocations (#5225), thanks @sunlei
- Optimized hexadecimal encoding and decoding (#5227), thanks @sunlei
- Optimized
UUID4byte conversion (#5230), thanks @sunlei - Optimized integer
UnixNanosparsing (#5228), thanks @sunlei - Optimized core UTC timestamp formatting (#5226), thanks @sunlei
- Optimized JSON decimal deserialization to avoid temporary string allocations (#5229), thanks @sunlei
- Optimized backtest funding settlements to update positions in place (#5238), thanks @XBeg9
- Optimized portfolio snapshots to skip copying account event history (#5237), thanks @XBeg9
- Optimized Python
Portfolioqueries to avoid copying account event history (#5260), thanks @XBeg9 - Optimized dYdX order book delta processing
- Upgraded Rust (MSRV) to 1.99.0
- Upgraded Socket CLI tool to v1.5.0
- Upgraded
cargo-hawktool to v0.1.15 - Upgraded
cargo-nextesttool to v0.9.148 - Upgraded
prektool to v0.5.5 - Upgraded
uvtool and pre-commit hook to v0.12.24 - Upgraded
typospre-commit hook to v1.51.1 - Upgraded
databentocrate to v0.63.0 - Upgraded
datafusioncrate to v55.2.0 - Upgraded
eithercrate to v1.19.0 - Upgraded
h2crate to v0.4.20 - Upgraded
hypercrate to v1.12.0 - Upgraded
hyper-utilcrate to v0.1.21 - Upgraded
ibapicrate to v5.0.0 - Upgraded
implied-volcrate to v2.1.0 - Upgraded
jiffcrate to v0.2.38 - Upgraded
libccrate to v0.2.190 - Upgraded
pyo3crates to v0.29.3 - Upgraded
rustlscrate to v0.23.46 (fixes RUSTSEC-2026-0346 through RUSTSEC-2026-0349) - Upgraded
tokiocrate to v1.53.2 - Upgraded
tokio-rustlscrate to v0.26.6 - Upgraded
tokio-utilcrate to v0.7.20 - Upgraded
uuidcrate to v1.27.0 - Upgraded
zeroizecrate to v1.9.1 - Upgraded
ruffpackage (dev) and pre-commit hook to v0.16.10 - Upgraded
simplejsonpackage (visualization) to v4.2.0 - Upgraded
typackage (dev) to v0.0.84 - Upgraded
uvicornpackage (test) to v0.54.0 - Upgraded
uvlooppackage (test) to v0.23.0
Documentation Updates
- Fixed Binance and Hyperliquid custom data examples to unwrap
CustomData(#5246), thanks @Martingale42 - Fixed Hyperliquid all-DEX example to unwrap
CustomDataand read dictionary entries (#5307), thanks @Martingale42 - Updated Derive integration guide for API v3 setup, margin models, and recovery limits
- Clarified
Portfolioequity rules for calculated and reported margin accounts - Clarified Hyperliquid modify replacement rules and individual batch results
- Clarified Kraken cached and external closing-order recovery (#5208), thanks @zhaow-de
- Clarified Lighter cancel-all scope and batch cancellation failure handling
- Clarified Lighter contingent order mappings, execution ordering, and venue limits
- Documented Polymarket PolyBolt reference prices and the RTDS migration (#5296)
Deprecations
Artifact checksums
SHA256 checksums are attached as SHA256SUMS, per-asset .sha256 files, and dist-manifest.json.
| Artifact | SHA256 |
|---|---|
| nautilus_trader-2.0.0rc7-cp313-cp313-macosx_11_0_arm64.whl | e2a4d072fd21108c2aa8939f517f6bb525011f204d3516046e927effb1aeb21e |
| nautilus_trader-2.0.0rc7-cp313-cp313-manylinux_2_34_aarch64.whl | c232d1a9ce9715c3bbac346b4d18ed852abc804db863bf9c2086d8a6f7a5a392 |
| nautilus_trader-2.0.0rc7-cp313-cp313-manylinux_2_34_x86_64.whl | b3928f37d75d57508030a421dc762186ad1f9ffc5d5420d7daf1d2c6badb8044 |
| nautilus_trader-2.0.0rc7-cp313-cp313-win_amd64.whl | f12dc54e9bb760bcc6f20d1780582a02664ae539b9f12337ddc444c0547d9aeb |
| nautilus_trader-2.0.0rc7-cp314-cp314-macosx_11_0_arm64.whl | 91e179f4bd49680a5fbbb88c92eae84018918ca37c5a3bf41e6fac17c7306d46 |
| nautilus_trader-2.0.0rc7-cp314-cp314-manylinux_2_34_aarch64.whl | ccbbc9265d9f4deeb5fecb241e46f3a085f82eac4bfc47d20e49c05d13ace73f |
| nautilus_trader-2.0.0rc7-cp314-cp314-manylinux_2_34_x86_64.whl | aa5b222fb449f624804cd2606c7814b62cb3bfc9d772ec7b5e726f1c34bfe10a |
| nautilus_trader-2.0.0rc7-cp314-cp314-win_amd64.whl | 079a8f195e024274d86f380993f492e071c386ddb089c0e8905c71690a27429d |
| nautilus_trader-2.0.0rc7.tar.gz | 4e4ec408fb4860d75685e6d071cdf27aed3c5a22ca303110872b764a8a3e768c |
Verify provenance
After downloading an artifact, verify its GitHub artifact attestation:
gh attestation verify <artifact> \
--repo nautechsystems/nautilus_trader \
--cert-identity "https://github.com/nautechsystems/nautilus_trader/.github/workflows/build.yml@refs/heads/master" \
--cert-oidc-issuer https://token.actions.githubusercontent.com