
nautilus-tardis 適配器深度解析在 NautilusTrader 中接入 Tardis 標準化歷史與實時行情數據【免費下載鏈接】nautilus_traderProduction-grade Rust-native trading engine with deterministic event-driven architecture項目地址: https://gitcode.com/GitHub_Trending/na/nautilus_trader導讀nautilus-tardis是 NautilusTrader 交易引擎官方提供的 Tardis 數據集成適配器負責打通 Tardis 標準化的歷史與實時加密市場數據逐筆訂單簿、成交、資金費率、期權摘要、清算等與 NautilusTrader 的研究、回測與實盤節點。讀完本文你將掌握該適配器的功能矩陣、Cargo feature 開關、TardisDataClientConfig回放/實時雙模式配置、Tardis Machine 歷史回放產出 Parquet 數據目錄的完整流程以及 CSV 批量加載與流式讀取的實戰用法。本文以倉庫中的 適配器 README 為核心骨架結合 集成文檔 與 適配器源碼 逐層展開所有命令、配置與代碼示例均來自當前倉庫。適配器定位與能力概覽根據 crates/adapters/tardis/README.md 的定義nautilus-tardiscrate 提供與 Tardis API 的集成用于跨多個交易所訪問標準化normalized的歷史與實時市場數據。所謂標準化指 Tardis 將不同交易所的原始數據統一為一致的字段格式因此一套解析器即可處理任意受支持交易所的數據。NautilusTrader 本身是一個開源的、生產級、Rust 原生、面向多資產多交易所交易系統的引擎其顯著特點是研究、確定性仿真與實盤執行統一在一個事件驅動架構內實現研究到實盤research-to-live的語義一致性。Tardis 適配器正是連接外部高質量行情數據源與內部統一數據模型的關鍵一環其入口在 crates/adapters/tardis/src/lib.rspub mod common; pub mod config; pub mod csv; pub mod data; pub mod factories; pub mod http; pub mod machine; #[cfg(feature replay)] pub mod replay; #[cfg(feature python)] pub mod python;從模塊劃分可以清晰看出適配器的四類能力httpTardis HTTP 客戶端用于拉取交易所儀器元數據machineTardis Machine WebSocket 客戶端連接回放/實時標準化數據流csvTardis 格式 CSV 的加載與流式讀取datafactories面向 Nautilus 節點的數據客戶端與工廠replayfeature 門控Tardis Machine → Nautilus 數據 → Parquet 目錄的完整回放管線。Cargo feature flags按需裁剪編譯范圍README 明確列出了該 crate 提供的 feature flags用于按使用場景控制編譯期包含的源碼。結合 crates/adapters/tardis/Cargo.toml 的完整定義逐一說明如下Feature默認作用依賴關系摘自 Cargo.tomlreplay?啟用市場數據回放replay功能模塊replay.rsreplay []被extension-module、python間接依賴high-precision?啟用高精度模式使用 128 位值類型傳遞開啟nautilus-model/high-precision、nautilus-serialization/high-precisionexamples?啟用示例二進制與示例程序依賴nautilus-live/node供tardis-data-tester示例使用python?通過 PyO3 啟用 Python 綁定傳遞開啟nautilus-{common,core,live,model,serialization,system}/python、pyo3、pyo3-async-runtimes、pyo3-stub-gen并強制replayextension-module?構建為 Python 擴展模塊.so包含python及pyo3/extension-module并傳遞各依賴的extension-module其中default [replay, high-precision]表示純 Rust 場景下開箱即用即可支持回放與高精度數值。兩個細節值得注意python與extension-module都隱式攜帶replay因此在 Python 發行版中回放能力總是可用examples單獨開啟不會引入 Python 綁定它只依賴nautilus-live/node便于在純 Rust 下運行node_data_tester這類沙箱示例。對于只想讀取 Tardis CSV 而不需要回放的用戶可以通過--no-default-features關閉replay與high-precision以縮短編譯時間128 位精度類型也會增大編譯與運行開銷。支持的 Tardis 數據格式與 Nautilus 類型映射Tardis 提供多種標準化數據格式適配器將其映射為 Nautilus 數據模型。完整映射表見 集成文檔Tardis 格式Nautilus 數據類型book_changeOrderBookDeltasbook_snapshot_*OrderBookDepth10或OrderBookDeltas由配置決定quoteQuoteTickquote_10sQuoteTicktradeTradeTicktrade_bar_*Barderivative_tickerFundingRateUpdate、MarkPriceUpdate或IndexPriceUpdateoption_summaryOptionGreeks可選從 BBO 字段提取QuoteTickdisconnect忽略幾點使用要點均來自集成文檔Tardis 將quote視為book_snapshot_1_0ms的別名quote_10s視為book_snapshot_1_10s的別名單層快照統一解析為QuoteTick數據客戶端只在值發生變化時才對外發布derivative_ticker派生出的資金費率、標記價格與指數價格而目錄回放管線catalog replay不寫這三類更新適配器不解析Tardis 的book_ticker、liquidation、error格式。Bars 聚合區間映射Tardis 的trade_bar_*后綴會轉換為對應的 NautilusBarType聚合方式Tardis 后綴含義Nautilus 聚合ms毫秒MILLISECONDs秒SECONDm分鐘MINUTE、HOUR或DAYticks筆數TICKvol成交量VOLUME其中能被小時或整天整除的分鐘級區間會采用規范的HOUR或DAY聚合。數據客戶端回放與實時雙模式TardisDataClientConfig是連接 Nautilus 節點與 Tardis Machine 的核心配置定義于 crates/adapters/tardis/src/config.rs。其關鍵字段如下字段默認值說明api_key無Tardis HTTP 儀器元數據請求的 API key未設置時回退到TARDIS_API_KEY環境變量tardis_ws_url無Tardis Machine WebSocket URL未設置時回退到TARDIS_MACHINE_WS_URLproxy_url無Tardis HTTP 客戶端的可選代理注意 WebSocket 傳輸暫不支持代理normalize_symbolstrue是否按 Nautilus 約定規范化符號book_snapshot_outputdeltasbook_snapshot_*消息的輸出格式extract_bbo_as_quotesfalse是否從option_summary的買一賣一字段提取QuoteTickoptions空回放請求選項列表非空時連接ws-replay-normalizedstream_options空實時流請求選項列表options為空且此列表非空時連接ws-stream-normalized并支持自動重連模式選擇規則見 crates/adapters/tardis/src/data.rs 與集成文檔options非空 → 歷史回放模式ws-replay-normalizedoptions為空且stream_options非空 → 實時流模式ws-stream-normalized斷線自動重連兩者至少一個非空否則connect()直接報錯Either replay options or stream_options must be provided若同時設置兩者options優先進入歷史回放模式。connect()的完整調用鏈data.rs為校驗配置 → 創建TardisHttpClient→ 通過 HTTP 啟動儀器元數據bootstrap instruments→ 將儀器定義以DataEvent::Instrument發送進數據引擎 → 構建帶 URL 編碼options的 WebSocket 地址 → 建立連接并派生消息處理任務。請求選項結構回放與實時的請求選項分別定義在 crates/adapters/tardis/src/machine/types.rsReplayNormalizedRequestOptionsexchange必填、symbols可選、from/toUTC 日期ISO 8601 格式、data_types標準化數據類型數組、with_disconnect_messages可選StreamNormalizedRequestOptionsexchange、symbols、data_types、with_disconnect_messages另有timeout_interval_ms毫秒若在該時間內未收到消息則重啟到交易所的 WebSocket 連接。一個值得強調的實現細節TardisDataClient::build_ws_url會自動為每個請求注入derivative_ticker數據類型若未顯式聲明以保證資金費率、標記價格、指數價格無需手工配置即可獲得。單元測試 data.rs 驗證了注入行為與去重行為derivative_ticker只出現一次。連接可靠性心跳、重連與限流從 crates/adapters/tardis/src/common/consts.rs 可以看到連接管理的關鍵常量WebSocket 心跳PING間隔WS_HEARTBEAT_INTERVAL_SECS 10秒初始重連延遲WS_INITIAL_RECONNECT_DELAY_SECS 1秒最大重連延遲WS_MAX_RECONNECT_DELAY_SECS 30秒指數退避翻倍增長至上限Tardis REST API 限流10 次/秒TARDIS_REST_QUOTA。實時流模式下消息處理任務在斷線后會按上述退避策略自動重連重連期間is_connected置為false便于健康檢查感知中斷data.rs。TardisDataClient實現DataClienttrait 時venue()返回None因為 Tardis 本質上是多交易所聚合數據源。Tardis Machine 歷史回放產出 Nautilus Parquet 數據目錄歷史回放是適配器最重量級的能力。端到端函數run_tardis_machine_replay_from_configRust/run_tardis_machine_replayPython同一套 Rust 實現執行如下步驟見 集成文檔 與 crates/adapters/tardis/src/replay.rs讀取并解析 JSON 配置文件為TardisReplayConfig連接 Tardis Machine 服務器從 Tardis instruments metadata API 拉取并解析配置交易所的全部儀器定義按配置的時間范圍流式拉取所有儀器與數據類型按數據類型 × UTC 日期逐儀器或逐 bar 類型寫出與數據目錄兼容的.parquet文件流結束后沖刷剩余數據落盤。啟動 Tardis Machine 服務器Tardis Machine 是本地可運行的服務器自帶數據緩存通過 HTTP 與 WebSocket 提供逐筆級歷史與整合后的實時加密數據。啟動命令來自集成文檔與 示例docker run \ --platform linux/amd64 \ -p 127.0.0.1:8000:8000 \ -p 127.0.0.1:8001:8001 \ -e TM_API_KEY \ -d tardisdev/tardis-machine兩點安全與性能提醒不要把端口發布到0.0.0.0務必綁定127.0.0.1否則 Docker 默認全接口發布可能繞過宿主防火墻規則上述命令未掛載持久化緩存卷性能會受影響正式大批量回放建議使用持久卷。回放配置文件詳解TardisReplayConfig定義于 crates/adapters/tardis/src/config.rs字段如下字段類型默認值說明tardis_ws_urlstr \| nullTARDIS_MACHINE_WS_URLTardis Machine WebSocket 地址normalize_symbolsbool \| nulltrue是否應用 Nautilus 符號規范化output_pathstr \| nullNAUTILUS_PATH/catalog/data否則當前目錄Parquet 輸出目錄book_snapshot_outputdeltas \| depth10 \| nulldeltas快照輸出格式extract_bbo_as_quotesbool \| nullfalse是否從option_summary的 BBO 字段額外寫出QuoteTickcompressionzstd \| snappy \| uncompressed \| nullzstdlevel 3Parquet 壓縮編解碼器proxy_urlstr \| null無代理Tardis HTTP 請求的代理地址optionsJSON[]必填回放請求選項對象數組一個最小可用的配置文件示例{ tardis_ws_url: ws://localhost:8001, output_path: null, options: [ { exchange: bitmex, symbols: [xbtusd, ethusd], data_types: [trade], from: 2019-10-01, to: 2019-10-02 } ] }輸出文件布局回放文件按UTC 每個自然日 × 每個儀器或每個 bar 類型輸出一個 Parquet 文件文件名格式{start_timestamp}_{end_timestamp}.parquet示例2023-10-01T00-00-00-000000000Z_2023-10-01T23-59-59-999999999Z.parquet冒號與點號被替換為連字符以保證文件系統安全見 replay.rs相對路徑{data_type}/{instrument_id}/{filename}Bars 為bars/{bar_type}/{filename}該布局與ParquetDataCatalog查詢、整合與管理完全兼容。若配置了NAUTILUS_PATH指向包含catalog/子目錄的父目錄文件將寫入NAUTILUS_PATH/catalog/data/下按數據類型與儀器/bar 類型組織的子目錄中。數據分流細節源碼可見回放管線支持OrderBookDeltas、OrderBookDepth10、QuoteTick、TradeTick、Bar、OptionGreeks六類數據落盤MarkPrice/IndexPrice/FundingRate以及InstrumentStatus/InstrumentClose/Custom會被跳過replay.rs。單條OrderBookDelta消息也會被跳過并提示改用Deltas批量。回放中途每處理 100,000 條消息記錄一條 debug 日志便于監控進度。回放器通過DateCursor按 UTC 日切分批次某儀器/bar 類型的首條消息確定其所在 UTC 日跨日時先沖刷前一日數據再建立新游標。assert_post_epoch保證日期不早于 1970-01-01UnixNanos 表達能力的下限。集成測試 replay.rs 驗證了 Quotes/Greeks、Trades、Bars 三類數據寫入 →ParquetDataCatalog讀回的完整閉環并斷言輸出目錄遵循目錄約定如trades/而非trade_tick/、bars/而非bar/。Python 與 Rust 運行回放Python來自集成文檔import asyncio from pathlib import Path from nautilus_trader.adapters.tardis import run_tardis_machine_replay async def run(): config_filepath Path(YOUR_CONFIG_FILEPATH) await run_tardis_machine_replay(str(config_filepath.resolve())) if __name__ __main__: asyncio.run(run())Rustuse std::path::PathBuf; use nautilus_tardis::replay::run_tardis_machine_replay_from_config; #[tokio::main] async fn main() - Result(), Boxdyn std::error::Error { nautilus_common::logging::ensure_logging_initialized(); let config_filepath PathBuf::from(YOUR_CONFIG_FILEPATH); run_tardis_machine_replay_from_config(config_filepath).await?; Ok(()) }日志默認 INFO 級別需要調試信息時設置export NAUTILUS_LOGdebug。Cargo.toml 還聲明了tardis-replay、tardis-csv、tardis-http、stream-deltas-bench四個二進制目標Cargo.toml其中tardis-replay需要replayfeature。訂單簿快照輸出格式與期權 BBO 提取book_snapshot_output決定book_snapshot_*消息的落盤形態見 集成文檔 與 config.rs值Nautilus 類型輸出目錄說明deltas默認OrderBookDeltasorder_book_deltas/每個快照生成清空 逐檔添加的增量序列可重建盤口狀態、可與book_change拼接depth10OrderBookDepth10order_book_depths/單個快照記錄最多保留 10 檔價格水平選型建議需要重建盤口狀態或與book_change混合使用時選deltas策略只需要周期性深度快照時選depth10。同時下載book_snapshot_*與book_change時depth10寫入獨立目錄可避免覆蓋order_book_deltas/中的文件。顯式配置示例{ tardis_ws_url: ws://localhost:8001, book_snapshot_output: depth10, options: [ { exchange: binance-futures, symbols: [btcusdt], data_types: [book_snapshot_5_100ms, book_change], from: 2024-01-01, to: 2024-01-02 } ] }期權場景下option_summary消息總會映射為OptionGreeks若回測還需要期權 BBO 報價可設置extract_bbo_as_quotes true在買一賣一字段齊全且數量有效時為同一儀器與時間戳額外寫出QuoteTick。該選項只作用于option_summary的回放與流消息不影響 CSV 加載。CSV 加載與流式讀取處理多 GB 文件的兩種姿勢Tardis 格式的 CSV 數據可以直接加載進 Nautilus 數據模型Python 與 Rust 共用同一套 Rust 實現。批量加載加載時可指定price_precision、size_precision與instrument_id提供儀器 ID 可提升加載性能價格/數量精度省略時從 CSV 推斷但官方建議顯式給出以獲得確定性輸出尤其大文件。Python 示例from pathlib import Path from nautilus_trader.adapters.tardis import load_tardis_deltas from nautilus_trader.model import InstrumentId instrument_id InstrumentId.from_str(BTC-PERPETUAL.DERIBIT) deltas load_tardis_deltas( filepathPath(YOUR_CSV_DATA_PATH), price_precision1, size_precision0, instrument_idinstrument_id, )Rust 對應函數在 crates/adapters/tardis/src/csv/mod.rs如load_deltas、load_trades等。流式讀取對于超過內存容量的多 GB CSV使用stream_tardis_*系列函數按塊讀取chunk_size取值范圍[1, 1_000_000]默認 100,000任一時刻僅有一個 chunk 駐留內存。Python 提供以下流式函數stream_tardis_deltas/stream_tardis_batched_deltas訂單簿增量stream_tardis_depth10_from_snapshot5/stream_tardis_depth10_from_snapshot25深度快照stream_tardis_quotes、stream_tardis_trades、stream_tardis_funding_ratesstream_tardis_options_chain期權鏈使用示例from pathlib import Path from nautilus_trader.adapters.tardis import stream_tardis_trades from nautilus_trader.model import InstrumentId instrument_id InstrumentId.from_str(BTC-PERPETUAL.DERIBIT) filepath Path(large_trades_file.csv) trades stream_tardis_trades( filepathfilepath, chunk_size100_000, price_precision1, size_precision0, instrument_idinstrument_id, ) for chunk in trades: print(fProcessing chunk with {len(chunk)} trades) for trade in chunk: pass # 你的處理邏輯流式精度推斷的坑精度推斷只在 chunk 邊界內進行不同 chunk 可能要求不同精度導致與整文件批量加載的推斷結果不一致。需要確定性輸出時務必顯式傳price_precision與size_precision。混合儀器文件的限制普通 CSV 加載不推薦混合多儀器文件精度要求難以統一options_chain相關函數是例外——它們是混合儀器鏈文件內部按儀器跟蹤精度但仍建議顯式精度。適配器自帶的 CSV 測試數據位于 crates/adapters/tardis/test_data/csv可用于快速驗證解析行為。儀器元數據TardisHttpClient回放管線與數據客戶端在連接 Tardis Machine 之前都會通過 Tardis instruments metadata API 為每個配置的交易所拉取儀器元數據并解析為 Nautilus 儀器定義數據客戶端還會把這些定義發布給 Nautilus 數據引擎DataEvent::Instrument。需要說明的是該元數據 API 需要 bearer token 鑒權且僅對活躍的 Tardis pro / business 訂閱開放同時TARDIS_API_KEY是必需的。Python 與 Rust 用戶也可以直接使用TardisHttpClient主動查詢儀器定義構造參數包括可選的api_key、base_url、timeout_secs、normalize_symbols、proxy_url可查詢單個符號或某交易所的全部儀器交易所使用小寫 kebab-case ID如binance-futures。Python 示例import asyncio from nautilus_trader.adapters.tardis import TardisHttpClient async def run(): http_client TardisHttpClient() instrument await http_client.instruments(bitmex, symbolxbtusd) print(fReceived: {instrument}) instruments await http_client.instruments(bitmex) print(fReceived: {len(instruments)} instruments) if __name__ __main__: asyncio.run(run())符號規范化與多交易所 venue 映射為保證與 NautilusTrader 各加密交易所適配器兼容Tardis 集成會統一規范化符號normalize_symbols默認開啟。通用規則所有符號轉為大寫部分交易所追加帶連字符的市場類型后綴原始交易所符號保留在 Nautilus 儀器定義的raw_symbol字段中對應源碼中的TardisInstrumentMiniInfo.raw_symbol見 crates/adapters/tardis/src/machine/types.rs。交易所特定規則摘自集成文檔Binance為binance、binance-futures、binance-us、binance-dex、binance-jersey的永續合約追加-PERPBybit按產品類別使用-SPOT、-LINEAR、-INVERSE、-OPTION后綴dYdX v3永續合約追加-PERPGate.iogate-io-futures永續合約追加-PERPMEXCmexc-futures永續合約追加-PERP。由于 Tardis 上部分交易所被劃分為多個數據源Nautilus venue 與 Tardis exchange 之間是多對一映射例如BINANCE?binance、binance-dex、binance-european-options、binance-futures、binance-jersey、binance-optionsBINANCE_DELIVERY?binance-deliveryCOIN 本位合約BYBIT?bybit、bybit-options、bybit-spotDERIBIT?deribitOKEX?okex、okex-futures、okex-options、okex-spreads、okex-swap等。完整映射表見 集成文檔。部分交易所 ID 代表已退市僅保留歷史數據的 venue如ftx、coinflex、serum使用時需查詢其歷史數據可用性。底層實現要點從源碼看設計取舍Trade ID 的確定性兜底當交易所消息或 CSV 行缺少 trade ID空字符串或 null時WebSocket 解析器與 CSV 解析器都會回退為對符號、時間戳、價格、數量、方向的確定性 FNV-1a 哈希保證同一交易所事件跨多次回放得到相同 trade ID從而維持下游去重邏輯的一致性見 集成文檔。數據流的解析路由TardisMachineClientcrates/adapters/tardis/src/machine/client.rs維護儀器信息表將 WebSocket 消息按TardisInstrumentKey原始符號 交易所路由到TardisInstrumentMiniInfo再由parse_tardis_ws_message_data依據BookSnapshotOutput與extract_bbo_as_quotes解析為 NautilusData。測試目錄 crates/adapters/tardis/test_data 中的trade.json、book_change.json、book_snapshot.json、option_summary.json、derivative_ticker.json、instrument_option.json等固定樣本即用于驅動這些解析路徑。數據客戶端中的派生行情事件send_derivative_ticker_eventsdata.rs從DerivativeTicker消息中提取資金費率、標記價格、指數價格三類事件并通過DerivativeTickerCache僅在數值變化時發布避免冗余事件流。沙箱端到端示例examples/node_data_tester.rs 演示了完整用法構造ReplayNormalizedRequestOptionsBinanceFutures 的BTCUSDT2024-01-01 至 01-02數據類型trade與book_change→ 組裝TardisDataClientConfig→ 通過TardisDataClientFactory掛載到LiveNodeSandbox 環境→ 用DataTester訂閱 quotes/trades/mark/index/funding 并運行。運行方式cargo run --example tardis-data-tester -p nautilus-tardis --features examples前置條件設置TARDIS_API_KEYHTTP 拉取儀器元數據、TM_API_KEYtardis-machine 容器并配置TARDIS_MACHINE_WS_URLws://localhost:8001且本地已啟動上述 Docker 容器。集成測試入口位于 crates/adapters/tardis/tests/integration覆蓋 data_client、http、websocket、python 綁定等性能基準見 crates/adapters/tardis/benches/messages.rs。環境變量速查環境變量必填性用途TM_API_KEY視情況傳給 Tardis Machine 進程用于每月首日之外的歷史數據訪問每月首日免費TARDIS_API_KEY是Nautilus 儀器元數據請求的 API keyTARDIS_MACHINE_WS_URL可選Tardis Machine WebSocket 基礎 URLNAUTILUS_PATH可選包含catalog/子目錄的父目錄回放輸出定位用NAUTILUS_LOG可選日志級別如debug限制與注意事項TardisDataClient不實現Nautilus 數據請求接口instrument、order book、quote、trade、funding rate、bar 請求均未實現歷史數據請通過options配置回放或使用run_tardis_machine_replay走目錄工作流目錄回放不寫入資金費率、標記價格、指數價格僅實時數據客戶端發布Nautilus 訂閱命令不會增刪 Tardis Machine WebSocket 上的數據訂閱集合完全由配置中的options/stream_options決定回放文件名要求日期不早于 1970-01-01跨 UTC 日的數據會被按日切分寫入多個文件Python 數據客戶端默認book_snapshot_output deltas暫不支持depth10而獨立回放 JSON 配置與 Rust 數據客戶端兩種值都支持。相關代碼與文檔索引適配器 READMEcrates/adapters/tardis/README.md完整集成指南docs/integrations/tardis.mdCargo 清單與 feature 定義crates/adapters/tardis/Cargo.tomlcrate 入口與模塊組織crates/adapters/tardis/src/lib.rs配置結構回放 數據客戶端crates/adapters/tardis/src/config.rs數據客戶端WebSocket 回放/實時流crates/adapters/tardis/src/data.rs回放管線Parquet 落盤crates/adapters/tardis/src/replay.rs客戶端工廠crates/adapters/tardis/src/factories.rsMachine 客戶端與請求選項crates/adapters/tardis/src/machine/client.rs、crates/adapters/tardis/src/machine/types.rs常量與連接參數crates/adapters/tardis/src/common/consts.rs數據類型枚舉crates/adapters/tardis/src/common/enums.rs沙箱端到端示例crates/adapters/tardis/examples/node_data_tester.rs集成測試crates/adapters/tardis/tests/integration測試數據樣本crates/adapters/tardis/test_data性能基準crates/adapters/tardis/benches/messages.rsPython 端示例examples/live/tardis【免費下載鏈接】nautilus_traderProduction-grade Rust-native trading engine with deterministic event-driven architecture項目地址: https://gitcode.com/GitHub_Trending/na/nautilus_trader創作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考