2. 交易数据基础与主动买卖方向定义

要推断一笔成交是“主动买”还是“主动卖”,首先必须弄清楚我们手里到底有哪些数据、它们各自记录了什么。实务中常用的三类数据是:逐笔成交(Trade Tick)、订单簿快照(Order Book Snapshot),以及在此基础上加工出的买卖方向标签(Aggressor Side / Trade Sign)。三者的信息粒度和时间语义完全不同,混淆它们会直接导致方向推断失真。

三类数据的金融含义

逐笔成交是交易所撮合引擎每达成一笔交易就推送的一条记录,典型字段包括成交时间(精确到毫秒或微秒)、成交价、成交量、成交编号,部分市场还附带买卖双方订单号。它回答的是“在什么时刻、以什么价格、成交了多少”。注意:逐笔成交本身通常不直接告诉你谁是主动方——这正是需要推断规则的原因。

订单簿快照则是按固定频率(如每500ms、每3秒)对买卖盘口的一次“拍照”,记录买一至买N、卖一至卖N的价格与挂单量。它回答的是“某一时刻市场上可成交的报价结构”。快照是离散的,两次快照之间的盘口变化会丢失,因此基于快照的推断天然带有时间对齐误差。

买卖方向标签是派生数据:给每笔成交打上“主动买(+1)”或“主动卖(−1)”的标记,含义是该笔成交由买方主动发起、吃掉了卖方挂单(主动买),或反之。它是后续计算订单流不平衡(OFI)、成交量方向差(VWAP偏离、Delta)等指标的基础。方向标签错了,所有下游因子都会系统性偏移。

约定:本文统一以“主动买 = +1、主动卖 = −1”为方向符号,价格比较均在同一标的、同一交易日内进行,不涉及跨品种或复权处理。

三种常见推断规则及其边界

Tick Rule(逐笔价格比较规则):比较当前成交价与上一笔成交价。价格上涨记为主动买,下跌记为主动卖,价格不变则沿用上一笔的方向(零 tick 继承)。它只依赖逐笔成交序列,实现简单、无需盘口,但在价格长时间横盘、成交价反复不变时会产生大量“继承”标签,方向信息被稀释。

Quote Rule(报价比较规则):比较成交价与当时盘口的中间价(或买一/卖一)。成交价高于中间价记为主动买,低于中间价记为主动卖,等于中间价则无法判定。它需要盘口数据,对中间价附近的成交不敏感,且依赖快照与成交的时间对齐精度。

Lee-Ready 算法:把两者串起来——先看成交价是否偏离中间价(Quote Rule),若成交价恰在中间价上,则退回到 Tick Rule 用价格变化判定。它是学界与业界最常用的组合规则,兼顾了盘口信息与逐笔序列,但对“中间价成交 + 零 tick”的极端情形仍会给出继承性标签,且对快照延迟敏感。

成交方向推断:数据输入与规则判定路径 逐笔成交 时间·价格·量·成交号 订单簿快照 买一/卖一·中间价·挂单量 方向标签(派生) +1 主动买 / −1 主动卖 Tick Rule Pₜ > Pₜ₋₁ → +1 Pₜ < Pₜ₋₁ → −1 相等 → 继承上一笔 Quote Rule Pₜ > 中间价 → +1 Pₜ < 中间价 → −1 等于中间价 → 无法判定 Lee-Ready 先 Quote Rule 判偏离 中间价成交 → 退回 Tick Rule 组合判定,覆盖更全 输出:每笔成交的方向标签 sₜ ∈ {+1, −1} 用于 OFI、成交量方向差、Delta 等订单流指标 误差来源:快照延迟 · 中间价成交 · 零 tick 继承 · 隐藏单/冰山单 → 需用成交价与盘口的对齐校验、标签一致性抽检来验证

规则对比与适用边界

把三条规则放在一起看,差异集中在“依赖什么数据”和“在什么情形下失效”两点上。Tick Rule 只吃逐笔序列,适合没有盘口或盘口质量差的市场(如部分场外、低频数据源),但在窄幅震荡行情中零 tick 比例可能超过40%,标签几乎失去区分度。Quote Rule 依赖快照与成交的精确对齐,适合盘口更新频繁、快照间隔短的品种;一旦成交发生在两次快照之间,用旧盘口判新成交就会错判。Lee-Ready 用组合逻辑弥补单一规则的盲区,是默认首选,但它并不能消除“中间价成交且零 tick”的继承问题,只是把无法判定的比例压低。

规则所需数据主要失效场景适用边界
Tick Rule仅逐笔成交价格横盘、零 tick 密集无盘口或盘口不可信的数据源
Quote Rule逐笔成交 + 盘口快照快照延迟、成交落在中间价高频快照、盘口稳定的品种
Lee-Ready两者结合中间价成交 + 零 tick 继承通用默认,需配合误差校验

一个可复现的判定示例

假设某标的连续三笔成交与盘口如下(示例数据,用于说明计算过程):第一笔成交价10.02,当时买一10.00、卖一10.04,中间价10.02,成交价等于中间价,Quote Rule 无法判定,退回 Tick Rule;若这是当日首笔,则标记为无法判定或按开盘方向初始化。第二笔成交价10.05,高于当时中间价10.03,Quote Rule 直接判为主动买(+1)。第三笔成交价10.05,与上一笔相同,中间价仍为10.03,成交价高于中间价,仍判主动买。可以看到,同一价格在不同盘口背景下可能得到不同标签,这正是必须把成交与盘口按时间戳对齐的原因。

# 伪代码:Lee-Ready 判定骨架(示例)
for trade in trades:
    mid = snapshot_at(trade.time).mid   # 需按时间戳对齐
    if trade.price > mid:
        sign = +1
    elif trade.price < mid:
        sign = -1
    else:                                # 中间价成交
        if trade.price > prev_price:
            sign = +1
        elif trade.price < prev_price:
            sign = -1
        else:
            sign = prev_sign             # 零 tick 继承
    prev_price, prev_sign = trade.price, sign

标注误差从哪来、怎么验证

方向标签的误差主要有四个来源:快照延迟(用旧盘口判新成交)、中间价成交(规则本身无法区分)、零 tick 继承(错误被沿链传播)、隐藏单与冰山单(真实主动方与可见盘口不一致)。验证时不能只看规则输出,而应做两类校验:一是对齐校验,检查每笔成交所用快照的时间戳是否早于成交时间且间隔在容忍阈值内,超出阈值的样本单独标记;二是一致性抽检,对同一批成交分别用 Tick Rule 与 Quote Rule 打标,统计两者不一致的比例,不一致样本往往集中在中间价附近,可作为人工复核的重点。若不一致率异常升高,通常提示快照对齐或数据源质量问题,而非规则本身失效。

不要把方向标签当作“真值”。它是对不可直接观测的主动方的推断结果,任何下游指标都应携带这一不确定性,并在回测中评估标签误差对信号稳定性的影响。

理解了数据形态与规则边界,下一步才能谈“标注误差如何量化、如何修正”。本节的核心结论是:先明确手里是逐笔、快照还是派生标签,再按数据条件选择规则,最后用对齐校验与一致性抽检给标签的可信度打分——这三步缺一不可。