Tick Rule 与成交量同步概率:用逐笔方向重构知情交易强度
「这一笔成交,是买方砸出来的还是卖方砸出来的?」逐笔数据不带主动方标签,Tick Rule 用最朴素的规则补上它:价格上跳判买、下跳判卖、无变化沿用上一次方向。模拟实测其准确率约 75%,且随报价噪声增大衰减到 62%——它是有偏的测量仪,但足够支撑上层结构。真正的主角是 Easley-López de Prado-O'Hara 的 VPIN:先把时间轴换成成交量时钟(每桶等成交量),再算每桶买卖失衡的滚动均值——知情交易者带方向、带体量地进场时,失衡持续偏向一边,VPIN 从 0.09 抬升到 0.25。200 次模拟的分位数测试:VPIN 最高分位组随后的价格波动是最低分位组的 2.3 倍,信号在波动实现前抬升——这是它被称为『流动性危机温度计』的原因。同样诚实交代争议:Andersen-Bondarenko 质疑 VPIN 的预测力主要来自与成交量和波动本身的相关、2010 年闪崩中 VPIN 报警时点存在事后拟合嫌疑;tick rule 误分类在失衡计算中部分对消但在极端行情中系统性偏乐观。A 股逐笔成交带 BS 标志可跳过 tick rule 直接构造,是少数比美股数据条件更好的场景(中高阶)。
一句话版本#
Tick Rule 用”价格往哪边跳”给每笔成交打上买卖方向标签(准确率约 75%),VPIN 在成交量时钟上把这些标签聚合成买卖失衡的滚动均值——知情交易者进场时它系统性抬升,且领先于波动的实现。
一、问题:逐笔数据里没有”谁是主动方”#
你拿到一份逐笔成交数据:时间戳、价格、数量。想回答一个微观结构里最基础的问题——这笔成交是买方主动打上去的,还是卖方主动砸下来的?
这个标签重要到什么程度:订单流失衡(order flow imbalance)是短周期价格预测里最强的单一信号族;知情交易概率(PIN)、Kyle’s lambda、成交量加权价差全都建立在它之上。但绝大多数市场的公开逐笔数据不带主动方标志——交易所知道,但不告诉你。
于是三十年来微观结构研究的第一步都是同一件事:从价格序列反推每笔成交的方向。
二、Tick Rule:最朴素也最耐用的分类器#
Tick Rule 的全部规则只有三行:
- 成交价高于上一笔 → 判定为买方主动(uptick);
- 成交价低于上一笔 → 判定为卖方主动(downtick);
- 成交价无变化 → 沿用上一笔的判定(zero-tick 继承)。
直觉:主动买单吃掉卖一,成交价被推到 ask,相对上一笔(可能在 bid)上跳;主动卖单反之。
import numpy as np
def tick_rule(prices: np.ndarray) -> np.ndarray:
"""经典 tick rule:返回每笔成交的方向标签 (+1 买 / -1 卖)。"""
n = len(prices)
cls = np.zeros(n, dtype=int)
last = 1 # 初始方向约定为买
for i in range(1, n):
d = prices[i] - prices[i-1]
if d > 1e-9:
last = 1
elif d < -1e-9:
last = -1
cls[i] = last # 零变化沿用 last
cls[0] = cls[1] if n > 1 else 1
return clspython它有多准?用一个可控模拟来回答:随机生成买卖方向,成交价 = 中间价 ± 半价差 + 报价噪声,然后看 tick rule 能恢复多少真实方向:

结果:噪声温和时准确率稳定在 75% 左右,噪声达到半价差的 100% 时衰减到 62.5%。误判的主要来源清晰可见:中间价自身的移动会制造与主动方向无关的价格跳动,zero-tick 继承在连续同价成交时把一个错误一路传染下去。
真实数据上的文献结论与此一致:Lee-Ready 算法(tick rule + 报价中点辅助)在美股上准确率约 85%,纯 tick rule 约 75-80%,且对小单、价差内成交、高频撮合的误判率显著更高。
记住这个数字:75%。它意味着 tick rule 是一台有偏的测量仪——但接下来会看到,聚合之后它依然足够支撑上层结构。
三、换时钟:为什么要用成交量桶#
拿到逐笔方向后,直觉的做法是按时间窗口(比如每分钟)聚合买卖量算失衡。Easley、López de Prado 和 O’Hara(2012)的关键洞察是:时间是错误的时钟。
信息不按日历流动。重磅消息落地的那十分钟,成交量是平时的二十倍——如果按固定时间窗聚合,信息密集期和垃圾时间被切成同样大小的桶,信号被严重稀释。他们的替代方案是成交量时钟(volume clock):
每积累固定数量的成交量(比如日均成交量的 1/50),切一个桶。
在成交量时钟下,信息密集期被自动”放大展开”(一小时切出二十个桶),平静期被压缩(一下午才凑满一个桶)。采样频率跟着信息流动速度自适应。
def volume_buckets(prices, volumes, sides, bucket_size):
"""把逐笔成交按成交量时钟分桶,返回每桶买量/卖量/收盘价。"""
cum_v = np.cumsum(volumes)
bucket_id = (cum_v / bucket_size).astype(int)
n_buckets = bucket_id.max() + 1
VB = np.zeros(n_buckets) # 每桶买方主动量
VS = np.zeros(n_buckets) # 每桶卖方主动量
PX = np.zeros(n_buckets) # 每桶收盘价
for i in range(len(volumes)):
b = bucket_id[i]
if sides[i] == 1:
VB[b] += volumes[i]
else:
VS[b] += volumes[i]
for b in range(n_buckets):
idx = np.where(bucket_id == b)[0]
PX[b] = prices[idx[-1]]
return VB, VS, PXpython四、VPIN:知情交易强度的滚动读数#
有了成交量桶,VPIN(Volume-Synchronized Probability of Informed Trading)的定义只剩一步:
即最近 n 个桶的买卖失衡绝对值的均值(每桶总量相同,分母就是桶容量)。逻辑链条:
- 不知情交易者(做市、流动性需求、指数化)的买卖大体对称,失衡接近零;
- 知情交易者带方向进场——他们知道价格要往哪走,只在一边下单;
- 知情交易占比越高,桶内失衡越大,VPIN 越高。
VPIN 是经典 PIN 模型(Easley-O’Hara 序贯交易模型)的无参数工程化替身:PIN 需要极大似然估计到达率参数、在高频数据上数值病态;VPIN 只要加减法,实时可算。
用一段”平静 → 知情卖压 → 平静”的三段式模拟展示全流程(中段 45% 的成交来自带方向的知情卖单):

读图:知情段内单桶失衡(中图)持续偏向卖方(红色主导),VPIN(下图)从平静段的 0.09 抬升到 0.25,随后随知情流退场缓慢回落——滚动窗口给了它平滑性,也给了它约半个窗口的确认延迟。
五、领先性测试:VPIN 高分位之后发生什么#
VPIN 最响亮的宣传是”闪崩预警器”——Easley 等人声称它在 2010 年 5 月 6 日美股闪崩前一小时就达到了历史极值。宣传归宣传,可控模拟里可以干净地问一个问题:VPIN 处于高分位之后,波动是否系统性放大?
设计:200 次独立模拟,每次在随机位置插入一段随机方向的知情交易流;对每个时点记录当前 VPIN 和未来 10 个桶的平均绝对收益,按 VPIN 分位分组:

结果:VPIN 最低分位组(0-20%)之后的平均绝对收益 16.2×10⁻⁴,最高分位组(90-100%)达到 36.9×10⁻⁴——2.3 倍的差距,且分位数单调递增。机制在模拟里是透明的:知情流一边推高失衡(VPIN 抬升)、一边通过持久冲击把价格推向新水平(波动实现),而 VPIN 的抬升发生在冲击的积累阶段——测量的是原因,领先于结果。
时钟的选择确实是关键。同一段数据换成时间时钟聚合:

成交量时钟把知情段展开成一长段清晰的高失衡区;时间时钟把它压缩进少数几个桶,信号又矮又窄。这不是显示技巧的差别——按时间聚合时知情桶内混入了更多噪声流,失衡被真实地稀释了。
六、争议与暗坑:诚实清单#
VPIN 是微观结构指标里被引用最多、也被攻击最狠的之一。三个必须知道的问题:
1. Andersen-Bondarenko 的釜底抽薪。 他们(2014)指出:VPIN 与成交量、波动率本身高度相关,控制住”当前波动”后 VPIN 对未来波动的增量预测力大幅缩水;且闪崩当天 VPIN 的”提前报警”依赖于桶大小和窗口的事后选择——换一组参数,报警就消失。这场论战没有完全的赢家,但共识是:VPIN 是有效的拥挤/毒性度量,把它当成独立于波动的水晶球则言过其实。我们的模拟支持这个立场:领先性来自”失衡积累先于价格实现”的机制,而这个机制在现实中会被波动率聚类污染。
2. Tick rule 误差的传染方式。 75% 的分类准确率意味着每桶失衡被系统性低估(误分类使买卖互相抵消一部分)。平静期这是无偏的收缩;但极端单边行情中,价格快速下行使 tick rule 把部分被动成交也判成卖方,失衡被高估——VPIN 在最需要冷静的时候倾向于喊得更响。方向性使用(判断失衡是买压还是卖压)比幅度使用更危险。
3. 参数不是自由午餐。 桶大小(日均量的 1/30 还是 1/100)和滚动窗口(20 桶还是 50 桶)直接决定 VPIN 的灵敏度与延迟。文献里”VPIN 有效/无效”的矛盾结论,相当一部分是参数选择的差异。任何实盘使用前必须在自己的市场、自己的品种上做参数稳健性扫描,单点参数的回测结论不可信。
七、A 股落地:少数数据条件更好的场景#
难得的好消息:A 股 Level-2 逐笔成交自带买卖方向标志(逐笔成交中的 BS 标志,由交易所撮合引擎直接给出主动方),这意味着:
- 可以跳过 tick rule,直接用真实方向构造成交量桶失衡——75% 准确率的测量误差整段消失,这是比美股 TAQ 数据更好的起点;
- 反过来,A 股也是检验 tick rule 质量的天然实验场:用真实标志做 ground truth,可以测出 tick rule 在你的品种上的实际准确率(文献在 A 股上的测试结果约 80-85%,好于美股,与 A 股最小变动价位相对较大有关);
- 注意事项:集合竞价成交无主动方语义需剔除;涨跌停板上的成交方向标志会失真(一字板上几乎全是单边);桶大小建议用过去 20 日日均成交量的 1/50 起步做扫描。
用途定位也要现实:A 股 T+1 使 VPIN 难以直接驱动日内反转交易,更合理的角色是执行端的风控输入——VPIN 高分位时放缓母单执行速度、加宽做市报价,避免与知情流对撞。
八、总结#
- Tick rule 用”价格往哪边跳”补上逐笔数据缺失的主动方标签,准确率约 75%,随报价噪声衰减——它是有偏但耐用的测量仪;
- VPIN = 成交量时钟上买卖失衡的滚动均值:知情交易者带方向进场时失衡持续偏向一边,模拟中 VPIN 从 0.09 抬升到 0.25;
- 领先性有机制支撑:失衡积累先于价格实现,200 次模拟中 VPIN 最高分位组随后的波动是最低分位组的 2.3 倍;
- 时钟选择是本质差异:成交量时钟把信息密集期自适应展开,时间时钟把信号稀释进噪声;
- 诚实边界:VPIN 与波动本身相关(Andersen-Bondarenko 批评)、tick rule 误差在极端行情中偏乐观、参数敏感性高——它是拥挤度温度计,不是水晶球;
- A 股逐笔数据自带 BS 标志,可跳过 tick rule 直接构造,是少数数据条件优于美股的微观结构应用,合理定位是执行风控而非信号交易。
下一步:VPIN 度量的是”知情交易的强度”,Kyle’s lambda 度量的是”单位订单流的价格冲击”——两者相乘就是知情流的预期成本,这是最优执行模型里毒性调整的入口。