2. 订单簿基础:限价订单簿结构与价格形成机制

大家好,欢迎来到第二章。

上一章我们聊了市场微观结构到底在研究什么。这一章,咱们直接切入最核心的东西——限价订单簿。说白了,它就是交易所的“账本”,记录着所有交易者想买想卖的意愿。

我个人习惯把订单簿比作一个“价格-数量”的二维战场。买方和卖方在这里博弈,价格就在这个过程中形成。你想想看,没有订单簿,价格从哪来?

2.1 订单簿的基本构成

一个标准的限价订单簿,由两部分组成:

  • 买盘(Bid Side):所有买入限价订单的集合,按价格从高到低排列。
  • 卖盘(Ask Side):所有卖出限价订单的集合,按价格从低到高排列。

嗯,这里要注意:买一(Best Bid)是买方愿意出的最高价,卖一(Best Ask)是卖方愿意接受的最低价。两者之间的差距,就是买卖价差(Spread)

核心公式:

价差 = 卖一价 - 买一价

中间价 = (买一价 + 卖一价) / 2

我在项目中遇到过一个问题:有些初学者会把“买一”和“卖一”搞反。记住,买一永远是价格最高的那个买单,因为它最想成交。

2.2 价格形成机制:撮合规则

价格是怎么跳动的?说白了就是订单的到达和撮合

当一个新订单到达时,系统会做两件事:

  1. 检查能否立即成交:如果是买单,看价格是否≥卖一价;如果是卖单,看价格是否≤买一价。
  2. 不能成交则挂单:进入订单簿,等待未来的对手盘。

我曾经踩过一个坑:以为市价单一定会全部成交。其实不是,如果流动性不足,市价单会吃掉所有对手盘后,剩余部分变成限价单挂在簿上。嗯,这个细节很重要。

2.3 订单簿的深度与可视化

光看买一卖一是不够的。我们需要看订单簿深度——每个价位上挂了多少量。

我个人习惯用累积深度图来快速判断支撑和阻力。下面我用SVG画了一张典型的订单簿结构图,帮你直观理解:

限价订单簿结构示意图 买盘 (Bid Side) 卖盘 (Ask Side) 买五: 9.95 1000股 买四: 9.96 1500股 买三: 9.97 2000股 买二: 9.98 2500股 买一: 9.99 3000股 卖一: 10.01 2800股 卖二: 10.02 2200股 卖三: 10.03 1800股 卖四: 10.04 1200股 卖五: 10.05 800股 价差 0.02 中间价: 10.00

你看,买一和卖一之间有个缺口,这就是价差。价差越小,说明流动性越好。我在做高频策略时,最怕的就是价差突然拉大——那通常意味着市场在剧烈波动。

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