Roll 价差估计量:只用收盘价的自协方差反推有效价差
没有报价数据、没有成交明细,只有一列收盘价——还能估出买卖价差吗?Roll (1984) 说能:观测价在有效价上下 ±s/2 来回弹跳,制造出负的一阶自协方差,反解得 s = 2√(−cov)。模拟实测:T=250 天日线下估计几乎无偏(s=0.20 时估出 0.200±0.014),但命门在信噪比——价差/波动 = 0.25 的大盘股即使给 1000 天数据仍有 30% 概率算出正自协方差、价差直接成虚数(T=60 时失效率 41%)。60 日滚动 Roll 做流动性温度计:危机段估计值从 0.059 飙到 0.359,贴住真实价差路径 0.06→0.40。它与 Zeros 同属「只要收盘价」家族,是覆盖历史数据、新兴市场和债券的少数选择。诚实边界:假设有效价与买卖方向独立(逆向选择会导致低估)、买卖各半(订单流持续性会压扁负自协方差)、失效样本非随机(越流动越失效,截面用法需 Hasbrouck 贝叶斯版救场)(中阶)。
Roll 价差估计量:只用收盘价的自协方差反推有效价差#
想估计一只股票的买卖价差,最直接的办法是拿报价数据:ask 减 bid,完事。但很多场景下你根本没有报价数据——1960 年代的美股历史、新兴市场小票、场外公司债、加密货币的早期历史。你手里只有一列收盘价。
Richard Roll 在 1984 年给出了一个近乎魔术的答案:只用收盘价序列的一阶自协方差,就能反推出有效价差。
这个公式后来成为微观结构领域被引用最多的结果之一。本文用模拟把它的机制、精度和命门全部跑一遍。
一、机制:买卖跳动如何制造负自协方差#
Roll 模型的世界观极简:
- 存在一个不可观测的有效价 ,它是随机游走(有效市场假设);
- 每笔成交以等概率来自买方或卖方,买方成交在 (付 ask),卖方成交在 (打 bid);
- 观测价 ,其中 独立同分布。

灰线是有效价,蓝线是观测价——它在有效价上下来回弹跳,这就是 bid-ask bounce。关键在于这种弹跳的统计指纹:
有效价增量 无自相关,但 项在相邻两期共享一个 :
直觉版本:这一笔打在 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 次蒙特卡洛:

| 真实 s | Roll 估计(均值±σ) | 失效率 |
|---|---|---|
| 0.02 | 0.020 ± 0.003 | 0% |
| 0.06 | 0.060 ± 0.005 | 0% |
| 0.20 | 0.200 ± 0.014 | 0% |
| 0.30 | 0.300 ± 0.021 | 0% |
| 0.01 | 0.010 ± 0.003 | 6.0% |
两个结论。第一,在模型假设成立且价差足够宽时,Roll 估计量几乎无偏,估计点齐刷刷贴着 45 度线,相对误差 7% 左右——对一个只吃收盘价的估计量来说,这个精度堪称慷慨。第二,注意最后一行:价差窄到与噪声同量级时,失效率开始冒头。这是下一节的主角。
三、命门:流动性越好,越容易算出虚数价差#
自协方差的两个组成部分在打架:跳动项贡献 ,而有效价波动 贡献采样噪声。当 太小,采样噪声完全淹没跳动信号,样本自协方差有接近一半的概率落在正区——根号下负数,估计失效。
扫信噪比 从 0.25 到 4,三种样本长度:

| T=60 | T=250 | T=1000 | |
|---|---|---|---|
| 0.25 | 41.3% | 40.8% | 30.2% |
| 0.5 | 31.6% | 17.2% | 3.4% |
| 1.0 | 8.1% | 0.2% | 0% |
| 2.0 | 0.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 模型的三条假设在真实市场没有一条完全成立,每条裂缝都有明确的偏差方向:
- 有效价与买卖方向独立——被逆向选择打破。知情交易者买入后有效价会上移(这正是 Glosten-Milgrom 模型 的机制), 与 正相关,抵消一部分负自协方差,Roll 系统性低估价差。它量的只是价差中的订单处理成分,量不到逆向选择成分。
- 买卖方向独立同分布——被订单流持续性打破。真实订单流有强正自相关(大单拆分、跟风交易), 的持续性直接压扁 的方差,同样导致低估。
- 价差恒定——危机中价差本身在跳,滚动窗口给出的是窗口内均值,峰值被平滑(上图危机峰值 0.359 vs 真实 0.40 正是此效应)。
方向一致的结论:把 Roll 估计读作有效价差的下界比读作点估计更诚实。
六、工程落地清单#
- 先算信噪比再决定用不用:用粗略价差猜测除以日波动,低于 0.5 就换 Zeros / Amihud 或 Hasbrouck Gibbs 版,别硬跑。
- 失效处理方式必须全文统一且在结果里报告失效率——置零、取绝对值、丢弃给出的截面排名可以差很远。
- 滚动窗口不小于 60 观测,且危机检测场景选短窗(响应快)、截面比较场景选长窗(方差小)。
- 日线之外,Roll 同样适用于交易级数据(用逐笔价格),此时信噪比大幅改善——tick 级有效价波动远小于价差。
- 与 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.