2. 订单簿基础:限价订单簿结构与价格形成机制
大家好,欢迎来到第二章。
上一章我们聊了市场微观结构到底在研究什么。这一章,咱们直接切入最核心的东西——限价订单簿。说白了,它就是交易所的“账本”,记录着所有交易者想买想卖的意愿。
我个人习惯把订单簿比作一个“价格-数量”的二维战场。买方和卖方在这里博弈,价格就在这个过程中形成。你想想看,没有订单簿,价格从哪来?
2.1 订单簿的基本构成
一个标准的限价订单簿,由两部分组成:
- 买盘(Bid Side):所有买入限价订单的集合,按价格从高到低排列。
- 卖盘(Ask Side):所有卖出限价订单的集合,按价格从低到高排列。
嗯,这里要注意:买一(Best Bid)是买方愿意出的最高价,卖一(Best Ask)是卖方愿意接受的最低价。两者之间的差距,就是买卖价差(Spread)。
核心公式:
价差 = 卖一价 - 买一价
中间价 = (买一价 + 卖一价) / 2
我在项目中遇到过一个问题:有些初学者会把“买一”和“卖一”搞反。记住,买一永远是价格最高的那个买单,因为它最想成交。
2.2 价格形成机制:撮合规则
价格是怎么跳动的?说白了就是订单的到达和撮合。
当一个新订单到达时,系统会做两件事:
- 检查能否立即成交:如果是买单,看价格是否≥卖一价;如果是卖单,看价格是否≤买一价。
- 不能成交则挂单:进入订单簿,等待未来的对手盘。
我曾经踩过一个坑:以为市价单一定会全部成交。其实不是,如果流动性不足,市价单会吃掉所有对手盘后,剩余部分变成限价单挂在簿上。嗯,这个细节很重要。
2.3 订单簿的深度与可视化
光看买一卖一是不够的。我们需要看订单簿深度——每个价位上挂了多少量。
我个人习惯用累积深度图来快速判断支撑和阻力。下面我用SVG画了一张典型的订单簿结构图,帮你直观理解:
你看,买一和卖一之间有个缺口,这就是价差。价差越小,说明流动性越好。我在做高频策略时,最怕的就是价差突然拉大——那通常意味着市场在剧烈波动。
2.4 订单簿的更新事件
订单簿不是静态的。它每时每刻都在变化。主要事件有四种:
| 事件类型 | 描述 | 对价格的影响 |
|---|---|---|
| 新订单到达 | 新的限价单进入簿中 | 可能改变买一/卖一,影响价差 |
| 订单成交 | 买卖双方匹配,订单从簿中移除 | 直接产生成交价格 |
| 订单撤销 | 交易者取消未成交订单 | 可能暴露更深层次的流动性 |
| 订单修改 | 改变价格或数量(通常视为撤销+新单) | 相当于两个事件的组合效果 |
你可能会问:为什么订单修改要拆成两步?嗯,这是交易所的规则。我见过一些新手直接修改价格,结果发现订单被系统拒绝——因为修改后的价格可能立即触发成交。
2.5 用Python模拟一个简单的订单簿
光说不练假把式。我们来写一个最简单的订单簿模拟器。别怕,代码不长:
class OrderBook:
def __init__(self):
self.bids = {} # 价格 -> 数量
self.asks = {} # 价格 -> 数量
def add_order(self, side, price, quantity):
if side == 'buy':
self.bids[price] = self.bids.get(price, 0) + quantity
else:
self.asks[price] = self.asks.get(price, 0) + quantity
def get_best_bid(self):
return max(self.bids.keys()) if self.bids else None
def get_best_ask(self):
return min(self.asks.keys()) if self.asks else None
def get_spread(self):
bid = self.get_best_bid()
ask = self.get_best_ask()
if bid and ask:
return ask - bid
return None
# 使用示例
book = OrderBook()
book.add_order('buy', 9.99, 3000)
book.add_order('buy', 9.98, 2500)
book.add_order('sell', 10.01, 2800)
book.add_order('sell', 10.02, 2200)
print(f"买一: {book.get_best_bid()}")
print(f"卖一: {book.get_best_ask()}")
print(f"价差: {book.get_spread()}")
小提示:实际生产环境中,订单簿是用红黑树或跳表实现的,因为我们需要快速找到最大/最小值。Python的sortedcontainers库是个不错的选择。
2.6 价格形成的微观逻辑
价格到底是怎么形成的?我个人的理解是:价格是订单流冲击的结果。
当一个大的买单进来,它会吃掉卖一、卖二、卖三...直到买完为止。成交价格会从卖一价一路向上推。这就是价格发现的过程。
反过来,如果卖单多,价格就往下走。说白了,价格就是买卖双方力量的平衡点。
避坑指南:我曾经以为订单簿深度是静态的。后来发现,很多高频做市商会隐藏订单(冰山订单),只显示一部分量。你看到的深度,可能只是冰山一角。
2.7 订单簿的统计特征
在实际分析中,我们经常关注几个指标:
- 价差:流动性越好的股票,价差越小。比如茅台可能只有几分钱,而一些小盘股可能几毛钱。
- 订单簿斜率:衡量价格变动对订单量的敏感度。斜率越大,说明越难推动价格。
- 订单到达率:单位时间内到达的订单数量。这个指标对高频策略特别重要。
我记得有一次做回测,发现策略在模拟环境里表现很好,一上实盘就亏钱。后来排查发现,模拟环境里的订单到达率是均匀的,而实盘是聚簇到达的——订单经常扎堆来。这个差异直接影响了策略的成交概率。
2.8 小结
这一章我们聊了订单簿的基本结构、价格形成机制,还动手写了一个简单的模拟器。核心就三句话:
- 订单簿是买卖意愿的集合
- 价格由订单流冲击形成
- 价差和深度是衡量流动性的关键
下一章我们会深入订单流分析,看看如何从订单簿的微观变化中捕捉交易信号。嗯,那才是真正有意思的部分。
公众号:蓝海资料掘金营,微信deep3321