Kyle 的 Lambda 和信息不对称:价格冲击的拍卖模型
为什么大单比小单推动价格更多?Kyle (1985) 把答案压缩成一个数 lambda:每单位净成交流推动多少价格。这篇从三类参与者的博弈把 lambda 推出来,再讲怎么在真实数据里估它。
如果你想过为什么 100000 股买单比 100 股买单推动价格更多,你需要 Kyle 模型。如果你写过执行算法,眼睁睁看它”追价”,你需要 Kyle 模型。如果你想知道”流动性”在量化意义上到底指什么,你需要 Kyle 模型。
Kyle (1985) 是微观结构里被引用最多的论文之一。它的答案浓缩成一个数——lambda:每单位净成交流推动多少价格。这个数不是从供需曲线里拍出来的,它是从一场信息不对称的博弈里解出来的,而这正是模型的价值:它告诉你价格冲击的根源不是”订单大”,而是”订单可能知道些什么”。Harris 在第 10 和 13 章处理过 Kyle;后续的一切——Hasbrouck 的信息份额、Almgren-Chriss、平方根冲击律——都踩在它上面。下面把它推出来。
模型设定
Kyle 的模型是个单期拍卖,三类参与方,各拿一手牌。
知情交易者观察到资产真实价值 —— 是市场的先验期望, 是先验方差。他知道别人不知道的东西,问题是怎么用。噪声交易者随机下单 ,跟价值无关——他们因为调仓、对冲、手痒而交易。做市商最惨:只看得到总成交流,看不到单笔是谁下的,还必须给出清价格。
知情交易者选择买卖量 ( 就卖),跟噪声流混在一起送到做市商面前:
做市商看到 后线性定价:
就是价格冲击系数——Kyle 的 lambda。注意此刻它还是个待定的数:博弈的均衡会把它钉死。
知情交易者的期望利润(为简单起见设 ,知情者买入):
这个表达式里已经藏着全部张力: 越大赚得越多,但 的冲击也把自己的成交价推得越差。
第一步:知情交易者怎么下单
给定 ,对 求偏导:
解得:
知情者的订单对价值缺口 是线性的,按 缩放。读一下方向:lambda 高(市场对流量敏感)时他收敛着买,因为每多一股的冲击成本更高;lambda 低时他放开买。知情者不是把信息一次性砸进市场——他在冲击成本的约束下配给自己的信息。这一步拿到的是:知情流量的强度反比于 lambda。
第二步:做市商怎么定价
做市商在竞争下期望利润为零,所以价格必须等于条件期望价值:。他看到的总流量是:
假设线性更新(正态分布下这不是近似,是精确的贝叶斯后验):
要让定价规则自洽,。现在用贝叶斯公式把 显式解出来,就能反过来钉死 。
流量的矩:
正态理论给出条件期望:
协方差这块,因为 且 与 独立:
代回去:
第三步:闭环
定价规则要求价格斜率等于这个贝叶斯斜率——但贝叶斯斜率本身又依赖知情者对 的反应。均衡就是这个不动点:
交叉相乘:
这就是 Kyle 的结果:lambda 等于基本面波动率与噪声交易波动率之比的一半。
停在这个公式上多看一眼。基本面不确定性大( 大)而噪声交易少( 小)时,lambda 大——每单位流量信息含量高,价格反应剧烈。基本面平稳、噪声交易汹涌时,lambda 小——流量大部分是噪声,做市商不为所动。机制在于分辨难度:噪声多的时候,做市商分不清谁知情谁不知情,只好对每单位流量少反应一点;噪声少的时候,每单位流量都可疑,冲击就高。
由此得出一个不那么显然的结论:市场深度是内生的。深度不是交易所”提供”的属性,它是知情与不知情参与者混合比例的均衡结果。一个知情者扎堆、噪声交易稀薄的市场,想深也深不了——噪声交易者是流动性的燃料。
把 Lambda 从数据里估出来
模型给的 没法直接用—— 和 都观察不到。但模型同时给了可观测的回归结构。标准做法:
是(有方向的)中间价变动, 是有方向成交流——主动买量减主动卖量,OLS 估计。
量级感(都是数量级参考,随情景、时段、波动率环境大幅漂移,不是常数)。美股大盘流动股票,lambda 约 每美元:$1M 净买入推动价格约 $0.05,对 $100 的股票是 5 bp——跟经验估计对得上。流动性差的小盘股,lambda 约 $5 \times 10^{-7}$ 每美元:$100K 净买入推动约 10 的股票是 50 bp。注意量纲: 用价格单位、 用美元时,lambda 的量纲是(价格)/(美元)——lambda 本质上是”深度的倒数”,这也是为什么它能直接当非流动性度量用(第 7 篇的 Amihud 度量就是这个思路的日频粗化版)。
跨资产的量级表:
| 资产类 | Lambda 典型值(每 $) | 订单冲击 |
|---|---|---|
| 美股大盘 | 到 | 1–10 bp |
| 美股小盘 | 到 | 10–100 bp |
| 新兴市场股票 | 到 | 100 bp – 1% |
| 加密主流 | 到 | 10–100 bp |
| 加密山寨 | 到 | 1%–10% |
| 外汇主要 | 到 | < 1 bp |
而且 lambda 在同一个资产内部也不是常数:波动率升高它跟着升(知情者可赚的更多了——正是 变大),开盘收盘比盘中高,宏观公告前后飙升,崩盘和反弹期间飙升。一个稳健的执行策略应该实时滚动估计 lambda 并调整轨迹——Arithmion 的 AdaptiveKyle 模块干的就是这件事。
多期扩展:拆单的理论基础
单期模型里知情者只有一次出手机会。多期扩展(Kyle, 1985 第五节;Back, 1992 的连续时间版)让故事更接近真实:每一期知情者按当前信念和 lambda 选 ,做市商定 ,价格在 期里逐渐漂向 。
关键的新现象:知情者会主动把成交拆散来隐藏信息。他的累积订单近似满足:
总知情流量是价值缺口除以 lambda,跟 无关;每期成交按 缩放。期数越多,他拆得越碎——每一小笔都藏在噪声里,信息泄露得越慢,他赚得越多。
这就是拆单策略的理论出生地。你有 alpha 时不一笔砸出全部仓位,跟 Kyle 的知情者是同一个算计:无 alpha 衰减时最优近似均匀成交,有衰减时向前端倾斜。Almgren-Chriss(第 9 篇)把这个直觉工程化——Kyle 给框架,Almgren-Chriss 加上暂时/永久冲击的区分并解出最优轨迹;Kyle 的 lambda 在那边就是永久冲击系数 的理论原型。
跟平方根冲击律怎么调和
Kyle 的冲击是线性的:流量 推动价格 。但经验测量的大单冲击是次线性的,按 缩放——第 8 篇的平方根律。矛盾吗?
不矛盾,两者度量的东西不同。Kyle 的 lambda 是边际冲击——此刻、此状态下,多一单位流量推多少价格。平方根律是累积冲击——一笔 metaorder 从头到尾对价格的总推动。知情者跨期交易时,每买一点就泄露一点信息,后续的边际冲击随之衰减,把边际冲击沿轨迹积分,得到的累积冲击就是凹的。一个是另一个的导数。做执行时这个区分是实打实的:lambda 常数的世界里总冲击 线性增长,lambda 随你的成交衰减的世界里总冲击次线性——大单没有你想的那么贵,但前提是你拆得够耐心。
暗池:lambda 趋零的角落
一个现代注脚。暗池和其他隐藏流动性场所里,lambda 比亮市场低得多——不是因为参与者更善良,而是因为成交流不显示,触发不了做市商的贝叶斯更新。同一笔 $1M 单送到亮交易所,你在簿上一路走,把价格按 Kyle 的 lambda 推开;送到暗池,可能跟单一对手方直接成交,冲击接近零。
这就是暗池存在的经济学:自认非知情的机构流量(调仓、指数化)躲进去避免为”可能知情”的嫌疑付费。而在暗池里接单的那一侧要自己做毒性检查——模型的逻辑没有消失,只是从定价规则移进了对手方的风控。觉得接了知情人,就报更宽或拒绝成交。监管层面这事也不干净:SEC 在 2014 年前后针对暗池的执法发现有池子在执行质量与运作方式上误导用户。Harris 第 25 章讲了相关监管背景。
Kyle 里的价差、库存的缺席
Kyle 模型里没有买卖价差——做市商连续定价。但可以从 lambda 反推一个隐含价差:规模 的市价单成交在 ,相对先验 的让价 对这笔单来说就扮演有效半点差;一买一卖的往返成本约 。顺带一提,知情者在最优规模上的利润恰好等于 (把 代回利润式即得)——他赚的每一分都来自噪声交易者的口袋,经由做市商的定价规则转手。
模型里同样缺席的是库存:Kyle 纯粹是信息模型。Stoll (1978) 和 Ho-Stoll (1981) 补上库存那半边。两者互补——信息决定冲击的永久分量,库存决定暂时分量。落到买卖价差上,经典分解是:
三个分量各占多少,经验答案对估计方法非常敏感,不同模型能给出差很远的比例——这正是第 12 篇(价差分解)的主题,这里不剧透。Harris 第 13 章把这个分解讲得很明确。
Python 经验估计
估 lambda 的最简回归器:
import numpy as np
import pandas as pd
import statsmodels.api as sm
def estimate_kyle_lambda(prices, signed_flow, lags=1):
"""
用价格变动对有方向成交流做回归。
prices: 中间价数组
signed_flow: 有方向(买-卖)成交量数组
"""
dp = np.diff(prices)
flow = signed_flow[1:] # 对齐
if lags > 1:
# 构造滞后预测量
X = pd.DataFrame({"flow": flow})
for k in range(1, lags):
X[f"flow_lag{k}"] = pd.Series(flow).shift(k).bfill()
X = sm.add_constant(X)
model = sm.OLS(dp, X.values, missing="drop").fit()
return float(model.params[1]) # 当期 lambda
else:
X = sm.add_constant(flow)
model = sm.OLS(dp, X).fit()
return float(model.params[1])
# 玩具数据:真实 lambda = 5e-7(价格/股),冲击写进价格路径里
rng = np.random.default_rng(0)
lam_true = 5e-7
flow = rng.normal(0, 1000, 10_000)
prices = 100 + np.cumsum(lam_true * flow + rng.normal(0, 0.01, 10_000))
print(f"Lambda 估计: {estimate_kyle_lambda(prices, flow):.3e}") # ≈ 5e-7
注意玩具数据的构造:冲击必须写进价格路径(lam_true * flow 进 cumsum),回归才有东西可估——这也提醒你回归估的是”流量与同期价格变动的共变”,混进价格里的任何其他共变因素都会污染它。真实应用要用高频数据、日内窗口、对波动率聚集的控制。Harris 第 13 章给了实战派版本,Hasbrouck (2007) 第 4 章给了正式版本。
Arithmion 算什么
arithmion.microstructure.KyleModel 提供单期 Kyle 模型标定、多期仿真(知情者执行路径)、从成交流和价格数据估计 lambda,以及通过 lambda → 冲击系数映射桥接到 Almgren-Chriss(第 9 篇)。在 Arithmion 里搭执行算法时,你指定暂时冲击函数和 Kyle 风格的永久冲击系数,模拟器建模价格轨迹和实现成本;AdaptiveKyle 的滚动估计器负责让 lambda 跟上市况。
Kyle 模型四十年没被换掉,原因值得记住:它用三个参与者和一条线性定价规则,把”流动性""深度""冲击”这些含糊的词全部变成了一个可估计、可检验、可接进执行算法的数。往下读,第 8 篇讲这个线性故事在大单上如何弯成平方根,第 9 篇讲怎么拿着 lambda 去规划你自己的成交轨迹。
参考文献
- Harris, L. Trading and Exchanges: Market Microstructure for Practitioners. Oxford University Press, 2003. 第 10 章(信息),第 13 章(dealers)。ISBN: 978-0-19-514470-3.
- Kyle, A. “Continuous Auctions and Insider Trading.” Econometrica, 1985.
- Back, K. “Insider Trading in Continuous Time.” Review of Financial Studies, 1992.
- Hasbrouck, J. Empirical Market Microstructure. Oxford University Press, 2007. 第 4 章(价格冲击)。ISBN: 978-0-19-518115-9(精装)/ 978-0-19-539320-0(平装)。