逐笔成交大单拆分识别技巧

2. Level-2行情数据基础:逐笔成交数据结构、买卖盘口数据、委托队列数据

做量化交易,尤其是高频或者日内策略,Level-2行情是绕不开的坎。

我刚开始接触Level-2的时候,说实话,有点懵。数据量太大了,每秒几十笔甚至上百笔的成交,还有十档盘口、千档委托队列……跟Level-1那种三秒快照完全不是一个量级。但后来我发现,真正有价值的东西,恰恰藏在这些细节里。

这一章,咱们就把Level-2最核心的三个数据模块拆开看看。逐笔成交、买卖盘口、委托队列。搞懂它们,你才能知道大单是怎么拆的,主力是怎么藏单的。

核心观点:Level-2不是让你看更多数据,而是让你看到数据的“过程”。Level-1只告诉你结果(成交价、成交量),Level-2告诉你过程(谁在买、谁在卖、怎么成交的)。

2.1 逐笔成交数据结构

逐笔成交,说白了就是每一笔真实成交的“流水账”。

交易所撮合系统每撮合成一笔交易,就会生成一条逐笔成交记录。注意,它不是按时间均匀推送的,而是“有交易才推送”。所以行情清淡的时候,可能几秒才一条;行情火爆的时候,一秒能来几十条。

2.1.1 逐笔成交包含哪些字段?

我整理了一份标准结构,上海和深圳略有差异,但核心字段差不多:

字段名 说明 我的关注点
交易时间 精确到毫秒 用于还原交易顺序,判断是否“秒拉”
成交编号 交易所唯一流水号 检查数据连续性,漏了说明有异常
证券代码 6位代码 ——
成交价格 本次成交价 结合盘口看是主动吃单还是被动成交
成交数量 股数(不是手数) 重点!大单拆分的直接观察对象
成交金额 价格×数量 辅助判断资金意图
买卖方向 B/S(买/卖)或N(未知) 区分主动买还是主动卖
买方委托索引 买方是哪笔委托 用于还原委托与成交的对应关系
卖方委托索引 卖方是哪笔委托 同上

我的习惯:拿到逐笔数据后,我第一件事不是看价格,而是看“成交编号”是否连续。如果中间跳号了,说明数据有缺失,这种数据做回测会出大问题。我曾经因为这个吃过亏,回测跑得漂亮,实盘一塌糊涂,后来发现是数据商漏了几笔大单。

2.1.2 逐笔成交的“方向”陷阱

这里有个坑,我必须要讲。

逐笔成交里的“买卖方向”,很多人以为就是“主动买”和“主动卖”。其实不完全对。上交所的逐笔成交,方向字段标记的是“主动方”。也就是说,如果是主动买入成交,标记为B;主动卖出成交,标记为S。

但深交所呢?深交所的逐笔成交里,方向字段有时候是N(未知)。为什么?因为深交所的撮合逻辑里,有些成交无法简单判断主动方,尤其是“市价转限价”这种复杂订单。

所以,如果你拿深交所的数据直接按B/S统计资金流向,可能会漏掉一部分。我个人建议,深交所的数据最好结合“委托索引”来还原方向,而不是单纯依赖方向字段。

2.2 买卖盘口数据

盘口数据,就是大家常说的“十档行情”。

Level-1只给五档,Level-2给十档。别小看多出来的五档,这五档往往是主力的“藏身处”。

2.2.1 十档盘口的结构

盘口数据是“快照”式的,每隔几毫秒推送一次。它包含:

  • 买一到买十:每个价位的挂单价格和数量
  • 卖一到卖十:同上
  • 总买量、总卖量:所有档位的挂单总和
  • 加权均价:部分交易所提供

我举个例子,你感受一下十档和五档的区别:

# 假设某股票当前价格10.00元
# Level-1只能看到:
买一:10.00  1000手
卖一:10.01  800手

# Level-2能看到:
买一:10.00  1000手
买二:9.99   500手
买三:9.98   200手
...
卖一:10.01  800手
卖二:10.02  1200手  # 这里!主力可能在这里挂了大量卖单
卖三:10.03  300手
...

看到了吗?Level-1只告诉你卖一有800手,但Level-2告诉你卖二有1200手。这1200手可能就是主力压盘的“隐形卖压”。如果你只看五档,会觉得抛压不大;看到十档,才知道上面还有一堆货等着。

注意:盘口数据是“快照”,不是“流水”。两次快照之间,可能发生了很多笔成交,但你看不到。所以盘口数据只能反映“某个瞬间”的挂单状态,不能完全代表真实的流动性。

2.2.2 盘口数据的“厚度”分析

我个人习惯用“盘口厚度”来判断主力的意图。什么叫盘口厚度?就是买一到买十的总量,和卖一到卖十的总量的比值。

举个例子:

  • 如果买盘总量是10万手,卖盘总量是5万手,说明买方力量强,但也要小心——是不是主力在“堆单”诱多?
  • 如果买盘和卖盘都很厚,比如各20万手,说明多空分歧大,可能要变盘。
  • 如果买盘很薄,卖盘很厚,但价格不跌,说明主力可能在“托单”,用少量买单维持价格。

嗯,这里要注意,盘口厚度不能只看绝对值,还要看“变化速度”。我曾经监控过一只票,盘口厚度在10秒内从5万手变成15万手,明显是主力在快速堆单。这种时候,往往意味着有大动作。

2.3 委托队列数据

委托队列,是Level-2里最“硬核”的数据。它告诉你,在买一和卖一的位置上,到底有多少笔委托在排队。

2.3.1 委托队列的结构

委托队列数据包含:

  • 买一队列:按时间顺序排列的买入委托,每笔委托的编号和数量
  • 卖一队列:同上,但方向相反
  • 队列总笔数:当前买一或卖一位置有多少笔委托
  • 队列总量:当前买一或卖一位置的总挂单量

为什么委托队列重要?因为它能帮你识别“虚假挂单”。

2.3.2 如何用委托队列识别“撤单”行为

我举个例子,你马上就明白了。

# 假设某股票买一位置10.00元,挂单总量5000手
# 委托队列显示:
委托1:1000手  (最早挂的)
委托2:2000手
委托3:500手
委托4:1500手  (最新挂的)

# 突然,总量从5000手变成3000手
# 但价格没变,说明有人撤单了
# 委托队列里,可能是委托2(2000手)撤了
# 也可能是委托4(1500手)撤了

你看,通过委托队列,你能知道撤单的是“大单”还是“小单”。如果撤掉的是2000手的大单,说明主力可能不想买了,或者是在“试盘”。如果撤掉的是500手的小单,可能只是散户的正常操作。

避坑指南:我曾经在实盘里吃过这个亏。当时看到买一有5000手大单托着,觉得跌不下去,就追进去了。结果下一秒,5000手全撤了,价格直接跳水。后来我才知道,那是主力用“拖拉机账户”挂的虚假买单,目的就是吸引跟风盘。所以,只看盘口总量是不够的,必须看委托队列,看这些单子是不是“实心”的。

2.3.3 委托队列的“排队顺序”

委托队列是按“时间优先”原则排序的。最早挂的单子排在最前面,最晚挂的排在最后面。

这意味着什么?意味着你可以通过队列位置,判断一笔委托的“优先级”。

  • 如果一笔大单排在队列最前面,说明它挂得早,很快就能成交。
  • 如果一笔大单排在队列最后面,说明它刚挂上去,想成交还得等。

这个信息在“抢涨停”的时候特别有用。如果你看到卖一队列里,前面几笔都是小单,后面突然冒出一笔大单,说明主力可能在排队卖出。这时候你就要小心了,别去接盘。

2.4 三者如何联动?

逐笔成交、盘口数据、委托队列,这三者不是孤立的。它们是一个完整的“交易过程”的三个视角。

我画了一张图,帮你理清它们的关系:

Level-2 三大数据模块联动关系 逐笔成交 每笔交易的“结果” 买卖盘口 挂单的“快照” 委托队列 挂单的“细节” 联动逻辑: 1. 盘口数据告诉你“现在谁在挂单”(静态) 2. 逐笔成交告诉你“刚才谁成交了”(动态) 3. 委托队列告诉你“挂单是怎么排队的”(微观) 实战:用盘口发现异常挂单 → 用委托队列确认是否撤单 → 用逐笔成交验证是否真实成交

你看,这三者是一个完整的闭环。盘口数据给你“全景”,委托队列给你“特写”,逐笔成交给你“回放”。

我自己的分析流程是这样的:

  1. 先看盘口,发现某个价位挂单量异常大(比如卖二突然多了5000手)
  2. 然后看委托队列,确认这5000手是几笔大单还是很多小单凑的
  3. 最后看逐笔成交,看这些单子有没有被吃掉,还是撤掉了

这样一套组合拳下来,主力的意图基本就暴露了七八分。

一个小技巧:如果你发现盘口上某个价位挂单量很大,但委托队列里只有一两笔大单,那大概率是主力在“挂单控价”。如果委托队列里有很多笔小单,那可能是散户跟风或者主力用拖拉机账户在堆单。这两种情况,后续走势完全不同。

2.5 数据处理的注意事项

最后,聊几个实际处理数据时容易踩的坑。

2.5.1 时间同步问题

逐笔成交的时间是交易所撮合时间,盘口数据的时间是快照生成时间,委托队列的时间是队列更新时间。这三个时间不是完全对齐的。你处理数据时,一定要用“成交编号”或“序列号”来关联,而不是单纯依赖时间戳。

2.5.2 数据量爆炸

一只活跃股票,一天的逐笔成交数据可能有几十万条。如果你同时监控几百只股票,数据量是TB级别的。我建议你只关注“异常数据”——比如单笔成交超过50万的、盘口挂单突然翻倍的、委托队列笔数骤变的。过滤掉噪音,才能看到信号。

2.5.3 交易所差异

上交所和深交所的Level-2数据格式不同,字段命名也不同。比如上交所的逐笔成交方向是B/S,深交所可能是0/1。你写代码时一定要做兼容处理。我一般会写一个统一的解析层,把两个交易所的数据标准化成同一套字段。

# 伪代码示例:统一解析层
def parse_tick_data(raw_data, exchange):
    if exchange == 'SH':
        return {
            'time': raw_data['TradeTime'],
            'price': raw_data['TradePrice'],
            'volume': raw_data['TradeVolume'],
            'direction': 'B' if raw_data['BuySellFlag'] == 'B' else 'S'
        }
    elif exchange == 'SZ':
        return {
            'time': raw_data['Time'],
            'price': raw_data['Price'],
            'volume': raw_data['Volume'],
            'direction': 'B' if raw_data['Direction'] == 1 else 'S'
        }
    else:
        raise ValueError('Unknown exchange')

嗯,这一章的内容就到这里。Level-2的数据基础,说白了就是这三个东西:逐笔成交、盘口、委托队列。搞懂它们,你才能看懂主力的“手影”。下一章,咱们会深入讲怎么用这些数据去识别大单拆分,那才是真正的实战环节。


专注资料整理