一、订单簿基础:什么是订单簿?限价单与市价单的区别

做量化交易的朋友,一定绕不开一个核心概念——订单簿

说白了,订单簿就是交易所用来记录所有挂单的电子账本。它实时展示着当前市场上所有买方和卖方的报价意愿。我个人习惯把它理解成「市场的实时温度计」——你通过它,能感知到资金在哪个价位集结,多空双方在哪个位置博弈。

1.1 订单簿长什么样?

先看一个典型的订单簿结构。假设我们交易的是BTC/USDT,订单簿会分成两半:

  • 买单(Bids):左侧,按价格从高到低排列
  • 卖单(Asks):右侧,按价格从低到高排列

每一行包含三个关键字段:价格、数量、总金额

买单价格买单数量卖单价格卖单数量
100.501.2100.600.8
100.403.0100.702.1
100.305.5100.804.3
100.207.0100.906.0

看到这个表格,你可能会问:为什么买单从高到低排,卖单从低到高排?

嗯,这里有个逻辑:买单想买便宜货,所以出价最高的排在前面,优先成交。卖单想卖高价,所以出价最低的排在前面。这就是订单簿的「价格优先」原则。

核心要点:订单簿的本质是「价格优先 + 时间优先」的排队系统。谁出价更优,谁先成交;价格相同,谁先挂单谁先成交。

1.2 限价单 vs 市价单

理解了订单簿的结构,我们来看两种最基础的订单类型。我在项目中遇到过不少新手把这两者搞混,结果吃了大亏。

限价单(Limit Order)

限价单,就是你指定一个价格,告诉交易所:「我只在这个价格或更好的价格成交」。比如你挂一个买入限价单,价格100.50,那只有当卖单价格≤100.50时才会成交。

  • 优点:成交价格可控,不会滑点
  • 缺点:可能无法成交,尤其是行情剧烈波动时
  • 典型场景:做市策略、套利策略、挂单等待
我的经验:做高频做市时,我习惯用限价单在买卖两边同时挂单,赚取买卖价差。但要注意,如果市场单边行情,限价单可能被「吃掉」而无法及时撤单。

市价单(Market Order)

市价单,就是你不指定价格,直接告诉交易所:「按当前最优价格立即成交」。比如你下了一个买入市价单,系统会从卖一价开始吃,卖一不够就吃卖二,直到你的数量全部成交。

  • 优点:成交速度快,几乎100%成交
  • 缺点:成交价格不确定,可能产生滑点
  • 典型场景:止损、追涨、大单拆单
避坑指南:我曾经在流动性差的币对上用市价单吃单,结果滑了3个点,直接亏掉当天的利润。记住:流动性越差,市价单的滑点风险越大

1.3 限价单与市价单的核心区别

我把两者的区别整理成一张表,方便你对照:

对比维度限价单市价单
价格控制完全可控不可控
成交确定性低(可能不成交)高(几乎必成交)
成交速度慢(等待匹配)快(立即执行)
滑点风险有(流动性差时严重)
对订单簿影响增加流动性消耗流动性
典型策略做市、套利趋势跟踪、止损

1.4 订单簿的深度与价差

有了订单簿,我们就能计算两个关键指标:

  • 买卖价差(Spread):卖一价 - 买一价。价差越小,流动性越好。
  • 市场深度(Depth):某个价位附近的总挂单量。深度越厚,大单对价格的冲击越小。

举个例子,如果卖一价100.60,买一价100.50,那价差就是0.10。如果卖一到卖五的总量有100个BTC,那这个价位的深度就很厚。

实战意义:做策略时,我通常会先看价差和深度。价差太大说明流动性差,不适合高频交易;深度太薄说明容易被大单砸穿,不适合大资金操作。

1.5 订单簿的核心逻辑图

下面我用一张SVG图来展示订单簿的核心运作逻辑,包括限价单和市价单的交互过程:

订单簿核心逻辑图 买方(Bids) 价格从高到低排列 限价单:指定价格等待成交 市价单:立即吃掉卖一价 买一价:100.50(最高买单) 卖方(Asks) 价格从低到高排列 限价单:指定价格等待成交 市价单:立即吃掉买一价 卖一价:100.60(最低卖单) 价差 0.10 流动性指标 限价单挂入 限价单挂入 市价单吃卖单 市价单吃买单 成交匹配引擎 价格优先 → 时间优先 限价单与市价单在此匹配成交 成交结果 更新订单簿 & 生成成交记录

1.6 实战中的订单簿应用

讲完了理论,说说我在实战中怎么用订单簿的。

第一,判断市场情绪。如果买单深度远大于卖单深度,说明买方意愿强,价格可能上涨。反之亦然。我经常在开盘前扫一眼订单簿的深度分布,心里就有个底。

第二,识别支撑阻力位。订单簿上挂单密集的价位,往往是重要的支撑或阻力。比如卖二到卖五有大量挂单,那价格很难突破这个区域。我曾经靠这个判断,在关键价位提前挂单,吃到了不少波段利润。

第三,检测大单动向。如果订单簿突然出现一笔大额挂单,比如卖一价突然多了100个BTC,那可能是大户在压价。这时候我会谨慎操作,避免被「钓鱼」。

小技巧:我习惯用「订单簿斜率」来判断短期方向。如果买单斜率陡峭(价格越低数量越大),说明下方承接强;如果卖单斜率陡峭,说明上方抛压重。这个指标比单纯看价差更灵敏。

1.7 代码示例:解析订单簿

最后,给一个简单的Python代码,演示如何解析订单簿数据。这是我在做策略回测时常用的工具函数:

class OrderBook:
    def __init__(self, bids: list, asks: list):
        # bids: [(price, qty), ...] 从高到低
        # asks: [(price, qty), ...] 从低到高
        self.bids = bids
        self.asks = asks
    
    def spread(self) -> float:
        """计算买卖价差"""
        if not self.bids or not self.asks:
            return float('inf')
        return self.asks[0][0] - self.bids[0][0]
    
    def depth(self, levels: int = 5) -> dict:
        """计算指定档位的市场深度"""
        bid_depth = sum(q for _, q in self.bids[:levels])
        ask_depth = sum(q for _, q in self.asks[:levels])
        return {'bid_depth': bid_depth, 'ask_depth': ask_depth}
    
    def imbalance(self) -> float:
        """计算订单簿不平衡度(正数表示买方强势)"""
        bid_vol = sum(q for _, q in self.bids[:10])
        ask_vol = sum(q for _, q in self.asks[:10])
        total = bid_vol + ask_vol
        if total == 0:
            return 0.0
        return (bid_vol - ask_vol) / total

# 使用示例
book = OrderBook(
    bids=[(100.50, 1.2), (100.40, 3.0), (100.30, 5.5)],
    asks=[(100.60, 0.8), (100.70, 2.1), (100.80, 4.3)]
)
print(f"价差: {book.spread():.2f}")
print(f"深度: {book.depth()}")
print(f"不平衡度: {book.imbalance():.3f}")

这段代码虽然简单,但已经能覆盖大部分订单簿分析需求。你可以在策略中实时调用这些函数,辅助决策。


专注资料整理