什么是限价订单簿(LOB)?#
限价订单簿(Limit Order Book, LOB)是交易所最核心的数据结构,记录了所有未成交的限价买卖订单。对于高频交易(HFT)而言,LOB是最直接的市场微观结构信息源。

一个典型的LOB包含:
- 买一侧(Bid Side):按价格降序排列的所有买入限价单
- 卖一侧(Ask Side):按价格升序排列的所有卖出限价单
- 最优买卖价(BBO):最高买价(Best Bid)和最低卖价(Best Ask)
- 买卖价差(Spread):Best Ask - Best Bid
LOB数据的关键特征#
1. 深度(Depth)分析#
LOB深度指的是在各个价格档位上的订单数量。深度分析可以帮助判断:
- 流动性质量:深度越大,大单冲击成本越低
- 支撑/阻力位:大量订单聚集的价格区域
- 信息不对称:异常深度变化可能预示内幕交易
# 计算LOB深度的Python示例
import pandas as pd
def calculate_lob_depth(lob_df, levels=5):
"""计算LOB前N档深度"""
bid_depth = lob_df['bid_size'].iloc[:levels].sum()
ask_depth = lob_df['ask_size'].iloc[:levels].sum()
return bid_depth, ask_depth
# 计算订单簿不平衡指标
def lob_imbalance(lob_df, levels=5):
"""LOB不平衡度:衡量买卖压力"""
bid_vol = lob_df['bid_size'].iloc[:levels].sum()
ask_vol = lob_df['ask_size'].iloc[:levels].sum()
return (bid_vol - ask_vol) / (bid_vol + ask_vol)python2. 订单流与LOB动态#
LOB是动态变化的,主要事件包括:
- 新订单(New Order):追加到LOB相应价格档位
- 取消订单(Cancel):从LOB中移除
- 成交(Trade):从LOB中删除成交部分
- 改单(Modify):改变价格或数量

基于LOB的量化策略#
策略1:订单簿不平衡交易(Order Book Imbalance)#
当LOB不平衡度超过阈值时,预测短期价格变动方向:
# LOB不平衡策略示例
class OBImbalanceStrategy:
def __init__(self, threshold=0.3, levels=5):
self.threshold = threshold
self.levels = levels
def generate_signal(self, lob_snapshot):
imbalance = lob_imbalance(lob_snapshot, self.levels)
if imbalance > self.threshold:
return "BUY" # 买压强势,做多
elif imbalance < -self.threshold:
return "SELL" # 卖压强势,做空
else:
return "HOLD"python策略2:流动性提供策略(Market Making)#
在LOB两侧挂单,赚取买卖价差:
# 简化版做市商策略
class SimpleMarketMaker:
def __init__(self, spread_target=2):
self.spread_target = spread_target # 目标价差( ticks)
def quote(self, lob):
best_bid = lob['bid_price'].iloc[0]
best_ask = lob['ask_price'].iloc[0]
mid_price = (best_bid + best_ask) / 2
# 在中间价附近挂双边单
my_bid = mid_price - self.spread_target / 2
my_ask = mid_price + self.spread_target / 2
return {'bid': my_bid, 'ask': my_ask}python策略3:冰山订单检测(Iceberg Detection)#
冰山订单是大单拆分成多个小单隐藏真实意图。通过LOB变动模式可以检测:
def detect_iceberg(lob_history, threshold=0.8):
"""检测可能的冰山订单"""
signals = []
for i in range(1, len(lob_history)):
prev = lob_history[i-1]
curr = lob_history[i]
# 如果价格档位保持不变但数量频繁补充
for level in range(5):
if (prev['bid_price'].iloc[level] == curr['bid_price'].iloc[level] and
curr['bid_size'].iloc[level] > prev['bid_size'].iloc[level] * threshold):
signals.append(('ICEBERG_BUY', curr['bid_price'].iloc[level]))
return signalspythonLOB数据的获取与处理#
数据来源#
- 交易所直连:最快(微秒级),但成本高
- 数据供应商:Refinitiv、CME MDP等
- 开源数据:LOBSTER、NASDAQ ITCH等
数据格式示例#
# LOBSTER格式示例
# 时间戳, 价格1, 数量1, 价格2, 数量2, ...
1612345678.123456, 100.5, 500, 100.4, 300, 100.6, 200, ...
# 处理LOBSTER数据
import numpy as np
def load_lobster(file_path, levels=10):
"""加载LOBSTER格式的LOB数据"""
data = np.loadtxt(file_path, delimiter=',')
timestamps = data[:, 0]
lob = []
for row in data:
snapshot = {'timestamp': row[0]}
for i in range(levels):
snapshot[f'bid_price_{i+1}'] = row[1 + 4*i]
snapshot[f'bid_size_{i+1}'] = row[2 + 4*i]
snapshot[f'ask_price_{i+1}'] = row[3 + 4*i]
snapshot[f'ask_size_{i+1}'] = row[4 + 4*i]
lob.append(snapshot)
return pd.DataFrame(lob)python实战注意事项#
1. 延迟至关重要#
HFT策略对延迟极度敏感:
- 网络延迟:直连交易所(Colocation)
- 处理延迟:C++/Rust实现,避免Python循环
- 时间戳精度:需要纳秒级精度
2. 数据质量控制#
LOB数据常见问题:
- 丢包:导致LOB状态不一致
- 乱序:需要序列号重新排序
- 重复:去重逻辑必不可少
3. 回测挑战#
LOB策略回测难点:
- 幸存者偏差:只看到成交订单,看不到取消的
- 前视偏差:用未来信息填充LOB
- 市场冲击:大单会改变LOB本身
总结#
限价订单簿(LOB)是高频交易的基石数据结构。通过分析LOB深度、不平衡度和动态变化,可以构建多种量化策略。但HFT策略对技术基础设施要求极高,需要:
- 超低延迟的系统架构
- 高质量的LOB数据
- 严谨的回测框架
对于普通量化交易者,可以从LOB数据中提取中低频特征(如买卖压力、深度变化率),应用到自己的策略中。
参考资料#
- Market Microstructure Theory by Thierry Foucault
- LOBSTER Data: https://lobsterdata.com ↗
- High-Frequency Trading by Irene Aldridge
- Nasdaq TotalView-ITCH协议文档