第二章 市场微观结构:订单簿深度解析
做高频交易,你第一个要面对的东西,就是订单簿。说白了,它就是市场的「心跳」。我刚开始接触这个领域时,总觉得策略逻辑写好了就行,订单簿嘛,看看价格就够了。后来被市场狠狠教育了一次——嗯,那次教训让我明白,不懂订单簿,高频交易就是盲人摸象。
2.1 订单簿是什么?
订单簿,就是交易所里所有未成交订单的实时列表。它分两边:买单(Bid)和卖单(Ask)。买单从高到低排,卖单从低到高排。中间那个空隙,就是买卖价差。
我个人习惯把订单簿想象成一个「战场」:买单是防守方,卖单是进攻方。谁的资金厚,谁就能暂时控制价格走向。
核心概念:订单簿的每一档价格,都对应着挂单量和挂单笔数。量越大,说明这个价位的「城墙」越厚。
举个例子,假设某股票当前订单簿长这样:
| 卖单价格 | 卖单量 | 买单价格 | 买单量 |
|---|---|---|---|
| 10.05 | 200 | 9.98 | 150 |
| 10.04 | 100 | 9.97 | 300 |
| 10.03 | 500 | 9.96 | 80 |
| 10.02 | 50 | 9.95 | 600 |
这里,最优卖价是10.02,最优买价是9.98。价差就是4个tick。如果你现在下市价单买入,你会吃掉10.02的50股,然后继续吃10.03的500股……直到你的订单被完全成交。
我的经验:做策略回测时,千万别只看最优价。我曾经有个策略,回测时收益漂亮得很,实盘一跑就亏。后来发现,回测里我假设市价单总能以最优价成交,但实盘里流动性不足时,滑点能把利润全吃掉。
2.2 买卖价差与市场深度
买卖价差(Bid-Ask Spread),就是最优卖价减去最优买价。它衡量的是「交易成本」。价差越小,流动性越好,交易成本越低。
市场深度(Market Depth),则是指订单簿上各个价位的挂单总量。深度越厚,大单对价格的冲击就越小。
为什么会这样?你想想看,如果一个股票买一档挂了10万股,卖一档只挂了100股。这时候你下个市价卖单,瞬间就把卖一档打穿了,价格可能直接跳好几个tick。这就是深度不对称带来的滑点风险。
避坑指南:我曾经在某个流动性极差的品种上做高频策略,以为价差小就安全。结果发现,价差虽然只有1个tick,但每档深度只有几十股。我的策略每次下单几百股,直接把价格打飞了。后来我加了一个「深度检查」模块,下单前先看当前档位的挂单量够不够吃。
衡量市场深度,我常用两个指标:
- 订单簿不平衡(Order Book Imbalance):(买盘总量 - 卖盘总量)/(买盘总量 + 卖盘总量)。正值表示买盘强,负值表示卖盘强。
- 价格冲击系数(Price Impact Coefficient):每成交一定数量,价格移动多少个tick。这个系数越大,说明市场越脆弱。
代码实现上,计算订单簿不平衡很简单:
def order_book_imbalance(bids, asks, levels=5):
"""
bids: [(price, volume), ...]
asks: [(price, volume), ...]
"""
bid_vol = sum(v for _, v in bids[:levels])
ask_vol = sum(v for _, v in asks[:levels])
if bid_vol + ask_vol == 0:
return 0
return (bid_vol - ask_vol) / (bid_vol + ask_vol)
这个值在 -1 到 1 之间。我个人习惯把它作为一个特征输入到机器学习模型里,预测短期价格方向。效果嘛,比单纯看价格走势好不少。
2.3 订单类型及其对策略的影响
订单类型,是策略和交易所之间的「语言」。你用错订单类型,策略逻辑再牛也没用。
2.3.1 市价单(Market Order)
市价单,就是「不管价格,立即成交」。它的优点是成交速度快,缺点是滑点不可控。
我记得有一次做统计套利,两个品种的价差到了阈值,我下市价单进场。结果因为对面流动性瞬间被抽走,我的成交价比预期差了3个tick。那次交易虽然方向对了,但滑点把利润全吃掉了。
适用场景:
- 需要立即成交,比如抢单策略
- 流动性极好,滑点可以忽略
- 作为限价单的「保护」——限价单没成交时,用市价单平仓
2.3.2 限价单(Limit Order)
限价单,就是「指定价格,等成交」。它的优点是能控制成交价格,缺点是有可能永远成交不了。
做高频做市策略时,限价单是主力。你在买一档挂单,等着别人来吃。赚的就是买卖价差。但这里有个坑:如果市场趋势很强,你的限价单可能一直挂在错误的方向上。
我的建议:限价单一定要配合「撤单重挂」逻辑。比如你在买一挂了单,结果价格跌了,你的单子变成了买二甚至买三。这时候如果不撤单重挂,你的单子可能永远成交不了,或者成交在不利的价格上。
2.3.3 冰山订单(Iceberg Order)
冰山订单,就是大单拆成小单,只显示一部分。交易所只暴露「冰山一角」,剩下的藏在下面。
为什么要用冰山订单?说白了,就是不想让别人知道你的真实意图。如果你在买一档直接挂100万股,所有人都知道这里有强支撑,对手方会提前布局。用冰山订单,每次只显示1万股,别人以为只是普通散户在买。
我在项目中遇到过这样的情况:某个机构客户想建仓,但又不想推高价格。他用了冰山订单,每次只挂几千股,成交了再补。结果花了整整一个下午才建完仓,但价格几乎没动。如果他用市价单,估计建仓成本要高2%。
冰山订单的识别:
- 同一价位频繁出现相同数量的挂单,撤单后又出现
- 某个价位的挂单量突然增加,但成交后很快又恢复原样
- 订单簿上出现「幽灵挂单」——挂单量远大于正常水平
代码层面,检测冰山订单可以用这个逻辑:
def detect_iceberg(order_book, price_level, threshold=0.8):
"""
检测某个价位是否存在冰山订单
threshold: 挂单量恢复比例阈值
"""
# 记录该价位的挂单量变化
vol_history = []
for snapshot in order_book.history:
vol = snapshot.get_volume_at(price_level)
vol_history.append(vol)
# 如果挂单量频繁恢复到某个值附近,可能是冰山
recover_count = 0
for i in range(1, len(vol_history)):
if abs(vol_history[i] - vol_history[i-1]) < 0.01 * vol_history[i-1]:
recover_count += 1
return recover_count / len(vol_history) > threshold
2.4 知识体系总览
说了这么多,我把本章的核心逻辑画成了一张图。你一看就明白:
这张图把本章的核心内容串起来了。订单簿是基础,价差和深度是衡量指标,订单类型是执行工具。三者缺一不可。
2.5 实战中的注意事项
最后,分享几个我在实战中踩过的坑:
- 别迷信订单簿数据——有些交易所的订单簿数据有延迟,或者存在「虚假挂单」。挂单后马上撤单,这种叫「钓鱼单」,专门引诱你上钩。
- 注意订单簿的更新频率——高频交易中,订单簿每秒可能更新几百次。你的策略处理速度必须跟上,否则看到的是过期数据。
- 冰山订单的检测要谨慎——我见过有人写了个冰山检测算法,结果把正常的散户挂单也识别成了冰山,导致策略频繁误判。
- 价差不是越小越好——有些品种价差极小,但深度极差。这种市场你一进去就出不来,流动性陷阱。
最后提醒一句:订单簿是市场的「心电图」。读懂了它,你就能感知到市场的呼吸和脉搏。但记住,心电图只是表象,背后的资金博弈才是本质。别沉迷于数据,忘了思考谁在对面。
公众号:蓝海资料掘金营,微信deep3321