ARTICLE DETAIL

资讯详情

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

NautilusTrader量化交易终极指南-第5章第1节-架构总览-一张图看懂系统架构

NautilusTrader量化交易终极指南-第5章第1节-架构总览-一张图看懂系统架构 NautilusTrader量化交易终极指南-第5章第1节-一张图看懂系统架构一句话导读NautilusTrader 不是一个库而是一台精简的交易操作系统——NautilusKernel 是内核MessageBus 是总线三大引擎干活Trader 是你面向的操作入口。本文导航架构要先看整体骨架NautilusKernel内核MessageBus消息总线Cache缓存三大引擎Data / Risk / ExecutionPortfolio 与 Trader全景架构图三种运行环境小结下节预告架构要先看整体骨架很多人一上来就盯着策略 API 怎么写结果被各种on_bar、submit_order绕晕。我建议换个思路先搞清系统里有哪些角色、谁给谁递消息,骨架立起来细节自然水落石出。NautilusTrader 的架构是典型的事件驱动 六边形结构。内核NautilusKernel作为中央协调者通过消息总线把事件分发给各个模块Cache 做数据账本DataEngine 管行情数据RiskEngine 管风控ExecutionEngine 管下单成交Portfolio 记账算盈亏Trader 把这一切封装成你直接调用的门面。下面逐个拆。NautilusKernel内核NautilusKernel 是整套系统的中央控制器职责是装配和指挥它持有 MessageBus、Cache、各引擎、Portfolio并通过一条标准的启动序列把它们拉起来。它的风格叫crash-only design不指望优雅停机进程崩了就崩了重启后靠日志和确定性重放恢复状态。这对高频场景很重要——宁可快速失败重启也不要在停机恢复上纠缠。内核的核心任务可以概括成建立组件 → 注册到总线 → 设定运行时钟 → 启动消息循环。用 Python 侧工作流框架nautilus_trader.workflow时内核对象就是那个把所有东西串起来的NautilusKernelPython 侧其实配合一个 FluentBuilder 来装配。MessageBus消息总线MessageBus 是系统的血管。所有组件不直接互相调用对方的方法而是往总线发消息、从总线订阅消息。这样解耦极彻底DataEngine 不需要知道有哪些消费者在听行情策略不用关心下单到底走哪个交易所。总线上流转的主要消息类型包括行情事件TradeTick、QuoteTick、Bar、指令Command、订单事件OrderAccepted、OrderFilled 等、数据请求/响应。# 策略侧订阅行情本质是往总线注册监听self.subscribe_bars(self.bar_type)# 下发订单指令self.submit_order(order)你写的策略根本不直接碰执行引擎只是发消息剩下的交给总线路由。Cache缓存Cache 是系统的账本记忆。它缓存了所有落到系统里的数据对象——instrument 定义、报价、订单、成交、持仓——并对外提供查询。为什么要有 Cache因为引擎和策略经常需要回头看系统当前有什么。比如风控要查当前净持仓、策略要确认仓位是否平坦它们不去交易所拉慢且带延迟直接从 Cache 里读 (内存级、快)。# 从 Cache 查询当前持仓是否平坦self.portfolio.is_flat(self.symbol)Cache 保证系统内的真相只有一个来源这跟上一章讲的确定性一脉相承——所有对象都在确定的时间点被写入查询结果也可复现。三大引擎Data / Risk / Execution三个引擎是系统的手。DataEngine管数据流。接收 DataClient 灌进来的行情做缓存、订阅管理、bar 聚合把 tick 聚成 bar、向策略推送。它维护所有订阅关系是行情的中转站。RiskEngine管风控。所有订单在下发前必须先过风控。它执行预设的预交易/交易后检查——单笔下单量是否超限、日内成交次数、净持仓上限等等不通过就拦截。这条防线在实盘里能救命。ExecutionEngine管订单生命周期。订单提交、状态更新、成交回报、部分成交、拒单、撤单都由它经 ExecutionClient 与交易所交互并把订单事件回传总线。一句话分工DataEngine 喂数据RiskEngine 卡风险ExecutionEngine 下订单。Portfolio 与 TraderPortfolio是记账员它维护账户余额、持仓、以及每笔成交对 PnL 的累计影响基于成交回调用确定性的方式结算盈亏呼应上一章定点数结算。Trader则是对外统一的门面facade你写的策略不直接抓内核内部对象而是通过 Trader 来订阅、下单、查组合。它把内核 总线 引擎 组合这一整套复杂协作收敛成一个你天天打交道的对象。fromnautilus_trader.trading.traderimportTrader# 策略内部常这样拿到 Trader 能力self.subscribe_bars(...)# 走 Trader - DataEngineself.submit_order(...)# 走 Trader - RiskEngine - ExecutionEngine全景架构图下面这张图把全套组件和它们之间的消息流向画在一起业务层引擎层中枢适配层行情事件成交/状态回报装配并协调装配并协调装配并协调装配并协调装配并协调派发行情订flix新闻? 否: 推送订阅/查询下单订单指令放行订单提交/撤单写缓存写缓存读缓存/结算DataClientExecutionClientNautilusKernel 内核MessageBus 消息总线Cache 缓存DataEngine 数据引擎RiskEngine 风控引擎ExecutionEngine 执行引擎Portfolio 投资组合Trader 交易者Strategy 策略实际上方向见图注行情从 DataClient 进总线 → DataEngine 订阅管理 → 推给策略策略下单 → Trader → 总线 → RiskEngine 校验 → ExecutionEngine 执行 → ExecutionClient 出到交易所成交回报原路回来写到 CachePortfolio 据此结算。三种运行环境这套架构有个绝妙之处同一套组件换一层适配就能在三种环境里跑。Backtest回测DataClient 和 ExecutionClient 都换成模拟适配器数据从历史文件重放成交量由内置撮合器出时间按ts_event确定性推进。跑完结果绝对可复现。Sandbox沙箱/模拟盘DataClient 接真实行情或模拟行情ExecutionClient 接模拟撮合/模拟账户行为和实盘几乎一致但不真花钱用来在实盘前做演练。Live实盘DataClient 接真实行情源ExecutionClient 接真实交易所 API。指标是真实的风险也是真实的所以要靠 RiskEngine 和 crash-only 设计兜底。区别只在端口连的是什么内核、总线、引擎、策略代码一层都不用改。这正是事件驱动 六边形架构带来的核心红利环境切换不进业务代码。确定性可复现同一套 内核总线引擎策略Backtest历史重放内置撮合Sandbox真实行情模拟账户Live真实行情真实交易所小结NautilusKernel 是中央内核crash-only 设计负责装配与指挥。MessageBus 是总线组件间全靠消息解耦。Cache 是内存账本提供确定性的实时查询。Data/Risk/Execution 三大引擎分别管行情、风控、订单执行。Portfolio 记账Trader 是统一门面策略只跟 Trader 打交道。同一套组件换适配器即可在 Backtest / Sandbox / Live 三环境跑。下节预告主干讲完了但有个问题悬而未决这套内核怎么接上任意交易所答案在 DataClient / ExecutionClient 这些端口和它们的适配器上。下一节专门讲六边形架构的 Ports and Adapters以及 Rust/Python 的 FFI 桥接原理。点赞收藏关注三连我们下节见。
返回列表