halo 的技术博客

返回

同一资产在两个市场的价格

同一只股票,可能同时在纽交所、纳斯达克、几十个暗池里成交;同一家公司的股权,可能在香港有正股、在纽约有 ADR;同一个标的,可能现货、期货、ETF 三条腿一起跳。当这些价格几乎同步波动时,一个看似哲学、实则可量化的问题浮出水面:新信息到底是先进入哪个市场,再被其他市场跟随的?

结论先放这:Hasbrouck (1995) 用协整框架把”价格发现发生在哪里”变成一个 0 到 1 之间的数字——信息份额(Information Share, IS)。 它衡量每个市场对”共同有效价格”随机游走新息的方差贡献占比。IS 高的市场,是价格发现的主战场;IS 低的市场,只是在抄作业。本文在一条合成的两市场 tick 流上完整复现 IS 的估计,展示它绕不过去的 Cholesky 排序上下界问题,并把它与另一个常被混用的度量 Gonzalo-Granger 成分份额掰开对比。合成数据里快市场吃下约 71% 的价格发现份额——但更重要的是理解这个数字什么时候可信、什么时候只是排序假象。

问题的数学骨架:协整与共同有效价格#

多个市场交易同一资产,它们的价格不会长期背离——套利者会把价差摁回去。这在计量上叫协整:单个价格序列各自是非平稳的随机游走(单位根),但它们的线性组合(价差)是平稳的。

Hasbrouck 的核心假设是:存在一个不可观测的共同有效价格 ( m_t ),它是一个随机游走:

mt=mt1+ut,ut(0,σu2)m_t = m_{t-1} + u_t, \quad u_t \sim (0, \sigma_u^2)

每个市场的观测价格 ( p_{i,t} ) 围绕这个有效价格波动,偏离部分是暂时性的(买卖价差跳动、库存效应、噪声):

pi,t=mt+(平稳的暂时成分)p_{i,t} = m_t + \text{(平稳的暂时成分)}

价格发现的本质就是:有效价格的新息 ( u_t ) 是通过哪个市场的交易注入系统的。 如果市场 A 的价格变动总是领先、市场 B 总是滞后跟随,那么新息主要经由 A 进入,A 的信息份额就高。

上图是合成的两市场价格放大窗口:黑线是不可观测的有效价格 ( m_t ),红线(市场 A)几乎贴着黑线走,蓝线(市场 B)明显滞后、抖动更大。肉眼就能看出谁在带节奏——但我们要的是一个可量化、可复现的数字。

从 VECM 到信息份额#

协整系统的标准表达是向量误差修正模型(VECM)。对两市场情形,令 ( z_t = p_{A,t} - p_{B,t} ) 为价差(协整残差),则:

Δpi,t=αizt1+εi,t\Delta p_{i,t} = \alpha_i \, z_{t-1} + \varepsilon_{i,t}

这里 ( \alpha_i ) 是误差修正系数——它衡量当价差偏离均衡时,市场 ( i ) 的价格会以多快的速度回调。关键洞察在于:

  • 一个市场的 ( \alpha ) 越接近 0,说明它越不”负责”纠偏,它在主动定价、别人跟着它调整 → 价格发现份额高;
  • 一个市场的 ( \alpha ) 越大(绝对值),说明它总在被动向别人靠拢 → 价格发现份额低。

先看合成数据估出来的误差修正系数:

import numpy as np

def ols(y, X):
    X = np.column_stack([np.ones_like(X[:, 0])] + [X[:, i] for i in range(X.shape[1])])
    beta, *_ = np.linalg.lstsq(X, y, rcond=None)
    return beta, y - X @ beta

dA, dB = np.diff(pA), np.diff(pB)
z = (pA - pB)[:-1]

bA, rA = ols(dA, z.reshape(-1, 1))
bB, rB = ols(dB, z.reshape(-1, 1))
alphaA, alphaB = bA[1], bB[1]
# 合成结果:alphaA = -0.160, alphaB = 0.687
python

市场 A 的误差修正系数只有 −0.16,接近 0——它基本不为纠偏负责;市场 B 的系数高达 0.687,价差一出现它就大步向 A 靠拢。这已经强烈暗示:A 是价格发现的主战场,B 在跟随。

共同因子权重#

VECM 蕴含一个”共同随机游走”结构,其新息由各市场残差的线性组合构成。这个组合权重 ( \gamma ) 正交于误差修正向量。对两市场情形,可以近似取:

γ[αB, αA]\gamma \propto [-\alpha_B, \ \alpha_A]

直觉是:不负责纠偏(( \alpha ) 小)的市场,在共同因子里权重大。归一化后得到每个市场对永久性冲击的贡献权重。

Cholesky 排序:信息份额的”原罪”#

这里遇到 Hasbrouck 方法最著名、也最被误用的地方。信息份额定义为每个市场对共同因子新息方差的贡献占比:

ISi=([γF]i)2γΩγIS_i = \frac{([\gamma F]_i)^2}{\gamma \Omega \gamma'}

其中 ( \Omega ) 是 VECM 残差的协方差矩阵,( F ) 是它的 Cholesky 分解(( \Omega = FF’ ))。

问题来了:当两个市场的残差同期相关(( \Omega ) 非对角)时,Cholesky 分解依赖变量排序。 把 A 排在前面,等于把”同期共同变动”这部分方差全算给 A;把 B 排在前面,就全算给 B。于是你得到的不是一个点估计,而是一个区间——把两种排序都算一遍,取上下界。

def info_share(order, Om, gamma):
    P = Om[np.ix_(order, order)]
    F = np.linalg.cholesky(P)
    g = gamma[order]
    shares = (g @ F) ** 2 / (g @ P @ g)
    out = np.zeros(2)
    out[order[0]], out[order[1]] = shares[0], shares[1]
    return out

is_A_first = info_share([0, 1], Om, gamma)  # A 排前
is_B_first = info_share([1, 0], Om, gamma)  # B 排前
lower = np.minimum(is_A_first, is_B_first)
upper = np.maximum(is_A_first, is_B_first)
python

信息份额上下界

合成数据里,市场 A 的信息份额区间是 [0.43, 0.98],中点约 0.71;市场 B 是 [0.02, 0.57],中点约 0.29。上下界的宽度直接反映了残差同期相关的强弱:残差越不相关,区间越窄、结论越硬;残差高度相关时,区间可以宽到 [0.1, 0.9],等于什么都没说。

这是实务里最容易翻车的点:很多人只报告 IS 上界(或只报下界),或者干脆取中点当成”真值”发论文——这在残差相关性高时是严重误导。诚实的做法是永远报告区间,并说明区间宽度。 在高频微观结构里,缩小采样间隔(用更细的 tick 数据)通常能压缩残差同期相关、收窄区间,这也是 Hasbrouck 建议在尽可能高的频率上估计 IS 的原因。

与 Gonzalo-Granger 的分歧:波动信息算不算价格发现#

信息份额有一个常被拿来对比、也常被混为一谈的兄弟:Gonzalo-Granger 成分份额(Component Share, CS)。二者的差别是一句话就能说清、但影响深远的哲学分歧。

  • Gonzalo-Granger CS 只用误差修正系数 ( \gamma ),完全不看残差协方差 ( \Omega )。它回答的是:“永久性冲击的权重怎么分?“——一个纯粹关于”谁负责纠偏”的度量,没有排序问题,是唯一确定的。
  • Hasbrouck IS 额外把 ( \Omega ) 里的方差信息算进来。 它认为:一个市场如果新息波动更大,说明它承载了更多信息流,理应分到更多价格发现份额。
gg = np.abs(gamma) / np.abs(gamma).sum()  # Gonzalo-Granger 成分份额
# 合成结果:GG = [0.81, 0.19]
python

Hasbrouck IS 与 Gonzalo-Granger CS 对比

合成数据里,GG 给市场 A 的份额是 0.81,比 IS 中点 0.71 更极端。这个分歧不是 bug,是两种度量在回答不同问题。 当你想知道”谁在结构上主导长期均衡”,用 GG;当你想知道”谁在承载即时信息流、新息经由谁进入系统”,用 IS。De Jong (2002) 和 Baillie 等 (2002) 有过一场经典论战,最终的实务共识是:同时报告 IS 区间和 GG,如果两者结论一致,价格发现的判断就稳健;如果分歧巨大,说明结果高度依赖你对”信息”的定义,需要谨慎。

脉冲响应:新息如何在市场间传导#

信息份额是个静态占比数字,但价格发现是个动态过程。用累计脉冲响应函数(IRF)可以看清一个单位新息注入后,两个市场分别用多久把它”消化”到永久价格水平:

累计脉冲响应

市场 A 的累计响应瞬间跳到 1.0(永久冲击的全部)并保持——它一步到位。市场 B 从 0 开始,以约 0.55 的速率逐期向 1.0 收敛,大约 8-10 期后才基本到位。这张图是信息份额的动态版本:A 的价格里几乎全是永久信息,B 的价格里混着大量暂时性偏离,需要时间才能收敛到有效价格。 收敛速度慢,正是 B 的信息份额低的微观机制。

A. 实现细节#

  • 信号数据:用两市场的对数价格序列 ( p_{A,t}, p_{B,t} )。差分 ( \Delta p ) 用于 VECM 主方程,价差 ( z_t = p_A - p_B ) 用作误差修正项(协整残差)。
  • 估计方法:为保持可复现和透明,用 OLS 逐方程估计 VECM 的误差修正系数(而非完整的 Johansen MLE);两市场单协整关系下,OLS 估计的 ( \alpha ) 与 Johansen 结果方向一致。
  • 信息份额口径:报告 Cholesky 两种排序(A-first / B-first)的上下界与中点,而非单一点估计。共同因子权重 ( \gamma ) 用 ( [-\alpha_B, \alpha_A] ) 归一化近似。
  • 对比度量:同时给出 Gonzalo-Granger 成分份额(仅用 ( \gamma ),不含 ( \Omega )),用于交叉验证。
  • 合成数据生成:有效价格是标准随机游走;市场 A = 有效价格 + 小微观噪声(快);市场 B = 以 0.55 速率向有效价格滞后收敛 + 较大噪声(慢),从数据生成过程上就植入了”A 主导价格发现”的真值,用于验证估计器能否还原它。

B. 已知偏差与局限#

  • 合成数据低估残差相关:真实多市场 tick 数据在同一毫秒内的共同跳动远比合成数据剧烈,实盘中 IS 区间通常宽得多。本文 [0.43, 0.98] 的区间在真实高频数据里可能变成 [0.2, 0.95],结论强度会显著下降。
  • 两市场简化:真实场景常是 3+ 个市场(多个交易所 + 暗池),Cholesky 排序的组合数随市场数阶乘增长,上下界会进一步拉宽,需要用更结构化的方法(如结构 VAR 识别)辅助。
  • 采样频率依赖:IS 对采样间隔高度敏感。日频数据几乎无法分辨价格发现(残差同期相关趋近 1),必须用秒级甚至 tick 级数据。本文合成频率介于两者之间,是理想化的。
  • 非同步交易:真实市场存在开盘时间差、停牌、流动性枯竭时段,这些会在价差里引入伪协整关系,污染误差修正系数估计——本文未建模。

C. 结果解读#

第一,价格发现的判断在本例中是稳健的。 IS 中点 0.71 与 GG 的 0.81 都指向市场 A 主导,两个独立度量方向一致,误差修正系数(A 的 −0.16 vs B 的 0.687)也印证 A 几乎不为纠偏负责。三条证据交叉验证,这个”A 是主战场”的结论可信。

第二,区间宽度比中点更值得关注。 A 的信息份额区间 [0.43, 0.98] 宽达 0.55,意味着在最不利的 Cholesky 排序下,A 的份额可能只有 43%——如果只报中点 0.71,会高估结论的确定性。实务里,报告区间宽度等于报告”这个判断有多依赖排序假设”。

第三,IS 与 GG 的分歧揭示方法论选择的后果。 GG 给 A 的份额(0.81)比 IS(0.71)更高,因为 GG 只看”谁负责纠偏”,而 IS 把市场 B 那份较大的残差波动也算作它对信息流的贡献,摊薄了 A 的份额。当你要向别人汇报”哪个市场主导价格发现”时,先明确你用的是哪个定义——否则同一份数据能得出份额相差 10 个百分点的两个”事实”。

第四,动态视角补全静态占比。 脉冲响应显示市场 B 需要约 8-10 期才把新息收敛到位。这个收敛速度在实盘里就是跨市场套利与领先-滞后交易的机会窗口:如果你能可靠地识别哪个市场领先、滞后市场的收敛速度多快,理论上可以在滞后市场上做统计套利。但这类策略对交易成本、延迟极度敏感,微观结构领先-滞后关系在扣除成本后往往所剩无几——这是把价格发现研究转化为可交易 alpha 时最大的落差。

适用边界:信息份额是市场微观结构研究和交易所竞争分析的利器(判断新交易所是否真的贡献了价格发现、暗池是否在”搭便车”),但把它直接当成交易信号需要极高的数据频率和执行能力。对绝大多数中低频策略,它更适合作为”理解标的在哪个市场定价”的诊断工具,而非 alpha 来源。

Hasbrouck 信息份额:多市场交易时价格发现发生在哪里
https://blog.halo26812.eu.org/blog/hasbrouck-information-share
Author halo
Published at 2026年7月26日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨