订单簿基础:限价单与市价单、订单簿的构建与维护、买卖盘口与深度

做量化交易这些年,我越来越觉得订单簿这东西,就像市场的「心电图」。你盯着它看久了,能感受到买卖双方的呼吸节奏。今天咱们就把它拆开揉碎了讲清楚。

一、两种最基础的订单类型

先聊聊订单类型。说白了,交易所里就两种核心玩法:限价单和市价单。其他的什么冰山单、止损单,都是在这俩基础上变出来的花样。

1. 限价单(Limit Order)

限价单就是你告诉交易所:「我只愿意在这个价格买(或卖),高了我不买,低了我不卖。」它像个固执的猎人,蹲在某个价位等着猎物撞上来。

特点:

  • 价格确定,成交时间不确定
  • 提供市场流动性(你挂单,别人来吃)
  • 可能永远无法成交(价格没到)

举个例子,BTC当前价格30000,你觉得它跌到29800是个好买点。于是你挂一个限价买单,价格29800,数量1个BTC。这时候你的单子就进了订单簿的买盘队列里等着。

我个人习惯:做高频策略时,限价单是我的主力工具。因为它能让我「赚差价」——挂买单赚卖单的钱,挂卖单赚买单的钱。但要注意,行情剧烈波动时,你的限价单可能被「吃掉」后行情继续往不利方向跑。

2. 市价单(Market Order)

市价单就简单粗暴了:「不管什么价格,我现在就要成交!」它像个急性子的买家,冲进市场直接扫货。

特点:

  • 成交时间确定,价格不确定
  • 消耗市场流动性(你吃掉别人的挂单)
  • 可能产生较大的滑点(流动性不足时)

你想想看,如果你用市价单买入1个BTC,而卖一档只有0.5个BTC,那剩下的0.5个就得去卖二档甚至卖三档成交。这就是滑点的来源。

我曾经踩过的坑:有一次做回测,我忽略了市价单的滑点模型,结果实盘时发现实际成交价比回测差了0.3%。别小看这0.3%,高频交易里这就是盈亏的分水岭。后来我学乖了,回测时一定加上「冲击成本模型」。

二、订单簿的构建与维护

订单簿,说白了就是一个「价格-数量」的映射表。买盘按价格从高到低排,卖盘按价格从低到高排。但真正实现起来,有几个细节你得注意。

1. 数据结构的选择

我建议用红黑树或跳表来实现订单簿。为什么?因为订单簿的核心操作是:插入、删除、查询最优价格。这些操作在红黑树里都是O(log n)的复杂度。

给你看个简单的Python实现思路:

class OrderBook:
    def __init__(self):
        self.bids = {}  # 买盘,价格->数量
        self.asks = {}  # 卖盘,价格->数量
        self.bid_prices = []  # 维护有序价格列表
        self.ask_prices = []
    
    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 remove_order(self, side, price, quantity):
        # 扣减数量,如果归零则删除该价格档位
        pass
    
    def get_top(self, side, n=5):
        # 返回前n档最优价格
        pass

嗯,这里要注意:实际生产环境里,我一般用C++实现,Python只用来做原型验证。因为订单簿的更新频率太高了,Python的GIL会成瓶颈。

2. 事件驱动的更新机制

订单簿不是静态的。每秒钟可能有成百上千次变化。你得处理好三种事件:

  • 新增订单:新的限价单进入队列
  • 撤销订单:挂单的人撤单了
  • 成交:市价单吃掉了限价单

我见过不少新手,每次收到行情快照就全量重建订单簿。这太慢了。正确的做法是:维护一个「增量更新」的机制,只处理变化的部分。

一个小技巧:你可以维护一个「脏标记」。当某个价格档位发生变化时,标记它为脏。只有在查询深度时才去重新计算。这样可以减少不必要的计算量。

三、买卖盘口与深度

盘口,就是订单簿里最显眼的那几档价格。深度,则是这些价格背后堆积的「弹药量」。

1. 盘口结构

一个典型的盘口长这样:

卖五 卖四 卖三 卖二 卖一 买一 买二 买三 买四 买五
30010 30008 30006 30004 30002 29998 29996 29994 29992 29990
1.2 0.8 2.1 1.5 3.0 2.5 1.8 0.6 2.3 1.1

卖一和买一之间的价差,叫「买卖价差」(Spread)。这是市场流动性的核心指标。价差越小,流动性越好。

2. 深度分析

深度不只是看某一档有多少量,更要看「累积深度」。比如你想买入10个BTC,不能只看卖一档的3个BTC,得看卖一到卖五加起来够不够。

我常用一个指标叫「深度斜率」——计算从最优价格往外,每变动一个最小价格单位,累积数量的变化率。斜率陡峭,说明深度集中在当前价格附近;斜率平缓,说明深度分布均匀。

实战经验:我在做「订单簿不平衡」策略时,会实时计算买卖盘口的深度差。如果买盘前五档的总量远大于卖盘前五档,说明买方力量强,短期看涨。但要注意,大资金经常会挂「虚假深度」来诱导你。我曾经被这种「托单」骗过几次,后来加了成交量确认才稳住。

四、核心知识体系

下面这张图,是我自己总结的订单簿知识框架。你看一眼就能明白各个模块之间的关系。

订单簿核心知识体系 订单簿 订单类型 数据结构 盘口深度 限价单 市价单 红黑树 跳表 买卖价差 & 累积深度 核心应用:流动性分析 · 订单簿不平衡 · 冲击成本模型 图:订单簿知识体系结构图 关键点: 1. 限价单提供流动性,市价单消耗流动性 2. 订单簿维护的核心是「增删改查」的高效实现 3. 深度分析要关注「斜率」和「不平衡度」两个指标

做量化交易,订单簿就是你的「战场地图」。你得知道哪里兵力密集,哪里有空档,哪里是陷阱。我刚开始做的时候,光研究订单簿的微观结构就花了三个月。但说实话,这三个月是我量化生涯里最值的一笔投资。

给你个建议:找个有历史行情数据的交易所,拉一周的Level2数据下来。自己写个脚本回放订单簿的变化。盯着屏幕看几个小时,你就能感受到市场的「呼吸」了。这种体感,是任何书本都给不了你的。

专注资料整理