3、订单流基础:逐笔成交与Level2数据的解读
做高频交易的朋友都知道,行情数据就是我们的「眼睛」。但很多人盯盘盯了半天,看的还是K线图上那几根柱子。说实话,K线能给你的信息太有限了。真正有价值的东西,藏在逐笔成交和Level2数据里。
我刚开始接触订单流的时候,也觉得很懵。一堆数字,一堆时间戳,到底怎么看?后来在实盘项目中踩了不少坑,才慢慢摸到门道。今天我就把这块的核心逻辑给你捋清楚。
3.1 逐笔成交:最原始的「战场记录」
逐笔成交,说白了就是每一笔真实成交的「流水账」。它记录了谁在什么时间、以什么价格、买了多少股。这是最原始的数据,没有经过任何加工。
举个例子,你看到的逐笔成交数据大概长这样:
时间戳 价格 成交量 方向
09:30:01.123 10.01 200 买
09:30:01.456 10.02 150 卖
09:30:01.789 10.01 300 买
注意那个「方向」字段。它标记了这笔成交是主动买入还是主动卖出。怎么判断的?很简单——谁先挂单,谁就是被动方;谁主动去「吃」这个单子,谁就是主动方。
核心要点:主动买 = 买方吃卖方挂单,主动卖 = 卖方吃买方挂单。这个方向判断,是所有订单流分析的基础。
我在项目中遇到过一个问题:有些交易所的逐笔数据里,方向字段是缺失的。这时候怎么办?你得自己算。拿成交价格和当时的买卖盘口对比——如果成交价等于卖一价,那就是主动买;等于买一价,那就是主动卖。
3.2 Level2数据:比逐笔成交多了一层「挂单」
逐笔成交告诉你「已经发生了什么」,而Level2数据告诉你「正在发生什么」。
Level2的核心是「深度行情」,也就是买卖盘口的前N档挂单。国内A股市场一般给到10档,期货市场有的给到5档,美股甚至能到100档。每一档都包含价格和对应的挂单量。
你看这个结构:
卖五 10.05 1200
卖四 10.04 800
卖三 10.03 1500
卖二 10.02 600
卖一 10.01 2000
-------------------
买一 10.00 1800
买二 9.99 900
买三 9.98 1100
买四 9.97 700
买五 9.96 1300
这就像一场拍卖会。买一和卖一之间的价差,就是「撮合区」。价格要波动,必须有一方吃掉另一方的挂单。
我的习惯:我一般会同时盯着逐笔成交和Level2的挂单变化。逐笔成交告诉你「谁赢了」,Level2告诉你「下一场战斗的弹药还有多少」。
3.3 订单流的核心逻辑:供需失衡
你想想看,价格为什么会涨?因为主动买的人多,把卖一、卖二、卖三...一层层吃掉了。为什么会跌?因为主动卖的人多,把买一、买二、买三...一层层砸穿了。
订单流分析,就是量化这个「供需失衡」的过程。我们关注几个关键指标:
- 逐笔成交的买卖量差:一段时间内,主动买的总量减去主动卖的总量。正数说明买方强势,负数说明卖方强势。
- 挂单的厚度变化:卖一挂单突然减少,说明有人在偷偷吃货。买一挂单突然增加,说明有人在托底。
- 大单成交:一笔成交超过某个阈值(比如1000股),往往意味着机构或大户在行动。
我曾经在实盘里遇到过一个经典场景:某只股票价格横盘不动,但逐笔成交里连续出现大额主动买。我当时就觉得不对劲——价格没涨,但有人在偷偷吸筹。果然后面半小时直接拉了一波。这就是订单流给你的「提前量」。
3.4 实战:如何用Python解析Level2数据
光说不练假把式。我给你一段代码,演示怎么解析Level2的买卖盘口数据。假设数据是从交易所API拿到的JSON格式。
import json
def parse_level2(raw_data):
"""
解析Level2深度行情数据
raw_data: 从API获取的原始JSON字符串
"""
data = json.loads(raw_data)
# 提取买卖盘口
bids = data['bids'] # 买单列表,格式 [[价格, 量], ...]
asks = data['asks'] # 卖单列表,格式 [[价格, 量], ...]
# 计算买卖压力比
bid_volume = sum([item[1] for item in bids[:5]]) # 前5档买单总量
ask_volume = sum([item[1] for item in asks[:5]]) # 前5档卖单总量
pressure_ratio = bid_volume / ask_volume if ask_volume > 0 else float('inf')
# 计算买卖价差
spread = asks[0][0] - bids[0][0]
return {
'bid_volume': bid_volume,
'ask_volume': ask_volume,
'pressure_ratio': pressure_ratio,
'spread': spread
}
# 使用示例
raw = '{"bids": [[10.00, 1800], [9.99, 900]], "asks": [[10.01, 2000], [10.02, 600]]}'
result = parse_level2(raw)
print(f"买卖压力比: {result['pressure_ratio']:.2f}")
print(f"价差: {result['spread']:.2f}")
注意:不同交易所的Level2数据格式差异很大。有的用数组,有的用对象,有的还带时间戳。一定要先看API文档,别想当然。
3.5 避坑指南:我踩过的几个坑
嗯,这里我要多说几句。订单流数据看着简单,但用起来全是坑。
第一个坑:数据延迟。我曾经用过一个第三方数据源,Level2数据延迟了500毫秒。你以为你在看实时盘口,其实看到的已经是「历史」了。做高频交易,延迟就是亏损。建议直接用交易所官方API,或者找延迟在10毫秒以内的数据商。
第二个坑:逐笔成交的合并问题。有些交易所会把同一时间戳、同一价格的成交合并成一条记录。这时候你看到的「一笔成交」可能实际上是好几笔小单的汇总。如果你用这个数据去算「大单占比」,结果会失真。
第三个坑:挂单的虚假厚度。有些做市商或者量化机构,会在盘口挂大量单子但不成交,目的是制造「流动性充足」的假象。等你真的去吃这些单子,它们瞬间就撤了。这就是所谓的「冰山订单」。怎么识别?看挂单的撤单频率——如果某个价位频繁出现大单又频繁撤单,八成是假的。
3.6 知识体系总览
下面这张图,是我自己总结的订单流知识结构。你可以把它当成一个「地图」,学完这一章后,你应该能看懂每个模块在讲什么。
你看,整个体系其实就三层:底层是原始数据(逐笔成交和Level2),中间层是供需失衡分析,顶层是具体的实战指标。每一层都依赖下一层,不能跳步。
我的建议:刚开始学的时候,别急着上复杂的模型。先把逐笔成交的买卖方向搞明白,再把Level2的盘口变化看熟。这两个基本功打扎实了,后面的订单流策略就是水到渠成的事。
好了,这一章的内容就到这里。记住一句话:订单流数据不是魔法,它只是把市场的「微观动作」放大了给你看。能不能从中赚钱,取决于你能不能读懂这些动作背后的「意图」。
公众号:蓝海资料掘金营,微信deep3321