第二章 市场微观结构:订单簿深度解析
做高频交易,第一件事不是写代码,而是搞懂订单簿。
我见过太多人,策略写得花里胡哨,结果连盘口数据都读错了。说白了,订单簿就是市场的「心跳」。你听懂了心跳,才能判断市场是健康还是病危。
2.1 订单簿是什么?
订单簿,英文叫 Order Book。它记录了所有未成交的买卖订单。
你可以把它想象成一个「排队系统」:
- 买方在左边排队,出价高的排前面
- 卖方在右边排队,要价低的排前面
中间那个价格,就是当前能成交的价格。
核心概念:订单簿不是静态的。每一毫秒都在变化。有人挂单,有人撤单,有人吃单。这些变化就是我们的利润来源。
2.2 限价单 vs 市价单
这两种订单,是交易的基础。我刚开始做的时候,觉得这太简单了。后来吃了亏才明白,细节里全是坑。
限价单(Limit Order)
你指定一个价格,挂在那里等。比如「我出100块买,有人卖我就买」。优点是你控制价格,缺点是不一定能成交。
我个人习惯,做做市策略时大量使用限价单。因为我要赚的是买卖价差,不是赌方向。
市价单(Market Order)
你不指定价格,直接说「我要买,按当前最优价成交」。优点是秒成交,缺点是你可能买贵了。
我曾经在流动性差的时候用过市价单,结果滑点吃掉了我一周的利润。嗯,从那以后,我对市价单格外小心。
| 类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 限价单 | 价格可控 | 可能不成交 | 做市、套利 |
| 市价单 | 立即成交 | 滑点风险 | 抢单、止损 |
避坑指南:我曾经在回测中忽略了市价单的滑点,结果实盘直接亏了3%。记住,回测一定要模拟真实的订单簿深度。
2.3 盘口数据:Level 1 vs Level 2
盘口数据,就是订单簿的「快照」。但不同级别的数据,信息量天差地别。
Level 1 数据
只告诉你最优买卖价(Best Bid/Offer)和对应的量。说白了,就是「现在最想买的人出多少,最想卖的人要多少」。
这个数据够用吗?做低频交易够了。做高频?远远不够。
Level 2 数据
告诉你多个价位的挂单情况。比如买一到买十,卖一到卖十,每个价位有多少量。
你想想看,如果你能看到买二到买十的挂单,你就能判断支撑位在哪。这就是信息优势。
我的经验:Level 2 数据里,我最关注的是「深度变化率」。如果买一突然增加大量挂单,但价格没动,说明有大资金在托底。这时候做多胜率很高。
2.4 逐笔成交(Tick Data)
逐笔成交,就是每一笔成交的记录。它告诉你:谁在什么时间、以什么价格、买了多少。
这个数据有多重要?我举个例子。
有一次,我看到盘口数据很正常,但逐笔成交里频繁出现「大单主动吃单」。这说明有人在偷偷吸筹。我跟着做了一波,赚了。如果没有逐笔数据,我根本发现不了。
逐笔成交的核心字段:
- 时间戳(精确到毫秒甚至微秒)
- 成交价格
- 成交量
- 买卖方向(买方主动还是卖方主动)
关键点:逐笔数据是「事后」的,但它能帮你判断「谁在主导市场」。主动买盘多,说明买方强势;主动卖盘多,说明卖方强势。
2.5 交易撮合机制
交易所怎么撮合订单?说白了就是「价格优先、时间优先」。
价格优先:买价高的优先成交,卖价低的优先成交。
时间优先:价格相同,先挂单的先成交。
这个机制看似简单,但里面有个坑:
我曾经以为,只要我挂的价格比当前最优价高一点,就能立刻成交。结果发现,如果前面有同价位的挂单,我得排队。这就是时间优先的威力。
所以,做高频交易时,你的订单能不能成交,不仅取决于价格,还取决于你的网络延迟。你比别人慢1毫秒,可能就排到后面去了。
2.6 知识体系总览
下面这张图,是我自己总结的。它把本章的核心知识点串在了一起。
2.7 代码示例:解析 Level 2 数据
光说不练假把式。下面是我常用的一个 Python 函数,用来解析 Level 2 数据。
def parse_level2(data):
"""
解析 Level 2 盘口数据
data: 原始数据,格式为 {'bids': [[price, size], ...], 'asks': [[price, size], ...]}
"""
bids = data.get('bids', [])
asks = data.get('asks', [])
# 计算买卖深度
bid_depth = sum([size for price, size in bids[:5]])
ask_depth = sum([size for price, size in asks[:5]])
# 计算买卖压力比
pressure_ratio = bid_depth / ask_depth if ask_depth > 0 else float('inf')
# 计算价差
best_bid = bids[0][0] if bids else 0
best_ask = asks[0][0] if asks else 0
spread = best_ask - best_bid
return {
'best_bid': best_bid,
'best_ask': best_ask,
'spread': spread,
'bid_depth': bid_depth,
'ask_depth': ask_depth,
'pressure_ratio': pressure_ratio
}
使用建议:pressure_ratio 大于 1.5 时,说明买方强势。小于 0.7 时,卖方强势。但别死板,要结合逐笔数据一起看。
2.8 避坑总结
最后,我把自己踩过的坑总结一下:
- 别只看最优价:Level 1 数据太片面,至少要看 Level 2
- 别忽略撤单:有人挂大单又撤单,可能是诱多或诱空
- 别迷信逐笔数据:它是事后数据,只能辅助判断
- 别忽视时间戳:毫秒级的差异,可能决定你的订单能不能成交
嗯,这一章就到这里。记住,订单簿是你的眼睛。看不清市场,就别谈赚钱。