Ⅱ · 框架解剖 — 2.3

LEAN · 引擎装配与运行边界

先分开看配置装配与一次运行,才能理解五类 handler、QCAlgorithm 与外部数据和券商的关系。

这里有两张不同的问题

LEAN Engine 是 C# 编写的算法交易引擎,策略可用 C# 或 Python 编写。LEAN CLI 和 QuantConnect 的云端产品可以调用或承载它,但不是 Engine 的同义词。

读这一章时,先把两个问题分开:

  1. 装配:回测、纸上或实盘时,数据、成交和结果分别由什么实现接入?
  2. 运行:当某个时刻的数据抵达后,算法、订单、组合状态和输出如何互相影响?

上一版把这两种关系放在同一张图里,容易把 handler 当成一条从左到右的流水线。它们实际是五个独立的边界角色。

先看装配:同一个 Engine,用不同 handler 接入不同运行环境config.jsonenvironment =backtest / live / paper选择具体实现不是策略逻辑,而是外部边界适配ISetupHandler启动时准备现金、订阅、算法初始状态回答:算法从什么初始世界开始?IDataFeed从文件或实时流按时间提供数据回答:下一时刻有哪些数据进入算法?ITransactionHandler把订单交给成交模型或券商连接回答:订单如何成交,结果如何回来?IRealtimeHandler提供日终、定时等时间事件回答:除了行情外,何时触发日历事件?IResultHandler接收日志、统计、图表和运行结果回答:人或外部系统从哪里读取结果?五类 handler 是五个可替换的边界角色,不是 “Setup → Data → Transaction → Realtime → Result” 的串行数据流。
这张图只回答“Engine 如何被装配”。例如,回测与实盘可以换掉数据或事务 handler,而算法代码仍面对同一种运行接口。

五类 handler 到底各管什么

handler 它解决的问题 一个具体例子 它不负责什么
ISetupHandler 算法以什么账户、订阅和初始状态启动 回测建立初始现金与证券订阅 每一根 K 线的计算
IDataFeed 未来哪个时刻有哪些数据可用 从本地文件回放,或把实时源整理为框架数据 决定买卖信号
ITransactionHandler 订单如何送往成交模型或券商,并把回报带回 回测用 fill model,实盘用 brokerage adapter 制定组合仓位目标
IRealtimeHandler 没有行情时,哪些日历或时钟事件仍需触发 日终处理、定时调度 拉取行情历史
IResultHandler 日志、统计、图表和结果送往哪里 写回测报告或把日志输出到控制台 改写订单或策略状态

config.json 中的 environment 为这些接口挑选具体实现,所以同一份算法可以在不同环境使用不同数据或执行边界 官方文档。这不意味着只改一个配置就能保证实盘语义相同,券商规则、实时数据质量和延迟仍需要单独验证。

一次运行时,事件怎么走

再看运行:五个边界如何在一次 Engine 运行中各自接入LEAN Engine数据文件 / 实时流外部市场数据IDataFeed时序输入Slice同一时刻数据QCAlgorithmon_data(Slice)策略状态与决策Transactions · Portfolio订单与组合状态ITransactionHandler订单执行边界成交模型 / 券商成交、拒绝、回报IRealtimeHandler日终、定时事件IResultHandler日志、统计、输出ISetupHandler → initialize()订单事件按日历触发回调订单请求读图顺序:数据与时间事件进入算法;算法发出订单;成交结果更新状态,并通过 on_order_event 回到算法。结果输出是另一条旁路。
这张图才是运行时的因果关系。它与上图的配置装配分开,避免把“选择实现”误读为“事件流”。

图中最重要的两个对象是:

  • Slice:某一时刻能交给算法的已同步数据集合。on_data(slice) 不是“单根 K 线回调”的同义词,它可能同时包含多个订阅的数据。
  • QCAlgorithm:策略的入口和状态容器。它读取 Slice,访问 SecuritiesPortfolioTransactions 等运行状态,随后提出订单或持仓目标。

订单的结果不是直接修改策略变量。成交、拒绝或取消先形成订单事件,更新订单与组合状态,再经 on_order_event(order_event) 交给策略。这样策略能区分“我发出了请求”和“市场或券商确认了什么”。

Engine 层与 Algorithm Framework 层

Algorithm Framework 的 Universe、Alpha、Portfolio Construction、Risk Management 和 Execution 模型位于 QCAlgorithm 的可选策略组织层。它们不是上图五类 handler 的替代品:前者组织“根据数据想持有什么”,后者处理“数据、时间、成交和结果从哪里来”。

如果一个策略直接在 on_data 中发订单,它仍运行在 LEAN Engine 上,只是没有采用完整的 Algorithm Framework 流水线。下一节会解释时间片与订单事件,3.4 再单独解释其中的风险模型。