尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

nautilus-backtest 回测引擎完全指南:NautilusTrader 的高保真事件驱动回测框架

nautilus-backtest 回测引擎完全指南:NautilusTrader 的高保真事件驱动回测框架 nautilus-backtest 回测引擎完全指南NautilusTrader 的高保真事件驱动回测框架【免费下载链接】nautilus_traderProduction-grade Rust-native trading engine with deterministic event-driven architecture项目地址: https://gitcode.com/GitHub_Trending/na/nautilus_tradernautilus-backtest是 NautilusTrader 的核心回测 crate为量化交易者提供基于历史数据的高保真市场模拟环境用于测试和验证交易策略。本指南将带你深入其事件驱动回测引擎、模拟交易所撮合、延迟与成交模型、多场所多资产支持以及配置与状态管理机制并给出可直接运行的代码示例与源码级原理分析。一、nautilus-backtest 是什么nautilus-backtest是 NautilusTrader 的官方回测引擎 crate代码位于 crates/backtest。它以事件驱动架构按时间顺序回放历史行情数据通过模拟交易所复现真实市场条件使策略在回测中的行为与实盘高度一致。系统提供以下核心能力事件驱动回测引擎与模拟交易所以BacktestEngine为核心按时间戳顺序驱动行情、订单、成交事件的流转可配置延迟与成交模型的市场数据回放支持自定义 latency model延迟模型、fill model成交模型与 fee model手续费模型真实的执行模拟与订单撮合引擎每个模拟交易所内部挂载OrderMatchingEngine撮合引擎模拟限价、市价、止损、OTO 等订单行为多场所multi-venue与多资产multi-asset回测能力一个引擎可同时注册多个SimulatedExchange覆盖外汇、期货、加密货币、期权等资产类别配置与状态管理完整的 Rust 类型化配置体系bon::Builder构建器 校验支持运行状态保存与恢复。从 crates/backtest/src/lib.rs 的模块声明可以看到 crate 的整体结构config配置类型、engine回测引擎、exchange模拟交易所、data_client回测数据客户端、execution_client回测执行客户端、result回测结果、node目录驱动的回测编排器、accumulator时间事件累加器与data_iterator回测数据迭代器defiDeFi 回放、pythonPython 绑定、streaming流式配置等模块则按 feature flag 条件编译。二、核心架构从内核到模拟交易所2.1 BacktestEngine事件驱动主循环BacktestEngine是回测的入口与调度中枢定义于 crates/backtest/src/engine.rs#L94-L123。它的核心成员包括kernel: NautilusKernel底层内核承载数据引擎、执行引擎、风控引擎、组合管理与缓存venues: IndexMapVenue, RcRefCellSimulatedExchange按注册顺序维护的模拟交易所集合data_iterator与data_len回测数据迭代器与数据总量ts_first/ts_last_data/backtest_start/backtest_end回测时间范围追踪iteration/force_stop/end_ns主循环迭代计数、强制停止标志与结束时间。引擎的初始化engine.rs#L141-L191有一个值得注意的细节BacktestEngine::new会强制将缓存配置中的drop_instruments_on_reset置为false从而保证多次连续运行可以复用同一批数据集引擎在 reset 时不会重放add_instrument因此 rerun 依赖缓存保留 instrument。注册模拟交易所由add_venue完成engine.rs#L274-L324每个 venue 对应一个SimulatedExchange实例、一个自动生成的账户 ID格式为{venue}-001以及一个BacktestExecutionClient执行客户端并将执行客户端注册到内核的执行引擎同时注册点差报价端点register_spread_quote_endpoint使盘口价格在缺乏 L2/L3 深度数据时仍可基于买卖价撮合。2.2 SimulatedExchange模拟交易所与撮合引擎SimulatedExchange定义于 crates/backtest/src/exchange.rs#L138-L194它持有fee_model、fill_model、latency_model三个可替换的执行模型句柄FeeModelHandle、FillModelHandle、LatencyModelHandlematching_engines: IndexMapInstrumentId, OrderMatchingEngine按标的维度挂载的撮合引擎account_type、base_currency、default_leverage、leverages账户与杠杆配置一系列行为开关allow_cash_borrowing允许负现金余额、frozen_account冻结账户、queue_position限价单队列位置追踪、oto_full_trigger、price_protection_points价格保护点、liquidation_enabled保证金强平、liquidation_trigger_ratio强平触发比率等。撮合引擎由 crates/common/src/matching 提供通用撮合原语该目录下有matching.rs、matching_iai.rs等基准测试模拟真实订单簿的排队、成交、部分成交与撤单行为。bar_execution与trade_execution开关控制 Bar 与成交数据是否会驱动撮合引擎并推动市场价格变化而bar_adaptive_high_low_ordering则决定 Bar 价格的处理顺序是否基于启发式自适应默认固定按 Open、High、Low、Close 顺序处理启用后若 High 更接近 Open 则按 Open、High、Low、Close否则按 Open、Low、High、Close。2.3 数据与执行客户端BacktestDataClientcrates/backtest/src/data_client.rs回测模式下的数据客户端将历史数据按时间顺序注入数据引擎BacktestExecutionClientcrates/backtest/src/execution_client.rs模拟执行客户端负责在模拟交易所与内核执行引擎之间转发订单事件与成交回报支持routing多场所路由与frozen_account冻结账户语义。这两层客户端使得策略代码在回测与实盘之间无需改写——这正是 NautilusTrader research-to-live semantic parity研究到实盘的语义一致性的基石回测中走的是同一套NautilusKernel数据/执行/风控/组合管线只是数据源与执行后端被替换为模拟实现。三、Feature flags按需裁剪编译README 与 Cargo.toml 共同定义了 crate 的全部 feature flags用于控制编译期源码包含范围Feature作用defi启用 DeFi 回放 API 与数据引擎路由联动nautilus-common/defi、nautilus-data/defi、nautilus-model/defiexamples启用示例策略与 EMA 交叉回测示例联动nautilus-trading/examplesextension-module以 Python 扩展模块方式构建自动启用python与streaming并逐 crate 传递extension-modulehigh-precision启用高精度模式使用 128 位数值类型联动nautilus-model/high-precision适用于对精度敏感的价格/数量场景mimalloc为内置 Rust 示例启用 mimalloc 作为全局分配器降低内存分配开销plugin仅提供兼容性 flag不启用额外代码python通过 PyO3 启用 Python 绑定联动nautilus-trading/python、pyo3、pyo3-stub-gen等streaming启用nautilus-persistence依赖支持流式配置与目录读取从 lib.rs 可以看到这些 flag 的实际编译效果defi编译defi模块streaming编译node模块python编译python模块。docs.rs元数据默认以[defi, examples, high-precision, plugin, streaming]构建文档。四、配置体系类型安全、构建器驱动、可校验nautilus-backtest的配置全部集中在 crates/backtest/src/config.rs采用bon::Builder构建器模式所有配置在build()时执行统一校验并在 Python 绑定下导出为nautilus_trader.backtest命名空间的 pyclass。4.1 BacktestEngineConfig引擎级配置BacktestEngineConfigconfig.rs#L115-L186是回测内核的顶层配置字段及默认值包括environment默认Environment::Backtest、trader_id、instance_id内核环境上下文与身份标识load_state/save_state启动/停止时是否从数据库加载/保存 actor 与策略状态shutdown_on_error发出错误日志时是否请求系统关闭被过滤或绕过的错误日志仍会触发logging: LoggerConfig内核日志配置超时系列timeout_connection默认 60 秒客户端连接初始化、timeout_reconciliation默认 30 秒执行状态对账、timeout_portfolio默认 10 秒组合保证金与未实现盈亏初始化、timeout_disconnection默认 10 秒客户端断开、delay_post_stop默认 10 秒停止后等待残留事件、timeout_shutdown默认 5 秒关闭时等待待处理任务取消各引擎配置cache、msgbus、data_engine、risk_engine、exec_engine、portfolio、controller、streaming、catalogsstreaming下可用配置已存在的数据目录bypass_logging跳过日志与run_analysis默认true回测结束后运行绩效分析。4.2 场所配置SimulatedVenueConfig 与 BacktestVenueConfigcrate 提供两套场所配置对应两条 API 路径SimulatedVenueConfigconfig.rs#L296-L362面向BacktestEngine命令式 API。字段直接使用运行时句柄FillModelHandle、FeeModelHandle、LatencyModelHandle、MarginModelHandle、SimulationModuleHandle与类型化的Money余额。必填项包括venue、oms_type、account_type、book_type、starting_balancesdefault_leverage可缺省此时引擎按账户类型回退默认值保证金账户 10 倍其他 1 倍。BacktestVenueConfigconfig.rs#L442-L542面向BacktestNode的 YAML 友好版本。余额以字符串如1_000_000 USD表示模型以OptionFillModelAny等可序列化形式给出并在 node.rs#L217-L281 的build_engine中被转换为SimulatedVenueConfig供引擎使用。两套配置共享大量行为字段默认值均已标注字段默认值含义oms_type必填订单管理系统类型Hedging会生成新的仓位 IDaccount_type/book_type必填账户类型现金/保证金与订单簿类型L1_MBP / L2_MBP / L3_MBOstarting_balances必填初始账户余额单资产账户传一个即可routingfalse是否为执行客户端启用多场所路由frozen_accountfalse是否冻结账户余额不变reject_stop_orderstrue触发价已在市场内时是否拒绝提交止损单support_gtd_orderstrue是否支持 GTDGood-Till-Date订单support_contingent_orderstrue是否支持/尊重条件订单为false时由策略自行管理use_position_idstrue成交时是否生成场所仓位 IDuse_random_idsfalse场所订单/仓位 ID 是否使用随机 UUID4Trade ID 始终确定性生成不受影响use_reduce_onlytrue是否强制执行订单的reduce_only指令为false时拒绝 reduce-only 订单bar_execution/trade_executiontrueBar / 成交数据是否由撮合引擎处理并推动市场use_market_order_acksfalse是否对市价单生成OrderAccepted事件liquidity_consumptionfalse是否按档位追踪订单簿流动性消耗allow_cash_borrowingfalse是否允许负现金余额借贷queue_positionfalse成交执行期间是否启用限价单队列位置追踪oto_trigger_modeOtoTriggerMode默认OTO 子单相对父单成交的释放时机base_currency/default_leverage/leverages可选账户基础货币、默认杠杆与按标的的杠杆表保证金账户margin_model/modules可选保证金模型与模拟模块如自定义撮合扩展fill_model/latency_model/fee_model可选成交/延迟/手续费模型缺省时引擎使用默认实现price_protection_points0交易所计算的限价保护边界防止市价单以极端激进价格成交liquidation_enabledfalse维持保证金被突破时是否触发持仓强平liquidation_trigger_ratio1.0权益/维持保证金比率1.0表示权益 ≤ 维持保证金时触发强平liquidation_cancel_open_orderstrue强平前是否先取消未成交挂单4.3 BacktestDataConfig 与 BacktestRunConfig运行级配置BacktestDataConfigconfig.rs#L798-L830描述单次回测的数据查询data_type: NautilusDataType枚举 11 类数据——QuoteTick、TradeTick、Bar、OrderBookDelta、OrderBookDepth10、MarkPriceUpdate、IndexPriceUpdate、FundingRateUpdate、InstrumentStatus、OptionGreeks、InstrumentClosecatalog_path必填非空与catalog_fs_protocol/catalog_fs_storage_options/catalog_fs_rust_storage_options目录路径与fsspec文件系统协议、存储选项如云认证instrument_id/instrument_ids/bar_types三选一必填校验要求至少提供一个非空标识bar_types示例为EUR/USD.SIM-1-MINUTE-LAST-EXTERNALstart_time/end_time须满足start end、filter_expr附加过滤表达式、client_id、metadata、bar_specoptimize_file_loading是否启用基于目录的文件注册以提升加载效率。BacktestRunConfigconfig.rs#L1050-L1079将一次回测运行的所有要素打包id默认随机 UUID4、venues非空必填、data、engine默认BacktestEngineConfig、chunk_sizeNone表示一次性加载全部数据否则流式运行合法范围[1, 1_000_000]上限常量MAX_BACKTEST_CHUNK_SIZE定义于 config.rs#L56、raise_exception构建/运行异常是否中断处理、dispose_on_completion默认true完成后销毁引擎并丢弃全部数据与状态为false时仅丢弃数据、start/end回测时间窗缺省则从数据起点跑到数据终点。配置校验由各validate()方法完成并在 config.rs#L1175-L1591 的单元测试中得到验证例如空name拒绝、非正杠杆拒绝、liquidation_trigger_ratio必须为正有限值、余额字符串必须可解析为Money、时间区间倒置拒绝、多字段违规会聚合成ConfigError::Multiple一次性返回等。五、BacktestNode目录驱动的回测编排器BacktestNodecrates/backtest/src/node.rs#L53-L215将ParquetDataCatalog与BacktestEngine连接起来从运行配置批量构建引擎、加载历史数据并执行回测支持一次性oneshot与流式streaming两种模式一次性模式run_oneshotnode.rs#L384-L401从目录查询全部数据、add_data注入引擎、sort_data排序后一次性run流式模式run_streamingnode.rs#L403-L440直接从目录迭代器按ts_init升序多路归并merge_streams同一时间戳保持配置顺序按chunk_size切块并扩展至边界时间戳对齐take_aligned_chunk逐块喂给引擎后clear_data内存占用始终受限于chunk_size。BacktestNode::new会做三层一致性校验node.rs#L310-L382所有数据配置引用的标的场所必须存在对应 venue 配置L2_MBP/L3_MBO 盘口类型必须配置 OrderBookDelta/OrderBookDepth10 数据数据时间区间必须合法。另外需注意由于内核 MessageBus 是线程局部单例一个BacktestNode当前只支持一个 run config源码中以ensure!(configs.len() 1, ...)显式约束。BacktestDataConfig的目录查询通过dispatch_querynode.rs#L564-L613按data_type分发到ParquetDataCatalog的对应类型化查询标识符构造逻辑query_identifiersconfig.rs#L965-L1005与 Python 端BacktestDataConfig.query保持一致Bar 数据优先用bar_types否则由instrument(s) bar_spec -EXTERNAL拼接。六、运行示例三分钟跑通 EMA 交叉回测6.1 命令式 APIengine-ema-crosscrates/backtest/examples/engine_ema_cross.rs 演示了直接使用BacktestEngine的命令式流程运行命令cargo run -p nautilus-backtest --features examples --example engine-ema-cross其核心流程main函数engine_ema_cross.rs#L99-L130用默认配置创建引擎BacktestEngine::new(BacktestEngineConfig::default())?注册模拟场所engine.add_venue(SimulatedVenueConfig::builder()...build()?)示例使用OmsType::Hedging、AccountType::Margin、BookType::L1_MBP、起始余额1_000_000 USD添加交易品种engine.add_instrument(InstrumentAny::CurrencyPair(audusd_sim()))?AUD/USD 模拟外汇对来自nautilus-model的 stubs挂载策略engine.add_strategy(EmaCross::new(instrument_id, Quantity::from(100000), 10, 20))?——双 EMA10/20 周期交叉策略来自nautilus-trading的 examples注入数据并运行engine.add_data(quotes, None, true, true)后engine.run(None, None, None, false)。示例程序内置合成报价生成器generate_quotesengine_ema_cross.rs#L60-L97先以 0.65000 平值初始化 25 个 tick 使双 EMA 收敛再循环 6 轮拉升-回落周期制造多次金叉/死叉信号。通过修改文件顶部常量即可调整场所、起始余额、交易量与 EMA 周期const VENUE: str SIM; const STARTING_BALANCE: str 1_000_000 USD; const TRADE_SIZE: str 100000; const EMA_FAST_PERIOD: usize 10; const EMA_SLOW_PERIOD: usize 20;6.2 目录驱动 APInode-ema-crosscrates/backtest/examples/node_ema_cross.rs 展示BacktestNodeBacktestRunConfig的配置驱动路径需要examples与streaming两个 featurecargo run -p nautilus-backtest --features examples,streaming --example node-ema-cross该示例从ParquetDataCatalog加载数据含 instruments 查询通过BacktestRunConfig::builder()组合 venues、data 与 engine 配置交由BacktestNode编排运行。6.3 期权链回测tardis-option-chaincrates/backtest/examples/tardis_option_chain.rs 演示基于 Tardis 数据的期权链回测需要设置环境变量指向期权目录NAUTILUS_TARDIS_OPTION_CATALOG/path/to/catalog \ cargo run -p nautilus-backtest --features examples,streaming --example tardis-option-chain6.4 性能基准crate 内置 Criterion 基准crates/backtest/benches/engine.rs运行方式cargo bench -p nautilus-backtest --bench engine基准结果与历史版本对比见 crates/backtest/benches/BENCHMARKS.md 与 crates/backtest/benches/v1-v2-results.json。配置项mimallocfeature 即为基准/示例提供低开销全局分配器。七、回测结果与确定性保证7.1 BacktestResult 与绩效分析一次运行结束后通过engine.get_result()engine.rs#L1220-L1223获取BacktestResultcrates/backtest/src/result.rs#L94-L114包含运行元信息trader_id、machine_id、instance_id、run_config_id、run_id、run_started、run_finished、backtest_start、backtest_end规模指标elapsed_time_secs回测耗时、iterations主循环迭代次数、total_events总事件数、total_orders、total_positions绩效数据summary摘要键值对、stats_pnls按维度的盈亏统计、stats_returns收益统计、stats_general通用统计、returns_series按时间戳的收益序列。绩效统计由nautilus-analysiscrate 的PortfolioAnalyzer计算见 crates/analysis/src/analyzer.rs对应run_analysis配置开关。7.2 规范结果确定性可复现nautilus-backtest对确定性有严格定义CanonicalBacktestResultresult.rs#L118-L120是回测可观测状态的版本化确定性投影采用 schemanautilus-backtest-result/v1result.rs#L34覆盖账户、余额、成交、订单、仓位、保证金、组合快照、已实现/未实现盈亏、策略与 actor ID 等全部关键状态。其解码流程result.rs#L177-L200会校验信封、规范化和精确编码并支持CanonicalResultDivergence差异定位RFC 6901 JSON Pointer。这使回测结果可被字节级比较为 CI 回归测试与多版本结果比对提供基础。从代码结构可以推断这些确定性机制服务于两类典型场景一是 crates/backtest/tests/integration/canonical_backtest_workloads.rs 与 crates/backtest/tests/integration/backtest_node_workload.rs 中的黄金文件比对测试二是跨版本回归验证如v1-v2-results.json所记录的基准结果变化。八、测试与验证体系crate 的集成测试位于 crates/backtest/tests/integration覆盖引擎与节点的完整行为backtest_engine.rs 与 backtest_node.rs引擎与节点核心流程exchange.rs 与 netting_fill_void.rs模拟交易所撮合与净额账户成交语义ema_cross.rs、book_imbalance.rs、grid_mm.rs策略级端到端回测验证option_chain_backtest.rs 与 option_chain_data_client.rs期权链回测依赖defi等 featurebacktest_node_itch.rs 与 grid_mm_itch.rs基于 ITCH 数据的 L3 订单簿回测canonical_backtest_workloads.rs 与 backtest_node_workload.rs规范结果一致性验证。此外配置层的单元测试内嵌于 config.rsnode 的流式归并逻辑也有rstest参数化测试覆盖node.rs#L633-L700 之后。九、Python 使用与更高层文档启用python/extension-modulefeature 后回测引擎可作为nautilus_trader.backtest模块被 Python 调用BacktestEngine、BacktestNode、BacktestEngineConfig、BacktestVenueConfig、BacktestDataConfig、BacktestRunConfig、BacktestResult均导出见 crates/backtest/src/python 目录。仓库内提供两份可直接对照学习的 Python 入门脚本docs/getting_started/backtest_high_level.py高层 APIBacktestEngineBacktestVenueBacktestDatadocs/getting_started/backtest_low_level.py底层 API 逐步编排。更多示例见 examples/backtest含加密资产 EMA 交叉、订单簿失衡、FX 做市、合成数据 PnL 测试、Tardis 期权链等以及 crates/backtest/README.md 中指向的 docs.rs API 文档。十、许可说明nautilus-backtest与 NautilusTrader 全项目一致采用 GNU Lesser General Public License v3.0由 Nautech Systems 开发与维护。使用本软件需遵守项目 SECURITY.md 中声明的安全策略与免责声明。总结nautilus-backtest以BacktestEngineSimulatedExchange为双核心通过可替换的延迟/成交/手续费模型、类型安全的构建器配置体系、多场所撮合与规范化的确定性结果为策略研究提供了从数据回放到结果复现的完整闭环。无论是通过命令式 API 快速验证想法还是通过BacktestNode驱动大规模目录数据回测你都能在 Rust 与 Python 双语言环境中获得一致的高保真模拟体验。【免费下载链接】nautilus_traderProduction-grade Rust-native trading engine with deterministic event-driven architecture项目地址: https://gitcode.com/GitHub_Trending/na/nautilus_trader创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表