halo 的技术博客

返回

Roll 价差估计量:只用收盘价的自协方差反推有效价差#

想估计一只股票的买卖价差,最直接的办法是拿报价数据:ask 减 bid,完事。但很多场景下你根本没有报价数据——1960 年代的美股历史、新兴市场小票、场外公司债、加密货币的早期历史。你手里只有一列收盘价。

Richard Roll 在 1984 年给出了一个近乎魔术的答案:只用收盘价序列的一阶自协方差,就能反推出有效价差

s=2Cov(Δpt,Δpt1)s = 2\sqrt{-\text{Cov}(\Delta p_t, \Delta p_{t-1})}

这个公式后来成为微观结构领域被引用最多的结果之一。本文用模拟把它的机制、精度和命门全部跑一遍。

一、机制:买卖跳动如何制造负自协方差#

Roll 模型的世界观极简:

  1. 存在一个不可观测的有效价 mtm_t,它是随机游走(有效市场假设);
  2. 每笔成交以等概率来自买方或卖方,买方成交在 mt+s/2m_t + s/2(付 ask),卖方成交在 mts/2m_t - s/2(打 bid);
  3. 观测价 pt=mt+qts/2p_t = m_t + q_t \cdot s/2,其中 qt{+1,1}q_t \in \{+1, -1\} 独立同分布。

买卖跳动机制

灰线是有效价,蓝线是观测价——它在有效价上下来回弹跳,这就是 bid-ask bounce。关键在于这种弹跳的统计指纹:

Δpt=Δmt+s2(qtqt1)\Delta p_t = \Delta m_t + \frac{s}{2}(q_t - q_{t-1})

有效价增量 Δmt\Delta m_t 无自相关,但 (qtqt1)(q_t - q_{t-1}) 项在相邻两期共享一个 qq

Cov(Δpt,Δpt1)=s24\text{Cov}(\Delta p_t, \Delta p_{t-1}) = -\frac{s^2}{4}

直觉版本:这一笔打在 ask 上,下一笔打回 bid 的概率是一半——价格刚跳上去就倾向于跳回来,涨跌交替出现,一阶自协方差必然为负。价差越宽,弹跳越猛,负得越深。反解即得 Roll 公式。上图那 120 笔成交实测:真实 s=0.20,自协方差 −0.0128,估出 0.226——魔术成立。

def roll_estimator(p):
    dp = np.diff(p)
    cov = np.cov(dp[1:], dp[:-1])[0, 1]
    return 2 * np.sqrt(-cov) if cov < 0 else np.nan   # cov>=0 时失效

# 模拟:有效价随机游走 + 等概率买卖跳动
def simulate(T, s, sigma_e, rng):
    m = np.cumsum(rng.normal(0, sigma_e, T))          # 有效价
    q = np.where(rng.random(T) < 0.5, 1, -1)          # 买卖方向
    return m + q * s / 2                              # 观测价
python

注意那个 np.nan:当样本自协方差算出来 ≥ 0 时,根号里是负数,价差变成虚数,估计量直接失效。这不是边角情况,而是 Roll 估计量的命门,第三节专门处理。

二、精度:一年日线能估多准#

T=250 天(一年日线)、日有效价波动 σe=0.015,扫真实价差从 0.01 到 0.30,每档 2000 次蒙特卡洛:

估计精度

真实 sRoll 估计(均值±σ)失效率
0.020.020 ± 0.0030%
0.060.060 ± 0.0050%
0.200.200 ± 0.0140%
0.300.300 ± 0.0210%
0.010.010 ± 0.0036.0%

两个结论。第一,在模型假设成立且价差足够宽时,Roll 估计量几乎无偏,估计点齐刷刷贴着 45 度线,相对误差 7% 左右——对一个只吃收盘价的估计量来说,这个精度堪称慷慨。第二,注意最后一行:价差窄到与噪声同量级时,失效率开始冒头。这是下一节的主角。

三、命门:流动性越好,越容易算出虚数价差#

自协方差的两个组成部分在打架:跳动项贡献 s2/4-s^2/4,而有效价波动 σe2\sigma_e^2 贡献采样噪声。当 s/σes/\sigma_e 太小,采样噪声完全淹没跳动信号,样本自协方差有接近一半的概率落在正区——根号下负数,估计失效。

扫信噪比 s/σes/\sigma_e 从 0.25 到 4,三种样本长度:

失效率

s/σes/\sigma_eT=60T=250T=1000
0.2541.3%40.8%30.2%
0.531.6%17.2%3.4%
1.08.1%0.2%0%
2.00.6%0%0%

最扎心的一行是信噪比 0.25:即使给整整四年日线,仍有 30% 的概率估计失效。信噪比 0.25 是什么概念?大盘蓝筹股价差 2bp、日波动 1.5%,信噪比只有 0.13——比表格里最差的情况还差一倍。

这构成一个辛辣的反讽:Roll 估计量恰恰在它最不被需要的地方最好用。价差宽的非流动资产(正是没有报价数据的那些)估得又准又稳;价差窄的流动股票(反正有报价数据)根本估不出来。这个「巧合」正是它在学术界用于历史数据和新兴市场研究、而从不用于实时交易的原因。

实务中对失效样本的三种处理都有人用,各有偏差:置零(低估截面平均)、取绝对值再开根(高估)、直接丢弃(幸存者偏差——被丢掉的恰恰是最流动的股票,且丢弃与流动性相关,不是随机缺失)。Hasbrouck (2009) 的贝叶斯 Gibbs 版本从后验分布采样,把非负约束内生进模型,是截面研究的标准救场方案。

四、滚动 Roll:危机温度计#

单点估计之外,Roll 更实用的形态是滚动窗口时间序列。模拟一段 750 天的行情:平静期价差 0.06,第 300-460 天流动性危机、价差冲到 0.40 后回落,用 60 日滚动窗口估计:

win = 60
roll_series = np.full(T_days, np.nan)
for t in range(win, T_days):
    roll_series[t] = roll_estimator(p[t-win:t])
python

危机温度计

滚动 Roll 从平静期的 0.059(真实 0.06,几乎精确)飙升到危机峰值 0.359(真实峰值 0.40,略滞后且低估——60 日窗口的平滑代价),随后跟随真实路径回落。整段序列无一天失效,因为危机把信噪比推高了。

这和我们此前写过的 Zeros 流动性度量 是同一家族——只要收盘价的流动性代理。两者常被并列使用:Zeros 数「价格不动的天数」,Roll 量「价格弹跳的幅度」,前者对交易成本带宽敏感,后者直接给出价差的货币单位估计。在 Goyenko et al. (2009) 的横向评测里,两者与高频基准的相关性各有胜场,组合使用优于单用。

五、假设的裂缝:真实世界会系统性偏离#

Roll 模型的三条假设在真实市场没有一条完全成立,每条裂缝都有明确的偏差方向:

  1. 有效价与买卖方向独立——被逆向选择打破。知情交易者买入后有效价会上移(这正是 Glosten-Milgrom 模型 的机制),qtq_tΔmt\Delta m_t 正相关,抵消一部分负自协方差,Roll 系统性低估价差。它量的只是价差中的订单处理成分,量不到逆向选择成分。
  2. 买卖方向独立同分布——被订单流持续性打破。真实订单流有强正自相关(大单拆分、跟风交易),qtq_t 的持续性直接压扁 (qtqt1)(q_t - q_{t-1}) 的方差,同样导致低估。
  3. 价差恒定——危机中价差本身在跳,滚动窗口给出的是窗口内均值,峰值被平滑(上图危机峰值 0.359 vs 真实 0.40 正是此效应)。

方向一致的结论:把 Roll 估计读作有效价差的下界比读作点估计更诚实

六、工程落地清单#

  1. 先算信噪比再决定用不用:用粗略价差猜测除以日波动,低于 0.5 就换 Zeros / Amihud 或 Hasbrouck Gibbs 版,别硬跑。
  2. 失效处理方式必须全文统一且在结果里报告失效率——置零、取绝对值、丢弃给出的截面排名可以差很远。
  3. 滚动窗口不小于 60 观测,且危机检测场景选短窗(响应快)、截面比较场景选长窗(方差小)。
  4. 日线之外,Roll 同样适用于交易级数据(用逐笔价格),此时信噪比大幅改善——tick 级有效价波动远小于价差。
  5. Zeros 组合使用:Zeros 高而 Roll 失效的股票,大概率是「不怎么成交」型非流动;Zeros 低而 Roll 高的是「常成交但价差宽」型——两个维度拼出的流动性画像比任何单指标都完整。

七、诚实边界#

  • 全文基于模拟数据,模型假设自我实现——真实数据中逆向选择和订单流持续性会让估计系统性偏低,幅度依资产而异。
  • 失效样本非随机缺失,截面回归直接丢弃会引入与流动性相关的选择偏差。
  • 收盘价还携带日末效应(收盘竞价、做市商甩库存),日线 Roll 对此照单全收。
  • 价差非平稳时,滚动估计是窗口均值,峰值被低估、拐点被滞后。

一句话总结:Roll 用一个负自协方差把「看不见的价差」从收盘价里拧了出来——在价差够宽的地方它近乎无偏,在价差窄的地方它干脆罢工;幸运的是,需要它的地方恰好是它好用的地方,把它当作有效价差的下界和危机温度计,而不是精密仪器。


参考文献:

  • Roll, R. (1984). A Simple Implicit Measure of the Effective Bid-Ask Spread in an Efficient Market. Journal of Finance, 39(4), 1127-1139.
  • Hasbrouck, J. (2009). Trading Costs and Returns for U.S. Equities: Estimating Effective Costs from Daily Data. Journal of Finance, 64(3), 1445-1477.
  • Goyenko, R., Holden, C., & Trzcinka, C. (2009). Do Liquidity Measures Measure Liquidity? Journal of Financial Economics, 92(2), 153-181.
Roll 价差估计量:只用收盘价的自协方差反推有效价差
https://blog.halo26812.eu.org/blog/roll-spread-estimator
Author halo
Published at 2026年7月28日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨