有效 Tick 估计量:用价格聚集反推隐含买卖价差
没有报价数据、只有日线收盘价,怎么估一只股票的买卖价差?Holden (2009) 的 Effective Tick 用了一个几乎免费的信息源:价格聚集。做市商用 0.25 元价差报价时,成交价天然落在 0.25 的网格上——数一数收盘价里有多少比例恰好是 0.05 / 0.10 / 0.25 的整数倍,就能反解出各档价差的使用概率,加权平均即隐含价差。本文从聚集直方图直觉推到完整的占比→概率→约束修剪算法,40 次模拟×5 档真实价差实测:估计几乎贴住 45° 线(0.05 档估 0.0597、0.25 档估 0.2523),且方差显著小于 Roll 序列协方差估计量、永不出现 Roll 的正协方差失效。灵魂缺陷也来自同一枚硬币:价格聚集不全由价差造成——心理整数位聚集污染 30% 时,0.05 元的真实价差被高估成 0.103,偏差整整一倍。诚实边界:分档阶梯须匹配市场 tick 规则、对涨跌停封板日要剔除、它估的是有效价差的下限口径(中阶)。
问题:没有报价数据,价差从哪里来#
买卖价差是最基础的流动性度量:它进交易成本模型(Amihud-Mendelson 告诉你价差直接进资产定价)、进回测的成本假设、进流动性因子构造。但价差的直接计算需要报价数据(bid/ask),而大量场景里你根本没有:
- 历史研究要回到 1990 年代甚至更早,报价数据不存在或贵到离谱;
- 你只有日线 OHLC,没买 tick 级数据;
- 新兴市场、债券、场外品种,报价要么不透明要么没有。
于是产生了一整个”低频价差估计量”家族:Roll (1984) 用相邻价格变化的负序列协方差反推价差;Corwin-Schultz (2012) 用高低价范围。今天讲的 Holden (2009) Effective Tick 估计量走的是第三条路,信息源最出人意料:成交价的尾数分布。
它不看价格怎么动,只看价格落在哪些数字上。
直觉:价差会在价格尾数上留下指纹#
想象一个做市商,在 20 元附近的股票上用 0.25 元价差报价。他的报价会是 19.75 / 20.00、20.00 / 20.25 这种——报价自然对齐到价差的整数倍网格上。所有成交都打在报价上,于是成交价也全部落在 0.25 的网格上:你翻遍成交记录,找不到一笔 20.07 或 19.83。
反过来,一只价差只有 0.01 元的流动性好的股票,成交价会均匀铺满每一分钱:20.01、20.02、20.03……什么尾数都有。
这就是关键:价差越宽,成交价越”聚集”在粗网格上;价差越窄,价格越铺满细网格。 价格聚集程度本身,就是价差的化石记录。

上图是两只模拟股票各 4000 笔成交的归类结果(每个价格归入能整除它的最粗增量)。左边真实价差 0.01 元:约一半价格只能落在 0.01 网格(尾数是奇数分),其余按整除关系自然散布——这个分布恰好就是”完全没有聚集”时的基准形态。右边真实价差 0.25 元:几乎 100% 的成交价是 0.25 的整数倍,0.01/0.05/0.10 档几乎为零。两张图的 Effective Tick 估计分别是 0.010 和 0.250 元——直方图形状直接暴露了价差。
算法:从占比反解概率,三步走#
设可能的价差档位阶梯为 (例如 0.01, 0.05, 0.10, 0.25, 0.50 元)。算法要从”价格落在各网格的占比”反解出”市场使用各档价差的概率”。
第一步:归类计数。 每笔成交价归入能整除它的最粗增量,统计各档占比 。注意归类是互斥的:20.25 能被 0.25 整除,就归 0.25 档,不再算进 0.05 档。
第二步:占比 → 未约束概率。 这里有个精妙的会计恒等式。若市场以概率 使用价差 ,则使用宽价差时的成交价碰巧也落在细网格上(0.25 的倍数必然是 0.05 的倍数),需要扣重。Holden 给出的反解:
系数 2 来自一个对称性假设:用 价差报价时,成交价落在”恰好是 奇数倍”和”恰好是更粗网格”上的概率各半。
第三步:约束修剪。 可能是负数或加起来超过 1(样本噪声),从最细档开始依次夹到 内,得到最终概率 。隐含价差就是加权平均:
import numpy as np
INCR = np.array([0.01, 0.05, 0.10, 0.25, 0.50]) # 价差档位阶梯
def effective_tick(prices, incr=INCR):
cents = np.round(prices * 100).astype(int)
steps = np.round(incr * 100).astype(int)
# 第一步:归入能整除的最粗增量
cls = np.zeros(len(cents), dtype=int)
for j, s in enumerate(steps):
cls[cents % s == 0] = j
F = np.bincount(cls, minlength=len(incr)) / len(cls)
# 第二步:占比 -> 未约束概率
J = len(incr)
U = np.zeros(J)
U[0] = 2 * F[0]
for j in range(1, J - 1):
U[j] = 2 * F[j] - F[j - 1]
U[J - 1] = F[J - 1] - F[J - 2]
# 第三步:约束修剪,保证概率合法
g, rem = np.zeros(J), 1.0
for j in range(J):
g[j] = min(max(U[j], 0.0), rem)
rem -= g[j]
return (g * incr).sum()python整个估计量不到 20 行,输入只要一列成交价(日收盘价就行),这是它在实证文献里被大规模使用的根本原因——Holden 用它把美股价差序列回补到了 1926 年。
验证:五档价差全线贴住 45° 线,方差小于 Roll#
模拟五档真实有效价差(0.01 到 0.50 元),每档 40 次独立模拟、每次 2000 笔成交,同时跑 Roll 序列协方差估计量作对照:

| 真实价差 | Effective Tick | Roll 估计 |
|---|---|---|
| 0.01 | 0.0100 | 0.0101 |
| 0.05 | 0.0597 | 0.0575 |
| 0.10 | 0.1000 | 0.1130 |
| 0.25 | 0.2523 | 0.2623 |
| 0.50 | 0.5000 | 0.5124 |
两个观察:
一是 Effective Tick 的误差棒明显更短。 Roll 依赖序列协方差的样本估计,2000 笔的样本里协方差噪声很大;Effective Tick 数的是”落网格占比”这种计数统计,收敛快得多。
二是 Effective Tick 永不失效,Roll 会。 Roll 要求相邻价格变化协方差为负,正协方差时(动量强的样本段)根号里是负数,估计直接不存在——实务中约三到四成的股票-月份会碰上。Effective Tick 的修剪步骤保证输出永远合法。这不是小事:横截面研究里缺 40% 的观测,剩下的样本就是被选择过的。
灵魂缺陷:聚集不全来自价差#
Effective Tick 的信息源是价格聚集,它的命门也在这里:它把所有聚集都归因于价差,但聚集还有别的来源。
最典型的是心理聚集(psychological clustering / round-number preference):人类下限价单偏爱整数和”整角”价格——20.00、20.50、20.25 这种。这个现象在股票、外汇、房价上都被反复证实,与价差无关。当心理聚集混入时,Effective Tick 会把它误读成”市场在用宽价差”,系统性高估。
模拟量化这个偏差:真实价差固定 0.05 元,人为把一部分成交价”吸”到 0.25 的心理网格上:

污染 10% 时估计 0.064(高估 27%);污染 30% 时估计 0.103——高估一倍多;污染 50% 时 0.149,几乎三倍。偏差单调且无上界预警:你从估计值本身完全看不出被污染了。
这条缺陷决定了使用纪律:Effective Tick 适合做横截面和时间序列的相对比较(心理聚集在股票间大致同构,排序仍然有效),不适合当绝对成本参数直接塞进回测——除非你先验证过标的的聚集主要来自 tick 约束而非心理偏好。
A 股落地注意事项#
- 阶梯要重建。A 股 tick size 统一是 0.01 元(股价不分档),美式的 0.05/0.10/0.25 阶梯没有制度基础。可用的阶梯是”分/角/元”(0.01, 0.10, 1.00),此时估计量捕捉的更多是心理聚集+流动性差引起的粗网格交易,解释口径要相应放宽为”隐含交易摩擦”而非严格价差;
- 剔除涨跌停封板日。封板价是制度约束出来的整数聚集,会严重污染估计——这和 Amihud-Mendelson 篇里 ILLIQ 代理的处理纪律一致;
- 低价股警惕。3 元以下的股票 0.01 元 tick 本身就占价格的 0.3%+,tick 约束造成的机械聚集会主导一切,估计量退化为 tick size 本身。
诚实边界#
第一,它估的是有效价差的一个下限口径。 价格改善、隐藏单、价内成交都会让成交价脱离报价网格,这些都往”细网格”方向拉分布,使估计偏向保守。Holden 原文的定位也是与 Roll、LOT 等估计量取均值组合使用,单兵作战不是设计意图。
第二,档位阶梯是先验,选错全歪。 阶梯必须覆盖市场真实使用的报价增量,多设或漏设档位都会让反解公式的会计恒等式失配。跨市场、跨年代使用时(美股 2001 年十进制化前后 tick 规则完全不同),阶梯必须逐段重设。
第三,它对样本内价差变化是均值口径。 一个月内价差从 0.05 走宽到 0.25(比如财报周),估计给你的是某种概率混合的平均,掩盖了动态。想要日内或事件级的价差动态,还是得上 tick 数据和已实现价差那套工具。
低频估计量的本质是拿假设换数据:数据越少,估计里假设的含量越高。Effective Tick 用”聚集只来自价差”这一个假设换来了只需一列价格的极简输入——知道自己付了什么代价,才有资格享受它的便宜。
参考文献#
- Holden, C. W. (2009). New Low-Frequency Spread Measures. Journal of Financial Markets, 12(4), 778-813.
- Goyenko, R. Y., Holden, C. W., & Trzcinka, C. A. (2009). Do Liquidity Measures Measure Liquidity? Journal of Financial Economics, 92(2), 153-181.
- Roll, R. (1984). A Simple Implicit Measure of the Effective Bid-Ask Spread in an Efficient Market. Journal of Finance, 39(4), 1127-1139.
- Harris, L. (1991). Stock Price Clustering and Discreteness. Review of Financial Studies, 4(3), 389-415.