第十九章:订单流与盘口深度——将Level 2盘口数据与订单流结合,识别隐藏流动性
说实话,做订单流交易做到一定程度,你会发现一个尴尬的事:
光看逐笔成交和Delta,你只能看到「已经发生的事」。但真正的大资金在动手之前,往往会先「藏」一手。它们把大单拆成小单,挂在盘口的各个价位上,等着你去撞。
这就是隐藏流动性。
我早年做量化的时候,吃过一次大亏。当时一个品种Delta持续为正,我无脑做多,结果被一根大阴线直接打穿止损。后来复盘才发现,盘口的卖二到卖五堆满了挂单,但成交明细里根本看不到大单——人家用的是冰山订单。
从那以后,我就把Level 2盘口数据和订单流绑在一起看了。
19.1 为什么盘口深度能帮你发现「假象」?
Level 2数据,说白了就是能看到「排队的人」。
普通行情只给你看最优买卖价,但Level 2能告诉你:
- 每个价位上挂了多少钱
- 这些挂单是主动撤单还是被动成交
- 大单是真实意图还是虚晃一枪
你想想看,如果卖一挂了100手,卖二挂了500手,卖三挂了2000手。这时候突然卖三的2000手撤了——这不是巧合,这是有人在「试盘」。
核心逻辑:
盘口深度 + 订单流 = 识别「真买真卖」与「假挂假撤」
Delta告诉你谁在主动进攻,盘口告诉你谁在埋伏。
19.2 隐藏流动性的三种常见形态
我根据实战经验,把隐藏流动性归纳为三类。嗯,这里要注意,每种形态对应的策略完全不同。
| 形态 | 盘口特征 | 订单流特征 | 我的应对 |
|---|---|---|---|
| 冰山订单 | 某个价位挂单量突然减少,但成交后挂单量不变 | Delta连续为正,但大单不出现 | 跟随Delta方向,但止损设窄 |
| 虚假深度 | 大单挂出后快速撤单,反复出现 | Delta与价格反向 | 反向开仓,吃撤单的流动性 |
| 吸筹式堆积 | 盘口买卖价差缩小,中间价位挂单密集 | 小单频繁成交,大单不显 | 等待突破,跟随堆积方向 |
我记得有一次做螺纹钢,盘口买二到买五全是1000手以上的挂单,但价格就是不跌。我盯着Delta看,发现虽然卖单主动,但每次打到买二就弹回去。后来我明白了——那些买盘是「真金白银」在接,卖盘是「纸老虎」在吓人。
19.3 如何用Python计算「盘口压力/支撑强度」
光靠肉眼盯盘口,迟早瞎掉。我习惯把盘口数据量化成几个指标:
import pandas as pd
import numpy as np
def calc_depth_pressure(bids, asks):
"""
bids: 买单深度,格式 [(price, size), ...]
asks: 卖单深度,格式 [(price, size), ...]
返回:压力比、支撑比、深度不平衡度
"""
# 计算前5档的总挂单量
bid_volume = sum([size for _, size in bids[:5]])
ask_volume = sum([size for _, size in asks[:5]])
# 压力比 = 卖盘 / 买盘
pressure_ratio = ask_volume / (bid_volume + 1e-8)
# 支撑比 = 买盘 / 卖盘
support_ratio = bid_volume / (ask_volume + 1e-8)
# 深度不平衡度:正数表示买盘强,负数表示卖盘强
imbalance = (bid_volume - ask_volume) / (bid_volume + ask_volume)
return {
'pressure_ratio': round(pressure_ratio, 2),
'support_ratio': round(support_ratio, 2),
'imbalance': round(imbalance, 4)
}
# 示例数据
bids = [(100.0, 500), (99.9, 800), (99.8, 1200), (99.7, 600), (99.6, 400)]
asks = [(100.1, 300), (100.2, 700), (100.3, 1500), (100.4, 900), (100.5, 200)]
result = calc_depth_pressure(bids, asks)
print(result)
# 输出:{'pressure_ratio': 0.86, 'support_ratio': 1.16, 'imbalance': 0.074}
这个 imbalance 值,我一般设个阈值:超过0.2算强买盘,低于-0.2算强卖盘。但注意,别只看绝对值——趋势中的 imbalance 和震荡中的 imbalance 意义完全不同。
19.4 订单流 + 盘口深度的「双确认」信号
我个人最常用的策略,是等两个条件同时满足才动手:
- 订单流信号:Delta连续3根K线为正,且累积Delta突破前高
- 盘口信号:卖盘压力比持续下降,且买一挂单量开始增加
为什么会这样?因为大资金进场前,通常会先「清场」——把对手方的挂单吃掉,然后自己再挂上新的单子。如果你只看到Delta为正就追进去,很可能追在高点。
实战技巧:
我曾经在股指期货上吃过这个亏。后来我加了一个过滤条件:只有当盘口「卖一」的挂单量小于「买一」挂单量的80%时,才考虑进场。这个简单的规则,帮我过滤掉了至少30%的假突破。
19.5 识别「虚假深度」的算法
虚假深度是高频做市商常用的手法。它们会在某个价位挂出大单,吓唬散户,然后迅速撤单。怎么识别?
我写了个简单的检测函数:
def detect_fake_depth(depth_snapshots, threshold=0.3):
"""
depth_snapshots: 连续的快照数据,每个快照包含 bids 和 asks
threshold: 挂单存活时间阈值(秒)
返回:疑似虚假深度的价位列表
"""
fake_levels = []
for i in range(1, len(depth_snapshots)):
prev = depth_snapshots[i-1]
curr = depth_snapshots[i]
# 检查卖盘:上一秒有大单,下一秒消失了
for price, size in prev['asks']:
if size > 500: # 大单阈值
# 检查当前快照中该价位是否还存在
curr_sizes = [s for p, s in curr['asks'] if abs(p - price) < 0.01]
if not curr_sizes or curr_sizes[0] < size * 0.1:
fake_levels.append({
'price': price,
'removed_size': size,
'type': 'ask_fake'
})
# 同理检查买单
for price, size in prev['bids']:
if size > 500:
curr_sizes = [s for p, s in curr['bids'] if abs(p - price) < 0.01]
if not curr_sizes or curr_sizes[0] < size * 0.1:
fake_levels.append({
'price': price,
'removed_size': size,
'type': 'bid_fake'
})
return fake_levels
这个算法不复杂,但很实用。我把它跑在历史数据上,发现大部分虚假深度出现在开盘前15分钟和收盘前15分钟——嗯,这两个时间段流动性最差,也最好骗。
19.6 知识体系总览
下面这张图,是我自己整理的知识框架。每次做策略迭代前,我都会拿出来看一眼,防止自己跑偏。
19.7 避坑指南
最后,说几个我踩过的坑:
⚠️ 我曾经犯过的错:
- 别迷信盘口挂单量:有一次我看到买一挂了3000手,以为支撑很强,结果那是人家用程序挂的「托单」,一成交就撤。后来我加了「挂单存活时间」这个维度,低于3秒的挂单直接忽略。
- Delta和盘口要同步看:单看Delta容易追涨杀跌,单看盘口容易被假深度骗。我现在的策略是:Delta给出方向,盘口给出「这个方向是否可信」的验证。
- 注意时间窗口:同样的盘口结构,在开盘、盘中、收盘意义完全不同。我习惯把一天分成4个时段,分别训练不同的参数。
隐藏流动性这个东西,说白了就是大资金和散户之间的信息差。你如果能通过Level 2数据把它识别出来,就等于戴了一副透视眼镜在看市场。嗯,剩下的就是纪律和执行力了。
我的建议:
刚开始练的时候,别急着实盘。找一段历史数据,把盘口快照和订单流回放出来,手动标记「疑似隐藏流动性」的位置。练上100个案例,你自然就有感觉了。
无相订单流研究社 微信Lucian808555