十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Nautilus Trader Rust 回测实战指南:从 BacktestEngine 到 BacktestNode 的双 API 完全手册

Nautilus Trader Rust 回测实战指南:从 BacktestEngine 到 BacktestNode 的双 API 完全手册 Nautilus Trader Rust 回测实战指南从 BacktestEngine 到 BacktestNode 的双 API 完全手册【免费下载链接】nautilus_traderProduction-grade Rust-native trading engine with deterministic event-driven architecture项目地址: https://gitcode.com/GitHub_Trending/na/nautilus_trader本文是 Nautilus TraderRust 原生高性能交易引擎的 Rust 回测实战指南以官方文档 docs/how_to/run_rust_backtest.md 为骨架结合仓库源码与可运行示例系统讲解低层BacktestEngine与高层BacktestNode两套 API 的完整用法。读完你将掌握配置Cargo.toml依赖与 feature 开关、构建模拟交易所与加载内存数据、从 Parquet 数据目录流式读取行情、注册策略并运行回测的全流程以及每类配置项背后在 crates/backtest/src/config.rs 中的默认值与校验逻辑。1. 两条回测 API 的定位与选择Nautilus Trader 为 Rust 提供了两套回测 API二者共享同一套内核nautilus-backtestcrate但抽象层级不同API抽象层级数据来源典型场景BacktestEngine低层命令式 API内存中直接add_data注入快速原型验证、单元级策略调试BacktestNode高层声明式 APIParquetDataCatalog目录 分块流式加载生产级批量回测、大数据集、多 run 编排两条路径的完整可运行示例分别位于 crates/backtest/examples/engine_ema_cross.rs低层与 crates/backtest/examples/node_ema_cross.rs高层下文所有代码片段均与这两个示例一一对应可直接复制运行。背景知识关于回测概念、撮合模型fill models与撮合引擎行为参见 docs/concepts/backtesting/ 概念指南关于项目环境搭建与 feature flags参见 docs/concepts/rust.md。2. 依赖配置与 feature 开关将以下内容加入你的Cargo.toml[dependencies] nautilus-backtest { version 0.63, features [streaming] } nautilus-execution 0.63 nautilus-model { version 0.63, features [test-support] } nautilus-persistence 0.63 nautilus-trading { version 0.63, features [examples] } ahash 0.8 anyhow 1 tempfile 3 ustr 1各依赖与 feature 的职责说明nautilus-backtest的streamingfeature仅为高层BacktestNode所需启用后开启BacktestEngineConfig.catalogs字段与目录流式加载能力见 crates/backtest/src/config.rs 中#[cfg(feature streaming)]的catalogs: VecDataCatalogConfignautilus-model的test-supportfeature提供nautilus_model::instruments::stubs::audusd_sim()等测试桩数据用于快速构造 AUD/USD 模拟合约nautilus-trading的examplesfeature提供示例策略EmaCross双 EMA 交叉策略实现位于 crates/trading/src/examples/strategies/ema_cross/strategy.rsnautilus-persistencetempfileustr仅在BacktestNode场景需要——前者提供ParquetDataCatalog后两者用于创建临时目录与高效的字符串标识符。如果只用低层BacktestEngine可去掉streamingfeature、nautilus-persistence、tempfile和ustr依赖列表大幅精简。3. BacktestEngine低层命令式 API低层 API 的逻辑是命令式、逐步构建的创建引擎 → 添加交易所 → 添加合约 → 注入数据 → 注册策略 → 运行。整个过程全部在内存中完成适合快速迭代。3.1 创建引擎use nautilus_backtest::{config::BacktestEngineConfig, engine::BacktestEngine}; let mut engine BacktestEngine::new(BacktestEngineConfig::default())?;BacktestEngineConfig在 crates/backtest/src/config.rs 中定义Default实现等价于Self::builder().build()。值得注意的默认值包括environment Environment::Backtest、run_analysis true回测结束后自动执行绩效分析、各类连接/断连超时如timeout_connection 1 分钟、timeout_portfolio 10 秒。引擎内核会强制把cache.drop_instruments_on_reset覆盖为false从而保证连续多次 run 可复用同一份数据集。3.2 添加模拟交易所VenueSimulatedVenueConfig基于bon::Builder构建只需设置必填字段其余字段全部回落到文档化默认值build()会执行校验并返回ConfigResult因此需要用?或unwrap处理。use nautilus_backtest::config::SimulatedVenueConfig; use nautilus_model::{ enums::{AccountType, BookType, OmsType}, identifiers::Venue, types::Money, }; engine.add_venue( SimulatedVenueConfig::builder() .venue(Venue::from(SIM)) .oms_type(OmsType::Hedging) .account_type(AccountType::Margin) .book_type(BookType::L1_MBP) .starting_balances(vec![Money::from(1_000_000 USD)]) .build()?, )?;必填字段即venue / oms_type / account_type / book_type / starting_balances五者。oms_type OmsType::Hedging表示对冲模式每笔成交生成独立 position ID若用Netting则是净额持仓模式。其余字段的默认值源码级证据见 crates/backtest/src/config.rs 中SimulatedVenueConfig的#[builder(default ...)]配置项默认值说明reject_stop_orderstrue触发价已在市场内时是否拒收止损单support_gtd_orderstrue是否支持 GTD到期时间订单support_contingent_orderstrue是否支持条件单OTO/OCO 等use_position_idstrue成交时是否生成交易所 position IDuse_reduce_onlytrue是否强制 reduce-only 指令use_message_queuetrue交易所事件是否经消息队列分发bar_executiontrueBar 是否参与撮合并推动行情trade_executiontrue成交是否推动行情use_market_order_acksfalse市价单是否生成OrderAccepted事件allow_cash_borrowingfalse是否允许负现金余额借贷liquidation_enabledfalse维持保证金被击穿时是否触发强平liquidation_trigger_ratio1.0权益/维持保证金比值阈值1.0表示权益 ≤ 维持保证金即强平frozen_accountfalse账户余额是否冻结不变queue_positionfalse是否跟踪限价单队列位置default_leverageNone不设置时由引擎按账户类型回落保证金账户 10x其余 1x覆盖默认值的写法是链式调用 setter例如.reject_stop_orders(false)或.allow_cash_borrowing(true)。校验细节SimulatedVenueConfig::validate()会收集所有违规项并一次性返回——starting_balances不能为空、default_leverage/leverages必须为正数、liquidation_trigger_ratio必须是正的有限浮点数NaN/Inf/非正数都会被拒绝对应测试见 crates/backtest/src/config.rs 的test_invalid_liquidation_trigger_ratio_rejected。engine.add_venue()的内部流程见 crates/backtest/src/engine.rsadd_venue创建SimulatedExchange→ 派生账户{venue}-001→ 构造BacktestExecutionClient并将其注册到执行引擎 → 注册报价spread quote端点。重复注册同名 venue 会直接bail!(Venue {venue} is already registered)。3.3 添加合约与数据use nautilus_model::instruments::{ Instrument, InstrumentAny, stubs::audusd_sim, }; let instrument InstrumentAny::CurrencyPair(audusd_sim()); let instrument_id instrument.id(); engine.add_instrument(instrument)?; let quotes generate_quotes(instrument_id); // 你的数据加载函数 engine.add_data(quotes, None, true, true)?;add_instrument有两条硬性约束见 crates/backtest/src/engine.rsadd_instrument合约所属 venue 必须先通过add_venue注册否则报错 Cannot add anInstrumentobject without first adding its associated venue对CurrencyPair/TokenizedAsset这类多币种现货合约不能添加给单币种 CASH 账户的 venueaccount_type ! Margin且base_currency有值时报错。engine.add_data(quotes, None, true, true)?的四个参数依次为数据、start/end过滤时间None表示全部、sort true自动按时间戳排序——运行前数据必须有序否则run()会报错 Data has been added but not sorted、以及最后一个布尔参数。示例中generate_quotes生成的是 2025-01-01 起、间隔 1 秒的合成报价序列先 25 根平盘报价让双 EMA 收敛再循环 6 轮40 根上涨 80 根下跌的锯齿行情制造多次金叉/死叉信号。3.4 注册策略并运行use nautilus_model::types::Quantity; use nautilus_trading::examples::strategies::EmaCross; let strategy EmaCross::new( instrument_id, Quantity::from(100000), // 单笔交易量 10, // 快线 EMA 周期 20, // 慢线 EMA 周期 ); engine.add_strategy(strategy)?; engine.run(None, None, None, false)?;EmaCross::new(instrument_id, trade_size, fast_period, slow_period)是示例策略的便捷构造见 crates/trading/src/examples/strategies/ema_cross/strategy.rs。其核心行为启动时订阅报价每次收到QuoteTick更新快慢两条 EMA基于 Mid 价格快线自下而上穿越慢线时市价买入、自上而下穿越时市价卖出单笔交易量固定为trade_size。engine.run(start, end, run_config_id, streaming)的四个参数start/end回测时间边界OptionUnixNanosNone表示从数据起点跑到数据终点run_config_id可选的 run 标识streaming是否分块流式运行低层内存数据通常传false。run()内部见 crates/backtest/src/engine.rsrun/run_impl会先校验数据已排序、检查高深度 book_type 是否配套订单簿数据然后设置全部组件时钟到起始时刻、初始化账户、以静态时钟模式启动日志保证确定性时间戳最后进入主数据循环非流式或收到关停请求时调用end()收尾。run_analysis默认开启会在回测结束后执行绩效分析。3.5 运行完整示例cargo run -p nautilus-backtest --features examples --example engine-ema-cross4. BacktestNode高层声明式 API高层 API 从ParquetDataCatalog加载数据并按可配置的 chunk 大小流式灌入引擎。它把venue 配置、数据配置、引擎配置打包成一份BacktestRunConfig声明支持一次构建多个 run 并统一执行。使用前提nautilus-backtest必须启用streamingfeature。4.1 将数据写入 Parquet 数据目录use nautilus_model::instruments::{ Instrument, InstrumentAny, stubs::audusd_sim, }; use nautilus_persistence::backend::catalog::ParquetDataCatalog; use tempfile::TempDir; let instrument InstrumentAny::CurrencyPair(audusd_sim()); let instrument_id instrument.id(); let quotes generate_quotes(instrument_id); let temp_dir TempDir::new()?; let catalog_path temp_dir.path().to_str() .context(temp dir path is not valid UTF-8)? .to_string(); let catalog ParquetDataCatalog::new( temp_dir.path(), None, None, None, None, ); catalog.write_instruments(vec![instrument])?; catalog.write_to_parquet(quotes, None, None, None)?;ParquetDataCatalog::new的 5 个参数依次为目录路径 4 个可选配置None表示全部使用默认write_instruments写入合约元数据write_to_parquet写入行情数据。示例中generate_quotes生成的VecQuoteTick与低层版本同构但数据类型是QuoteTick而非Data枚举。4.2 配置回测 runuse nautilus_backtest::config::{ BacktestDataConfig, BacktestRunConfig, BacktestVenueConfig, NautilusDataType, }; use nautilus_model::enums::{AccountType, BookType, OmsType}; let venue_config BacktestVenueConfig::builder() .name(SIM) .oms_type(OmsType::Hedging) .account_type(AccountType::Margin) .book_type(BookType::L1_MBP) .starting_balances(vec![1_000_000 USD.to_string()]) .build()?; let data_config BacktestDataConfig::builder() .data_type(NautilusDataType::QuoteTick) .catalog_path(catalog_path) .instrument_id(instrument_id) .build()?; let run_config BacktestRunConfig::builder() .id(ema-cross-run.to_string()) .venues(vec![venue_config]) .data(vec![data_config]) .chunk_size(100) .build()?;三份配置的关键点BacktestVenueConfig与低层的SimulatedVenueConfig平行但字段类型是 YAML 友好的字符串形式如starting_balances: VecString且name会通过Venue::new_checked校验合法性空名、含非法字符如vénue均被拒绝对应测试test_invalid_venue_name_rejected。额外字段包括oto_trigger_modeOTO 子单触发模式、bar_adaptive_high_low_orderingBar 价格自适应处理顺序为false时固定按 Open→High→Low→Close 处理、price_protection_points价格保护点数防止市价单被极端价格成交等。BacktestDataConfigdata_type支持 11 种目录数据类型NautilusDataType枚举见 crates/backtest/src/config.rsQuoteTick、TradeTick、Bar、OrderBookDelta、OrderBookDepth10、MarkPriceUpdate、IndexPriceUpdate、FundingRateUpdate、InstrumentStatus、OptionGreeks、InstrumentClose。校验规则catalog_path不能为空、start_time必须 ≤end_time、且必须提供instrument_id/instrument_ids/bar_types三者之一。Bar类型支持bar_spec/bar_types显式指定并可通过start_time/end_time裁剪时间窗、filter_expr附加过滤表达式。BacktestRunConfigchunk_size决定流式分块大小合法范围[1, 1_000_000]越界会被validate()拒绝常量MAX_BACKTEST_CHUNK_SIZE定义于 crates/backtest/src/config.rschunk_size None时退化为一次性全量加载。其他字段id唯一标识 run默认自动生成 UUID4、engine内嵌的BacktestEngineConfig、raise_exception构建/运行异常是否中断默认false仅记日志、dispose_on_completionrun 结束后是否连同数据一起销毁引擎默认truefalse则只丢弃数据、start/end时间边界。4.3 构建节点、注册策略并运行use nautilus_backtest::node::BacktestNode; use nautilus_model::types::Quantity; use nautilus_trading::examples::strategies::EmaCross; let mut node BacktestNode::new(vec![run_config])?; node.build()?; let engine node.get_engine_mut(ema-cross-run) .context(engine not found for run config ID)?; let strategy EmaCross::new( instrument_id, Quantity::from(100000), 10, 20, ); engine.add_strategy(strategy)?; node.run()?;BacktestNode的生命周期见 crates/backtest/src/node.rsnew(vec![run_config])接收VecBacktestRunConfig可一次性声明多个 runbuild()为每个 config 构建底层BacktestEngine并存入HashMaprun_id, engine重复 ID 跳过单个 run 构建失败时若该 configraise_exception true则整体中断否则仅记录错误日志继续其余 runget_engine_mut(id)/get_engine(id)/get_engines()按 run ID 取回引擎注入策略、actor 或模块run()若引擎尚未构建会自动调用build()对每个 run 从 catalog 按chunk_size分块加载数据并驱动引擎返回VecBacktestResult。支持 oneshotchunk_size None与 streaming 两种模式raise_exception false的失败 run 会被跳过并从结果中剔除。由于策略是注入到构建后的引擎实例上BacktestNode的典型用法是配置声明 策略注入两段式先 build再对每个 run ID 调用get_engine_mut注册各自的策略最后统一run()。4.4 运行完整示例cargo run -p nautilus-backtest --features examples,streaming --example node-ema-cross注意此处需要同时启用examples与streaming两个 feature。5. 两条 API 的差异速查与选型建议维度BacktestEngineBacktestNode数据入口内存add_data含排序开关目录流式加载可调chunk_size配置风格命令式逐步构建声明式BacktestRunConfig打包多 run 编排手动原生支持VecBacktestRunConfig run ID依赖要求精简无需 streaming/持久化需streamingnautilus-persistence失败隔离无raise_exception false时单 run 失败不影响其他 run典型场景原型验证、调试、教学大数据集、批量研究、可复现回测流水线选型建议数据量小、需要反复改参数快速验证策略逻辑时用BacktestEngine数据集已达到 GB 级、需要流式分块加载或要长期维护一组可复现的研究回测配置时用BacktestNodeParquetDataCatalog组合。6. 延伸阅读概念背景docs/concepts/backtesting/撮合模型、成交价格与匹配、执行流程、账户与保证金Rust 项目环境与 feature 配置docs/concepts/rust.md低层示例源码crates/backtest/examples/engine_ema_cross.rs高层示例源码crates/backtest/examples/node_ema_cross.rs配置类型与校验实现crates/backtest/src/config.rs引擎实现venue/instrument/data/strategy/run 调用链crates/backtest/src/engine.rs节点实现build/run/get_engine_mutcrates/backtest/src/node.rs示例策略 EmaCrosscrates/trading/src/examples/strategies/ema_cross/strategy.rs数据目录后端crates/persistence/src/backend/catalog.rs/output文章【免费下载链接】nautilus_traderProduction-grade Rust-native trading engine with deterministic event-driven architecture项目地址: https://gitcode.com/GitHub_Trending/na/nautilus_trader创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表