3. LEAN引擎概述
在进入量化回测实战之前,必须先建立对LEAN引擎整体结构的清晰认知。LEAN是QuantConnect开源的算法交易引擎,采用C#编写,同时提供Python接口,其设计目标是用同一套策略代码贯穿回测、纸上交易与实盘交易。理解它的架构与组件边界,能帮助你在后续章节中快速定位问题:数据从哪里来、订单如何被撮合、指标在哪个阶段更新、结果由谁汇总。
一、核心原理:事件驱动的分层架构
LEAN的本质是一个事件驱动的引擎。它不采用“向量化一次性计算”的思路,而是模拟真实市场的时间推进:每一条数据到达,都会触发一次时间切片(Time Slice),引擎按固定顺序调用你的策略逻辑。这种设计让回测与实盘的执行路径高度一致,减少“回测能跑、实盘失效”的偏差。
从分层角度看,LEAN可拆为四层:
- 数据层(Data Feed):负责从本地文件、数据库或云端拉取行情,统一转换为引擎内部的数据对象,并按时间排序推送。
- 核心引擎层(Engine):包含时间管理、事件调度、证券组合管理、订单管理与撮合模拟,是回测的“心脏”。
- 算法层(Algorithm):你编写的QCAlgorithm子类,包含Initialize、OnData等回调,是策略逻辑的唯一入口。
- 结果层(Result Handler):收集净值曲线、成交记录、统计指标与日志,输出为报告或推送至前端。
这四层之间通过事件队列解耦。数据层产生Slice事件,引擎层将其分发给算法层,算法层产生的订单再回到引擎层撮合,最终由结果层记录。理解这条链路,就能明白为什么在OnData中直接访问未来数据会出错——因为时间切片是严格单向推进的。
二、方法流程:一次回测的完整生命周期
下面用一段典型的LEAN回测启动流程,说明各组件如何协作。以Python算法为例:
from AlgorithmImports import *
class MomentumAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 1, 1)
self.SetEndDate(2023, 1, 1)
self.SetCash(100000)
self.AddEquity("SPY", Resolution.Daily)
self.sma = self.SMA("SPY", 20, Resolution.Daily)
def OnData(self, data):
if not self.sma.IsReady:
return
if not self.Portfolio.Invested and self.Securities["SPY"].Price > self.sma.Current.Value:
self.SetHoldings("SPY", 0.8)
elif self.Portfolio.Invested and self.Securities["SPY"].Price < self.sma.Current.Value:
self.Liquidate("SPY")
执行时,引擎依次完成:初始化(Initialize)→ 加载数据 → 逐日推进时间 → 更新指标 → 调用OnData → 处理订单 → 记录结果。其中指标更新先于OnData,这是LEAN的固定顺序,避免你在OnData中手动计算指标时引入时序错误。
三、支持市场与资产类别
LEAN覆盖的市场范围较广,常见资产类别如下表所示。不同资产类别的数据分辨率、交易时间与费用模型不同,回测时需分别配置。
| 资产类别 | 典型市场 | 常用分辨率 | 注意事项 |
|---|---|---|---|
| 股票(Equity) | 、港股等 | 分钟、日线 | 需处理拆股与分红调整 |
| 外汇(Forex) | 主要货币对 | 秒、分钟 | 点差与杠杆影响显著 |
| 期货(Future) | CME、ICE等 | 分钟、日线 | 需指定合约与展期规则 |
| 期权(Option) | 期权 | 分钟、日线 | 链式数据与希腊字母计算 |
| 加密货币(Crypto) | 主流交易所 | 秒、分钟 | 7×24交易,无休市 |
| CFD与差价合约 | 多市场 | 分钟、日线 | 保证金与隔夜费 |
在本地研究中,数据需要按LEAN的目录规范存放,例如股票日线数据通常放在data/equity/usa/daily/下,文件名与格式需符合引擎解析要求。若使用云端,数据由平台统一提供,无需本地维护。
四、社区版与云端差异
LEAN社区版(Local/CLI)与QuantConnect云端(Cloud)在核心引擎上一致,但使用体验与限制不同。主要差异如下:
- 数据来源:社区版需自行准备或购买数据;云端内置多市场数据,开箱即用。
- 计算资源:社区版依赖本地CPU与内存;云端提供可扩展的算力与并行回测。
- 协作与部署:云端支持项目共享、版本管理与一键实盘;社区版更适合本地研究与离线调试。
- 成本:社区版开源免费,但数据与运维成本自担;云端按订阅与算力计费。
五、常见误区与复盘
初学者常犯的错误包括:在Initialize中直接访问行情数据(此时数据尚未加载);在OnData中重复添加同一资产导致重复订阅;忽略指标预热期,在IsReady为False时下单;以及混淆社区版与云端的数据路径。复盘时,建议先检查日志中的时间线与订单事件,确认数据是否按预期到达,再核对指标值与信号逻辑。