4、Level 1与Level 2数据:Top of Book与Order Book Depth、数据字段详解
做高频交易,数据就是你的眼睛。但很多人一开始就被Level 1、Level 2这些术语搞晕了。
说白了,Level 1数据就是「行情快照」,告诉你当前最优的买价和卖价。Level 2数据则是「订单簿全景」,能看到排队的所有挂单。
我个人习惯把Level 1叫做「冰山一角」,Level 2才是「冰山全貌」。今天我们就来拆解这两层数据到底长什么样。
4.1 Level 1数据:Top of Book
Level 1数据,也叫Top of Book(订单簿顶部)。它只告诉你一件事:当前市场上,谁出价最高想买,谁出价最低想卖。
- bid_price:最优买价(最高买价)
- bid_size:最优买价上的挂单量
- ask_price:最优卖价(最低卖价)
- ask_size:最优卖价上的挂单量
- last_price:最后一笔成交价
- volume:累计成交量
- timestamp:时间戳(纳秒级)
举个例子,我在项目中遇到过这样的情况:只看Level 1数据,觉得买卖价差很窄,流动性很好。结果一进去就被吃了。为什么?因为Level 1只显示了「表面」的流动性,真正的深度藏在Level 2里。
// 一个典型的Level 1数据快照
{
"symbol": "BTC-USDT",
"bid_price": 50000.00,
"bid_size": 1.5,
"ask_price": 50001.50,
"ask_size": 2.0,
"last_price": 50000.75,
"volume": 123456,
"timestamp": 1699000000123456789
}
4.2 Level 2数据:Order Book Depth
Level 2数据,也叫Order Book Depth(订单簿深度)。它展示了从最优价开始,往下的所有档位挂单情况。
你想想看,一个完整的订单簿长什么样?就像排队买奶茶,Level 1只告诉你排第一的人,Level 2告诉你前50个人分别要买几杯。
- price:该档位的价格
- size:该档位的挂单量
- order_count:该档位的订单数量(有些交易所提供)
- side:买盘(bid)还是卖盘(ask)
Level 2数据通常包含5档、10档、20档甚至全量深度。我个人习惯用20档数据做分析,因为5档太浅,全量又太贵。20档是个不错的平衡点。
// Level 2数据示例(简化版)
{
"symbol": "BTC-USDT",
"bids": [
[50000.00, 1.5], // [价格, 数量]
[49999.50, 3.2],
[49999.00, 5.0],
[49998.50, 2.1],
[49998.00, 8.0]
],
"asks": [
[50001.50, 2.0],
[50002.00, 4.5],
[50002.50, 3.0],
[50003.00, 6.0],
[50003.50, 1.5]
],
"timestamp": 1699000000123456789
}
4.3 Level 1 vs Level 2:核心差异
| 对比维度 | Level 1 | Level 2 |
|---|---|---|
| 数据量 | 小(几个字段) | 大(每档都有数据) |
| 更新频率 | 较低(通常100ms级) | 高(通常10ms级甚至更快) |
| 信息深度 | 只看最优价 | 看多档挂单 |
| 费用 | 免费或低价 | 较贵(按流量计费) |
| 适用策略 | 趋势跟踪、简单套利 | 做市、高频套利、订单簿预测 |
嗯,这里要注意:不是所有策略都需要Level 2数据。如果你做的是分钟级别的趋势交易,Level 1完全够用。但如果你做的是毫秒级的做市策略,没有Level 2数据就像蒙着眼睛开车。
4.4 数据字段详解:从原始数据到可用信息
拿到原始数据后,我们通常需要做一些处理。我个人习惯把字段分为三类:
- 原始字段:交易所直接推送的,如价格、数量、时间戳
- 计算字段:通过原始字段算出来的,如价差、加权平均价
- 衍生字段:结合历史数据得到的,如订单簿斜率、流动性指标
- spread = ask_price - bid_price(买卖价差)
- mid_price = (bid_price + ask_price) / 2(中间价)
- weighted_mid = (bid_price*ask_size + ask_price*bid_size) / (bid_size + ask_size)(加权中间价)
- depth_imbalance = (total_bid_volume - total_ask_volume) / (total_bid_volume + total_ask_volume)(深度不平衡度)
// Python示例:计算订单簿深度不平衡度
def calc_depth_imbalance(bids, asks, levels=10):
bid_vol = sum([b[1] for b in bids[:levels]])
ask_vol = sum([a[1] for a in asks[:levels]])
if bid_vol + ask_vol == 0:
return 0
return (bid_vol - ask_vol) / (bid_vol + ask_vol)
# 使用示例
imbalance = calc_depth_imbalance(data['bids'], data['asks'], levels=5)
print(f"深度不平衡度: {imbalance:.3f}")
# 正值表示买盘更强,负值表示卖盘更强
4.5 知识体系结构图
下面这张图展示了Level 1和Level 2数据的核心关系,以及它们在高频交易中的应用路径:
4.6 实战建议:如何选择数据级别
最后,我根据经验给几个建议:
- 做回测研究:先用Level 1数据快速验证想法,跑通了再上Level 2
- 做实盘交易:如果是做市策略,必须用Level 2;如果是趋势策略,Level 1就够了
- 数据存储:Level 2数据量巨大,一天可能几个GB。我建议只存储计算后的指标,原始数据按需保留
- 注意延迟:Level 2数据的延迟直接影响策略效果。我曾经因为用了某云服务商的Level 2数据,延迟多了20ms,策略直接失效
好了,Level 1和Level 2数据就讲到这里。记住一个核心原则:数据越深,信息越多,但成本和复杂度也越高。根据你的策略需求,选择合适的数据级别,才是明智的做法。
公众号:蓝海数据掘金营,微信deep3321