第 6 章 · 02 多资产支持 Securities 14 类


文档摘要

第 6 章 · 02 多资产支持 Securities 14 类 本节摘要:本节钻取 Lean 的多资产层—— 下约 4.3 万行代码、14 个资产子目录。从股票(Equity)、外汇(Forex)、差价合约(Cfd)、加密货币(Crypto)及其期货(CryptoFuture),到期权(Option)、期货(Future)及其期权(FutureOption)、指数(Index)、指数期权(IndexOption),每类资产各有自己的 BuyingPower(保证金)、Volatility(波动率)、Positions(持仓)、Fees(手续费)配置。

第 6 章 · 02 多资产支持 Securities 14 类

本节摘要:本节钻取 Lean 的多资产层——Common/Securities 下约 4.3 万行代码、14 个资产子目录。从股票(Equity)、外汇(Forex)、差价合约(Cfd)、加密货币(Crypto)及其期货(CryptoFuture),到期权(Option)、期货(Future)及其期权(FutureOption)、指数(Index)、指数期权(IndexOption),每类资产各有自己的 BuyingPower(保证金)、Volatility(波动率)、Positions(持仓)、Fees(手续费)配置。统一的入口是 Security 对象——Securities[name] 返回它,内含价格缓存 Cache、持仓 Holdings、交易所时段 Exchange,以及 FeeModel/FillModel/BuyingPowerModel/VolatilityModel 等可替换模型。SecurityService 是工厂,根据 Symbol 的 SecurityType 实例化对应的子类并装上默认模型。各资产还有特有数据类型(Option 有 OptionChain、Future 有 FutureChain)。读完本节,你理解了 Lean "一套引擎,14 类资产" 的抽象根基。

内容来源:原项目源码 Common/Securities/ 目录结构、Security.csSecurityService.csCommon/Data/Market/OptionChain.csFuturesChain.cs,精读并套用体系化模板。

⚠️ 注意:本节是资产层的"地图",重点是 Security 对象结构 + 各资产配置差异,不展开每个模型内部算法(那是后续章节)。

学习目标

阅读完本节,你应当能够:

  1. 列出 14 个资产子目录及其代表资产。
  2. 说清 Security 对象的关键成员(Cache/Holdings/Exchange/FeeModel 等)。
  3. 理解各资产各自配置 BuyingPower / Volatility / Positions / Fees。
  4. 解释 SecurityService 如何按 SecurityType 工厂式创建子类。
  5. 知道 Option/Future 各自的特有数据类型(OptionChain/FutureChain)。

一、Securities 目录:14 类资产的大本营

Common/Securities 下一级子目录(ls 实测):

Cfd/ Forex/ FutureOption/ Option/ Crypto/ Future/ Index/ IndexOption/ CryptoFuture/ Positions/ Volatility/ Interfaces/ CurrencyConversion/ Equity/

按资产类别归类的 14 个核心子目录(部分共用基础设施如 Volatility/Positions/Interfaces):

资产子目录 SecurityType 代表标的
Equity 股票 AAPL、MSFT
Forex 外汇 EURUSD、USDJPY
Cfd 差价合约 GER30(德指 CFD)
Crypto 加密现货 BTCUSD
CryptoFuture 加密期货 BTCUSD perp
Future 期货 ES、CL
FutureOption 期货期权 ES 期权
Option 股票期权 AAPL 期权
Index 指数 SPX
IndexOption 指数期权 SPX 期权

💡 钻取要点:之所以拆这么多子目录,是因为每类资产的"交易规则"差异巨大——股票 T+股数、外汇按手数、期货按合约乘数、期权要算希腊值。每类资产目录里都有自己的 XxxCache/XxxHolding/XxxExchange/XxxBuyerPowerModel 等,继承通用基类后覆写差异部分。

二、各资产的四大配置

每个资产子目录核心都在解决四件事:

  1. BuyingPower(购买力/保证金):下单前算"账户还有多少可用资金"。股票全款,期货/外汇/期权要保证金。例如 PatternDayTradingMarginModel(美股 PDT 规则)、FutureMarginModelOptionMarginModel
  2. Volatility(波动率模型):期权定价、风控要用。基类在 Volatility/ 下,Option 用 BlackScholes 推导的 IVolatilityModel,股票常用 RelativeStandardDeviationVolatilityModel
  3. Positions(持仓):Positions/ 目录定义持仓抽象。股票持仓是简单股数,期权持仓还要带希腊值贡献。
  4. Fees(手续费):IFeeModel 接口,各券商费率不同,可通过 SetFeeModel() 替换(如 InteractiveBrokersFeeModel)。

三、Security 对象:统一入口

Common/Securities/Security.cs:47:

47 public class Security : DynamicObject, ISecurityPrice 93 public Symbol Symbol { get; } 183 public SecurityCache Cache { get; set; } // 价格缓存(最新价/历史) 193 public SecurityHolding Holdings { get; set; } // 持仓(数量/均价/盈亏) 204 public SecurityExchange Exchange { get; set; } // 交易所时段(开收盘) 220 public IFeeModel FeeModel { get; set; } // 手续费模型 229 public IFillModel FillModel { get; set; } // 成交模型(模拟滑点) 247 public ISecurityPortfolioModel PortfolioModel { get; set; } 256 public IBuyingPowerModel BuyingPowerModel { get; set; } // 保证金/购买力 265 public IBuyingPowerModel MarginModel { get; set; } // 保证金别名 283 public ISettlementModel SettlementModel { get; set; } // 资金结算 292 public IVolatilityModel VolatilityModel { get; set; } // 波动率 305 public ISecurityDataFilter DataFilter { get; set; } // 异常 tick 过滤

对照官方文档图 Documentation/4-security-object.jpg:Securities["AAPL"] 返回的 Security 对象包含——价格(走 Cache)、持仓(走 Holdings)、属性(走一系列 Model)。所有 Model 都是接口,可随时 SetFeeModel()/SetVolatilityModel()/SetBuyingPowerModel() 替换。

Security.cs:327 还有一个动态访问入口:

327 public dynamic Data { get; } // 动态访问缓存中的各类数据

Datadynamic,允许算法里 Securities["AAPL"].Data.Dividend 这种写法,运行时按缓存里的实际类型派发。

四、Holdings 与 Cache:持仓与价格

Security.cs 的两个核心聚合:

183 public SecurityCache Cache { get; set; } // 缓存最近一个数据点 193 public SecurityHolding Holdings { get; set; } // 持仓对象 510 public virtual bool HoldStock => Holdings.HoldStock; // 是否持仓 541 public virtual decimal Leverage => Holdings.Leverage; // 杠杆
  • Cache:存"最新价/最新 bar"等流式数据,算法取 Securities["AAPL"].Price 实际走 Cache 的最新值。
  • Holdings:存"持仓数量/平均成本/未实现盈亏",下单成交后由 Portfolio 更新。

各资产子类有特化版本:EquityCache/EquityHoldingForexHoldingOptionHolding(带希腊值)等,继承基类加字段。

五、SecurityService:工厂创建

Common/Securities/SecurityService.cs:31:

31 public class SecurityService : ISecurityService

它的 Create 方法是工厂——根据 Symbol 的 SecurityType 实例化对应子类并装上默认模型。SecurityService.cs:106-173 关键分派逻辑:

106 if (symbol.SecurityType == SecurityType.Base && ...) ... // 自定义 Base 113 if (symbol.ID.SecurityType == SecurityType.Forex) ... 118 if (symbol.ID.SecurityType == SecurityType.Crypto && ...) ... 127 symbol.SecurityType, 146 if (symbol.SecurityType != SecurityType.Cfd) ... // CFD 货币推导 165 bool hasDataTypes = ...; 168 sessionDataTypes = SubscriptionManager.DefaultDataTypes()[symbol.SecurityType]; 173 switch (symbol.ID.SecurityType) // 装配默认模型

Create 干三件事:

  1. 按 SecurityType 选子类:Equity → QuantConnect.Securities.Equity.Equity,Option → Option,以此类推。
  2. 从 SymbolPropertiesDatabase 取合约规格:点值、最小变动、合约乘数(如 ES 期货点值 50 美元)。
  3. 装默认模型:FillModel、FeeModel、BuyingPowerModel、VolatilityModel 按资产默认值注入,算法可后续覆写。

六、各资产特有的数据类型

部分资产有"链式"数据类型,只有该资产才有:

资产 特有数据类型 文件
Option OptionChain / OptionContract Common/Data/Market/OptionChain.cs
Future FuturesChain / FuturesContract Common/Data/Market/FuturesChain.cs
期权/期货 Greeks(希腊值) Common/Data/Market/Greeks.cs

OptionChain.cs:27:

27 public class OptionChain : BaseChain<OptionContract, OptionContracts>

FuturesChain.cs:26:

26 public class FuturesChain : BaseChain<FuturesContract, FuturesContracts>

两者都继承 BaseChain<TContract, TContracts>——一个泛型的"合约链"容器。算法里 OnData(OptionChains chains) 拿到的就是当天可交易的全部期权合约,按到期日/行权价组织。

💡 钻取要点:这种"链 + 合约"抽象让期权/期货能用同一套 API:遍历 chain 找符合行权价/到期日的合约,然后像普通 Security 一样下单。BaseContract 定义了通用合约字段(到期日、行权价、乘数),特化类再加各自字段。

七、用一行代码访问资产

算法里的典型用法:

// AddData / AddEquity 后,Securities 字典里就有 var aapl = Securities["AAPL"]; // 拿到 Security 对象 var price = aapl.Price; // 走 Cache var holding = aapl.Holdings.Quantity; // 走 Holdings var fee = aapl.FeeModel; // 拿到 FeeModel aapl.SetFeeModel(new InteractiveBrokersFeeModel()); // 替换手续费

SecuritiesSecurityManager(继承自 Dictionary<Symbol, Security>)。无论什么资产,通过 Securities[symbol] 拿到的都是同一个 Security 接口——这就是 Lean "一套引擎,14 类资产"的统一抽象。

本节要点回顾

  1. 14 个资产子目录:Equity/Forex/Cfd/Crypto/CryptoFuture/Future/FutureOption/Option/Index/IndexOption 等,各约数千行。
  2. 四大配置:BuyingPower(保证金)/Volatility(波动率)/Positions(持仓)/Fees(手续费),每资产默认值不同。
  3. Security 对象:Symbol + Cache(价) + Holdings(仓) + Exchange(时段) + 一组可替换 Model(Fee/Fill/BuyingPower/Volatility/Settlement)。
  4. SecurityService 是工厂:按 SecurityType 实例化子类 + 装默认模型 + 取 SymbolProperties。
  5. 特有数据类型:Option 有 OptionChain/OptionContract,Future 有 FuturesChain/FuturesContract,共用 BaseChain<T> 泛型容器。
  6. 统一访问:Securities[symbol] 返回 Security,所有资产一个接口。
  7. 模型可替换:SetFeeModel()/SetVolatilityModel() 等让用户灵活定制券商行为。

下一节,我们看动态选股——UniverseSelection 如何根据条件在运行中增删标的。


作者与出处
原作者: 灏天文库
整理: 灏天文库整理
本站整理收录,版权归原作者/开源协议所有;欢迎通过原文链接访问源仓库。
发布者: 作者: 灏天文库 转发
评论区 (0)
U