跳到正文

Hasbrouck 信息份额:度量一笔成交告诉市场什么

价格的波动里多少是信息,多少是噪音?Hasbrouck 1991 年用一个双变量 VAR(成交方向和收益)把这个问题变成了可以估计的量。30 多年后它还是标准做法。

第 9 篇 · 共 12 篇 约 11 分钟

每当你下一笔交易,价格都会动。问题是:动多少?其中多大比例是永久的?

如果你用 100 股买苹果,价格只涨了半美分,那基本是噪音,半分钟内就会均值回复。如果你用 100 股买苹果,价格跳了 1 美元并停在那里,那是信息。市场从你这笔交易(或者从对你的推断)里学到了东西。

Hasbrouck 信息份额(Hasbrouck, 1991)就是把第二种情况量化的方法。给定一串成交和一串价格变化,价格变动里有多大比例是”永久的”(信息)vs. “短暂的”(微观结构噪音)?上一篇 Glosten-Milgrom 从理论上告诉你成交为什么会永久移动价格;这一篇给你一台能在真实数据上跑的测量仪。Harris 也给了篇幅(Harris,《Trading and Exchanges》,第 10 和 13 章)。

一个术语提醒:文献里 “information share” 这个词更常指 Hasbrouck 后来那篇跨市场价格发现测度(Hasbrouck, 1995,同一资产在多个市场交易时,哪个市场贡献了价格发现)。本文沿用这个词指 1991 年那篇的”成交流对价格方差的贡献份额”。两者思想同源,但对象不同,查文献时别混。

问题

给你的是:一串成交方向 xt∈{−1,0,+1}x_t \in \{-1, 0, +1\}(或者任何有方向的成交指标;实践中一般从报价对比推断),和一串中间价变化 rt=mt−mt−1r_t = m_t - m_{t-1},其中 mtm_t 是 tt 时刻的中间价。

你想知道:如果我在 tt 时刻观察到一笔买入,后面跟着各种事件,结果价格波动里有几成是”市场学到了东西”?

Hasbrouck VAR

Hasbrouck 模型是对 (rt,xt)(r_t, x_t) 的双变量 VAR:

rt=∑i=1Lairt−i+∑i=0Lbixt−i+ϵ1,tr_t = \sum_{i=1}^{L} a_i r_{t-i} + \sum_{i=0}^{L} b_i x_{t-i} + \epsilon_{1,t} xt=∑i=1Lcirt−i+∑i=0Ldixt−i+ϵ2,tx_t = \sum_{i=1}^{L} c_i r_{t-i} + \sum_{i=0}^{L} d_i x_{t-i} + \epsilon_{2,t}

其中 LL 是滞后阶数(日频通常 5–20,高频更小)。残差 ϵ1,t\epsilon_{1,t} 和 ϵ2,t\epsilon_{2,t} 是相关的,这个相关性决定了后面的信息份额区间。

如果成交和价格无关(价格随机游走、成交随机),非对角元应该为零。真实数据里都不是:过去的收益影响成交方向(追涨杀跌、均值回归),过去的成交方向影响收益(价格冲击)。这两个方程之间的跨方程结构,抓的就是成交流和价格变动之间的反馈。

Hasbrouck 的关键一步不在估计而在解读:把 VAR 转成移动平均表示,看一笔成交冲击对价格的长期响应,把它从短暂的部分里分离出来。

移动平均表示

把 VAR 求逆得到 MA(∞\infty) 形式:

rt=∑i=0∞αiϵ1,t−i+∑i=0∞βiϵ2,t−ir_t = \sum_{i=0}^{\infty} \alpha_i \epsilon_{1, t-i} + \sum_{i=0}^{\infty} \beta_i \epsilon_{2, t-i} xt=∑i=0∞γiϵ1,t−i+∑i=0∞δiϵ2,t−ix_t = \sum_{i=0}^{\infty} \gamma_i \epsilon_{1, t-i} + \sum_{i=0}^{\infty} \delta_i \epsilon_{2, t-i}

αi\alpha_i 是价格对价格冲击的脉冲响应,βi\beta_i 是价格对成交冲击的脉冲响应。i→∞i \to \infty 时单个系数都衰减到零(rtr_t 是平稳的收益序列),有意思的是累积响应。成交冲击的累积响应收敛到一个非零值:

β∞=∑i=0∞βi>0\beta_\infty = \sum_{i=0}^{\infty} \beta_i > 0

这就是成交冲击的永久价格冲击:一笔成交流量的单位冲击(多一笔买入)把价格水平永久移动 β∞\beta_\infty 个单位。这正是 Glosten-Milgrom 里”dealer 信念被更新后不再回来”那部分,只不过现在是从数据里估出来的。

方差分解

价格变动的方差可以按冲击来源分解:

Var(rt)=σ12∑i=0∞αi2+σ22∑i=0∞βi2+2σ12∑i=0∞αiβi\text{Var}(r_t) = \sigma_1^2 \sum_{i=0}^{\infty} \alpha_i^2 + \sigma_2^2 \sum_{i=0}^{\infty} \beta_i^2 + 2 \sigma_{12} \sum_{i=0}^{\infty} \alpha_i \beta_i

其中 σ12=Var(ϵ1,t)\sigma_1^2 = \text{Var}(\epsilon_{1,t}),σ22=Var(ϵ2,t)\sigma_2^2 = \text{Var}(\epsilon_{2,t}),σ12=Cov(ϵ1,t,ϵ2,t)\sigma_{12} = \text{Cov}(\epsilon_{1,t}, \epsilon_{2,t})。

信息份额是这个方差里归功于成交冲击(第二加第三项)的比例:

IS=σ22∑βi2+2σ12∑αiβiVar(rt)\text{IS} = \frac{\sigma_2^2 \sum \beta_i^2 + 2 \sigma_{12} \sum \alpha_i \beta_i}{\text{Var}(r_t)}

麻烦在交叉项:σ12∑αiβi\sigma_{12} \sum \alpha_i \beta_i 可正可负,所以 IS 理论上可以超过 1 或为负——两类冲击相关时,“这份方差算谁的”没有唯一答案。标准处理是把交叉项分别全归给一侧,得到一个区间:

ISmax⁡=σ22∑βi2+2σ12∑αiβiVar(rt)\text{IS}_{\max} = \frac{\sigma_2^2 \sum \beta_i^2 + 2 \sigma_{12} \sum \alpha_i \beta_i}{\text{Var}(r_t)} ISmin⁡=σ22∑βi2−2σ12∑αiβiVar(rt)\text{IS}_{\min} = \frac{\sigma_2^2 \sum \beta_i^2 - 2 \sigma_{12} \sum \alpha_i \beta_i}{\text{Var}(r_t)}

点估计取两者均值:

IS=ISmax⁡+ISmin⁡2\text{IS} = \frac{\text{IS}_{\max} + \text{IS}_{\min}}{2}

或者干脆报告区间 [ISmin⁡,ISmax⁡][\text{IS}_{\min}, \text{IS}_{\max}]。区间宽说明两类冲击纠缠得深,点估计别太当真。

诚实起见说明一句:Hasbrouck 原文分解的是有效价格(随机游走分量)创新的方差,上面这个对 Var(rt)\text{Var}(r_t) 的版本是结构相同的简化展示,定性结论一致,但你真要复现论文数字,要按原文对随机游走分量做分解(Hasbrouck 2007 教科书第 5 章有完整推导)。

读数

IS=0.5\text{IS} = 0.5:价格变动方差一半是”信息”(永久、源于成交流),一半是”噪音”(短暂、会均值回复)。IS=0.1\text{IS} = 0.1:九成价格变动会弹回来——流动大市值股票在平静日子的常态。IS=0.8\text{IS} = 0.8:价格变动大部分是信息驱动——小盘股有知情流时,或大市值股票在财报前后的样子。

量级参考:流动美股在平常日子估出来的 IS 多落在 0.2–0.6 一带(Harris 第 10 章对成交信息含量的讨论给了实证脉络),具体数字随样本、频率和方法漂移,量级比小数点可靠。IS 越高,市场越在快速吸收信息;IS 越低,噪声交易占比越大。

永久冲击系数

同一套 MA 表示还免费送你一个跟 IS 相关但不同的量:单位成交的永久价格冲击 β∞=∑i=0∞βi\beta_\infty = \sum_{i=0}^{\infty} \beta_i。IS 是个比例,回答”方差里几成是信息”;β∞\beta_\infty 是个绝对量,回答”多一笔买入,价格长期停在高多少的位置”。做执行的人往往更关心后者,因为它直接就是”要流动性”的永久成本。

经验上,成交的永久冲击随规模近似按平方根增长(第 8 篇细讲):规模 QQ 的成交的冲击约与 Q\sqrt{Q} 成比例,而不是与 QQ 成比例。这意味着拆单能省的主要是暂时冲击,永久冲击拆不掉多少。

一个数值例子

一个小例子说明结构。假设我们有下面这个 VAR(1):

rt=0.05rt−1+0.10xt+ϵ1,tr_t = 0.05 r_{t-1} + 0.10 x_t + \epsilon_{1,t} xt=0.20rt−1+0.30xt−1+ϵ2,tx_t = 0.20 r_{t-1} + 0.30 x_{t-1} + \epsilon_{2,t}

Var(ϵ1)=0.01\text{Var}(\epsilon_1) = 0.01,Var(ϵ2)=0.04\text{Var}(\epsilon_2) = 0.04,Cov(ϵ1,ϵ2)=0.005\text{Cov}(\epsilon_1, \epsilon_2) = 0.005。

严格求逆要联立两个方程;这里交叉反馈是二阶小量(0.10×0.20=0.020.10 \times 0.20 = 0.02),略掉它可以手算:rtr_t 对 ϵ1\epsilon_1 的 MA 系数近似 αi=(0.05)i\alpha_i = (0.05)^i,指数衰减;对 ϵ2\epsilon_2 的系数近似 βi=0.10(0.30)i\beta_i = 0.10 (0.30)^i,也衰减。

永久冲击:

β∞=∑i=0∞0.10(0.30)i=0.101−0.30≈0.143\beta_\infty = \sum_{i=0}^{\infty} 0.10 (0.30)^i = \frac{0.10}{1 - 0.30} \approx 0.143

单位成交冲击把价格永久移动 0.143 个单位。三个平方和:

∑αi2=∑(0.05)2i=11−0.0025≈1.0025\sum \alpha_i^2 = \sum (0.05)^{2i} = \frac{1}{1 - 0.0025} \approx 1.0025 ∑βi2=∑(0.10)2(0.30)2i=0.011−0.09≈0.01099\sum \beta_i^2 = \sum (0.10)^2 (0.30)^{2i} = \frac{0.01}{1 - 0.09} \approx 0.01099 ∑αiβi=∑(0.05)i⋅0.10⋅(0.30)i=0.10∑(0.015)i=0.100.985≈0.1015\sum \alpha_i \beta_i = \sum (0.05)^i \cdot 0.10 \cdot (0.30)^i = 0.10 \sum (0.015)^i = \frac{0.10}{0.985} \approx 0.1015

方差贡献:价格冲击 0.01⋅1.0025=0.0100250.01 \cdot 1.0025 = 0.010025;成交冲击 0.04⋅0.01099=0.0004400.04 \cdot 0.01099 = 0.000440;交叉项 2⋅0.005⋅0.1015=0.0010152 \cdot 0.005 \cdot 0.1015 = 0.001015。Var(rt)\text{Var}(r_t) 合计 ≈0.01148\approx 0.01148。

ISmax⁡=0.000440+0.0010150.01148≈0.127\text{IS}_{\max} = \frac{0.000440 + 0.001015}{0.01148} \approx 0.127

这个玩具标定下大约 13% 的价格变动方差归因于成交流。数字本身没意义(是我编的参数),结构有意义:成交冲击方差不小(σ22=0.04\sigma_2^2 = 0.04),但它对价格的传导系数小(βi\beta_i 从 0.10 起衰减),所以贡献份额不高。真实美股数据上你拿到的 IS 一般更高。

Python 实现

用 statsmodels 的简化版本:

import numpy as np
import pandas as pd
from statsmodels.tsa.api import VAR

def hasbrouck_is(returns, trade_signs, lags=10):
    """
    通过双变量 VAR 计算 Hasbrouck 信息份额。
    returns: 价格(或中间价)变化数组
    trade_signs: 有方向成交指标数组(+1 买,-1 卖)
    """
    df = pd.DataFrame({"r": returns, "x": trade_signs})
    var = VAR(df)
    result = var.fit(maxlags=lags, ic="aic")
    res = result.resid
    sigma = res.cov()

    # 通过仿真脉冲响应求移动平均系数
    irf = result.irf(periods=50).irfs  # shape (periods+1, 2, 2)
    # irf[t, 0, 1] 是 r 在 t 时刻对 x 在 0 时刻单位冲击的响应
    alpha = irf[:, 0, 0]  # r 对 r-shock 的响应
    beta = irf[:, 0, 1]   # r 对 x-shock 的响应

    var_r = sigma.iloc[0, 0] * np.sum(alpha**2) + \
            sigma.iloc[1, 1] * np.sum(beta**2) + \
            2 * sigma.iloc[0, 1] * np.sum(alpha * beta)

    trade_contrib = sigma.iloc[1, 1] * np.sum(beta**2)
    cross = 2 * sigma.iloc[0, 1] * np.sum(alpha * beta)

    is_max = (trade_contrib + abs(cross)) / var_r
    is_min = (trade_contrib - abs(cross)) / var_r
    return float((is_max + is_min) / 2), float(beta.sum())

真实实现里最脆的一环不在 VAR,在输入:成交方向。

成交方向推断

你常常不知道一笔是买方主导还是卖方主导。标准修法是 Lee-Ready 算法(1991):

  1. 成交价高于中间价 → 买方主导。
  2. 低于中间价 → 卖方主导。
  3. 正好在中间价上 → 用 quote rule 或 tick test(跟上一笔成交价比较)。

Lee-Ready 在美股数据上准确率大约 80–85%。方向标错不是无害噪音——它系统性地把 β\beta 往零压,IS 会被低估。在高频加密数据上报价可能过时,准确率更差。所以规矩很简单:能拿到交易所侧成交方向数据(部分数据商提供)就用它,拿不到再用 Lee-Ready,并且对结论留出这一层不确定性。Harris 第 10 章讨论过这件事。

一个经验算例

IS 在真实数据上长什么样?构造一个典型情形:一年某美股大盘股的日数据,日中间价收益 rtr_t,日买卖方向净值 xtx_t(来自 Lee-Ready 或数据商)。估计 VAR(5) 得到类似这样的系数:

rt=0.04rt−1+0.03rt−2+…+0.12xt+0.05xt−1+0.02xt−2+ϵ1,tr_t = 0.04 r_{t-1} + 0.03 r_{t-2} + \ldots + 0.12 x_t + 0.05 x_{t-1} + 0.02 x_{t-2} + \epsilon_{1,t} xt=0.15rt−1+0.21xt−1+ϵ2,tx_t = 0.15 r_{t-1} + 0.21 x_{t-1} + \epsilon_{2,t}

收益方程里 xtx_t 的同期系数(0.120.12)是即时价格冲击:净买入一个单位的冲击同日推动价格 0.120.12 单位。滞后系数(0.05,0.020.05, 0.02)较小,意味着冲击一部分会衰减。MA 求逆后累积脉冲响应 β∞=0.12+0.05+0.02+…≈0.20\beta_\infty = 0.12 + 0.05 + 0.02 + \ldots \approx 0.20:一个净买入日永久推动价格 0.20 个单位。信息份额算出来 0.35 左右——日价格方差三分之一是成交驱动的永久部分,其余是噪音(买卖弹跳、暂时的订单流不平衡、均值回复)。

这个模式在美股大盘股的平常日子是典型的,但 IS 不是资产的常数属性。财报前后它能飙到 0.6 以上,因为那时成交流确实有信息;安静的夏季周五能跌到 0.10 以下。同一只股票、同一个月,情景一换数字就换。

跟 Glosten-Milgrom 的联系

在 Glosten-Milgrom 里,dealer 观察到一笔买入后的信念更新意味着价格的永久移动(二元价值、等先验):

E[V∣buy]−E[V]=π(VH−VL)/2E[V \mid \text{buy}] - E[V] = \pi(V_H - V_L)/2

在 Hasbrouck 里,一笔成交冲击的永久价格冲击是 β∞\beta_\infty。把两者对上,就能从经验冲击反推知情者占比:

π≈2 ΔppermVH−VL\pi \approx \frac{2 \, \Delta p_{\text{perm}}}{V_H - V_L}

其中 Δpperm\Delta p_{\text{perm}} 是一笔典型规模成交的永久价格冲击。做个量级演示(数字是演示用的,不是标定):假设一笔典型成交把一只 100 美元的股票永久推动约 1 美分,dealer 的基本面不确定区间 VH−VL≈5V_H - V_L \approx 5 美元,那么 π≈2×0.01/5=0.004\pi \approx 2 \times 0.01 / 5 = 0.004。知情流量占比零点几个百分点——和 Glosten-Milgrom 那篇里从价差反推出的量级一致。两个完全不同的入口(价差 vs. 冲击)指向同一个数量级,这正是两个模型互为表里的证据:Glosten-Milgrom 是给 IS 经济含义的结构模型,Hasbrouck 是它的经验测量工具。

后续文献

Hasbrouck (1991) 在 NYSE/AMEX 股票上做了原始实证。这套框架之后被推到更远:Hasbrouck (1995) 把”信息份额”重新定义为跨市场价格发现的归属问题(同一只股票在多个市场交易,谁先发现价格),成为期货 vs. 现货、跨挂牌市场这类研究的标准工具;Hasbrouck 2007 年的教科书给了现代整理。对实战派来说不用追文献细节,记住用法就行:IS 是个市场质量指标,任何有成交和报价数据的资产类都能算,高 IS 的市场在快速吸收信息,低 IS 的市场噪音占主导。

在策略里怎么用

第一个用法是诊断 edge。如果你跑动量策略,而你的成交持续发生在 IS 高的时段,你的 edge 跟知情交易一致;如果你的成交集中在 IS 低的时段,你可能只是在捡噪音——这个体检便宜,值得做。

第二个用法是给冲击定价。知道了某资产的 β∞\beta_\infty,你就知道自己的成交会永久推动多少价格,这是”要流动性”的不可退还部分。第三个用法接着第二个:标定执行算法。你的 TWAP/VWAP 应该预期市场在执行水平期内永久移动约 β∞⋅Q\beta_\infty \cdot Q(QQ 是总规模);如果算法的价格改善持续小于这个数,你就在冲击上净亏,拆单方式要重新设计。

常见误读,以及它什么时候失灵

“高 IS 意味着市场有效率”——算是半句。IS 高意味着成交流有信息含量,这是效率的一个组成部分,但不意味着价格是基本面价值的无偏估计。“低 IS 意味着没有信息”——也不对,低 IS 只说明信息不通过成交流出来(比如都在报价更新里)。最危险的误读是把 IS 当资产常数:它跨情景剧烈波动,算一次就存档等于没算。

方法本身的边界也要清楚。方差分解在强反馈(价格 → 成交流 → 价格)下会被交叉项主导,IS 区间拉宽、点估计不稳;框架假设有效价格是随机游走,若有效价均值回复则 IS 有偏;成交方向推断的误差直接传进估计;滞后阶数的选择(AIC 是标准做法但不唯一)也会挪动数字。高频应用里实现价差(第 3 篇)通常比 IS 更好解读;IS 最适合日或周频数据,那里随机游走假设站得住。把它当众多工具中的一个,不是真理。

Arithmion 实现

arithmion.microstructure.InformationShare 把上面整条流水线接好了:Lee-Ready 成交方向推断(也接受外部方向)、VAR 自动选滞后阶、IS 点估计加自助法置信区间、永久/暂时冲击分解。输出喂给第 3 篇的 SpreadAnalyzer 和第 8 篇的 ImpactModel。冲击的永久/暂时分解也正是 Almgren-Chriss 执行模型(第 9 篇)的实证地基——那篇把这两个分量放进优化目标里求最优执行轨迹。

参考文献

  • Harris, L. Trading and Exchanges: Market Microstructure for Practitioners. Oxford University Press, 2003. 第 10 章(成交信息含量),第 13 章(价格发现 / dealers)。ISBN: 978-0-19-514470-3.
  • Hasbrouck, J. “Measuring the Information Content of Stock Trades.” Journal of Finance, 1991.
  • Hasbrouck, J. “One Security, Many Markets: Determining the Contributions to Price Discovery.” Journal of Finance, 1995.
  • Hasbrouck, J. Empirical Market Microstructure. Oxford University Press, 2007. 第 5 章(信息份额)。ISBN: 978-0-19-518115-9(精装)/ 978-0-19-539320-0(平装)。
  • Lee, C., Ready, M. “Inferring Trade Direction from Intraday Data.” Journal of Finance, 1991.