逐笔成交大单拆分识别技巧
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 三者如何联动?
逐笔成交、盘口数据、委托队列,这三者不是孤立的。它们是一个完整的“交易过程”的三个视角。
我画了一张图,帮你理清它们的关系:
你看,这三者是一个完整的闭环。盘口数据给你“全景”,委托队列给你“特写”,逐笔成交给你“回放”。
我自己的分析流程是这样的:
- 先看盘口,发现某个价位挂单量异常大(比如卖二突然多了5000手)
- 然后看委托队列,确认这5000手是几笔大单还是很多小单凑的
- 最后看逐笔成交,看这些单子有没有被吃掉,还是撤掉了
这样一套组合拳下来,主力的意图基本就暴露了七八分。
一个小技巧:如果你发现盘口上某个价位挂单量很大,但委托队列里只有一两笔大单,那大概率是主力在“挂单控价”。如果委托队列里有很多笔小单,那可能是散户跟风或者主力用拖拉机账户在堆单。这两种情况,后续走势完全不同。
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的数据基础,说白了就是这三个东西:逐笔成交、盘口、委托队列。搞懂它们,你才能看懂主力的“手影”。下一章,咱们会深入讲怎么用这些数据去识别大单拆分,那才是真正的实战环节。