一、订单簿基础:什么是订单簿?限价单与市价单的区别
做量化交易的朋友,一定绕不开一个核心概念——订单簿。
说白了,订单簿就是交易所用来记录所有挂单的电子账本。它实时展示着当前市场上所有买方和卖方的报价意愿。我个人习惯把它理解成「市场的实时温度计」——你通过它,能感知到资金在哪个价位集结,多空双方在哪个位置博弈。
1.1 订单簿长什么样?
先看一个典型的订单簿结构。假设我们交易的是BTC/USDT,订单簿会分成两半:
- 买单(Bids):左侧,按价格从高到低排列
- 卖单(Asks):右侧,按价格从低到高排列
每一行包含三个关键字段:价格、数量、总金额。
| 买单价格 | 买单数量 | 卖单价格 | 卖单数量 |
|---|---|---|---|
| 100.50 | 1.2 | 100.60 | 0.8 |
| 100.40 | 3.0 | 100.70 | 2.1 |
| 100.30 | 5.5 | 100.80 | 4.3 |
| 100.20 | 7.0 | 100.90 | 6.0 |
看到这个表格,你可能会问:为什么买单从高到低排,卖单从低到高排?
嗯,这里有个逻辑:买单想买便宜货,所以出价最高的排在前面,优先成交。卖单想卖高价,所以出价最低的排在前面。这就是订单簿的「价格优先」原则。
1.2 限价单 vs 市价单
理解了订单簿的结构,我们来看两种最基础的订单类型。我在项目中遇到过不少新手把这两者搞混,结果吃了大亏。
限价单(Limit Order)
限价单,就是你指定一个价格,告诉交易所:「我只在这个价格或更好的价格成交」。比如你挂一个买入限价单,价格100.50,那只有当卖单价格≤100.50时才会成交。
- 优点:成交价格可控,不会滑点
- 缺点:可能无法成交,尤其是行情剧烈波动时
- 典型场景:做市策略、套利策略、挂单等待
市价单(Market Order)
市价单,就是你不指定价格,直接告诉交易所:「按当前最优价格立即成交」。比如你下了一个买入市价单,系统会从卖一价开始吃,卖一不够就吃卖二,直到你的数量全部成交。
- 优点:成交速度快,几乎100%成交
- 缺点:成交价格不确定,可能产生滑点
- 典型场景:止损、追涨、大单拆单
1.3 限价单与市价单的核心区别
我把两者的区别整理成一张表,方便你对照:
| 对比维度 | 限价单 | 市价单 |
|---|---|---|
| 价格控制 | 完全可控 | 不可控 |
| 成交确定性 | 低(可能不成交) | 高(几乎必成交) |
| 成交速度 | 慢(等待匹配) | 快(立即执行) |
| 滑点风险 | 无 | 有(流动性差时严重) |
| 对订单簿影响 | 增加流动性 | 消耗流动性 |
| 典型策略 | 做市、套利 | 趋势跟踪、止损 |
1.4 订单簿的深度与价差
有了订单簿,我们就能计算两个关键指标:
- 买卖价差(Spread):卖一价 - 买一价。价差越小,流动性越好。
- 市场深度(Depth):某个价位附近的总挂单量。深度越厚,大单对价格的冲击越小。
举个例子,如果卖一价100.60,买一价100.50,那价差就是0.10。如果卖一到卖五的总量有100个BTC,那这个价位的深度就很厚。
1.5 订单簿的核心逻辑图
下面我用一张SVG图来展示订单簿的核心运作逻辑,包括限价单和市价单的交互过程:
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}")
这段代码虽然简单,但已经能覆盖大部分订单簿分析需求。你可以在策略中实时调用这些函数,辅助决策。