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
}
避坑指南:我曾经以为Level 1数据足够做高频策略,结果回测漂亮,实盘亏钱。后来发现,Level 1数据更新频率低,而且不显示挂单深度。你看到的「最优价」可能只有几手挂单,一吃就穿。

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 数据字段详解:从原始数据到可用信息

拿到原始数据后,我们通常需要做一些处理。我个人习惯把字段分为三类:

  1. 原始字段:交易所直接推送的,如价格、数量、时间戳
  2. 计算字段:通过原始字段算出来的,如价差、加权平均价
  3. 衍生字段:结合历史数据得到的,如订单簿斜率、流动性指标
常用计算字段示例:
  • 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}")
# 正值表示买盘更强,负值表示卖盘更强
重要提醒:不同交易所的Level 2数据格式差异很大。我曾经在对接某二线交易所时,发现它的「bids」数组是按价格降序排列的,而主流交易所是升序。这种细节不注意,策略跑起来全是错的。

4.5 知识体系结构图

下面这张图展示了Level 1和Level 2数据的核心关系,以及它们在高频交易中的应用路径:

Level 1 vs Level 2 数据体系 Level 1 数据 Top of Book(订单簿顶部) • bid_price / ask_price • bid_size / ask_size • last_price / volume • timestamp(纳秒级) 特点:数据量小、更新慢、免费 Level 2 数据 Order Book Depth(订单簿深度) • 多档 bids / asks 数组 • 每档:price + size + order_count • 通常5档/10档/20档/全量 • 增量更新 vs 全量快照 特点:数据量大、更新快、收费 计算字段 / 衍生指标 spread | mid_price | weighted_mid | depth_imbalance | order_book_slope 高频交易应用场景 做市策略 | 套利策略 | 订单簿预测 | 流动性分析 | 市场微观结构研究 Level 1 提供基础行情,Level 2 提供深度信息,两者结合才能构建完整的高频交易数据视图

4.6 实战建议:如何选择数据级别

最后,我根据经验给几个建议:

  • 做回测研究:先用Level 1数据快速验证想法,跑通了再上Level 2
  • 做实盘交易:如果是做市策略,必须用Level 2;如果是趋势策略,Level 1就够了
  • 数据存储:Level 2数据量巨大,一天可能几个GB。我建议只存储计算后的指标,原始数据按需保留
  • 注意延迟:Level 2数据的延迟直接影响策略效果。我曾经因为用了某云服务商的Level 2数据,延迟多了20ms,策略直接失效
一个小技巧:如果你刚开始接触Level 2数据,可以先订阅5档深度。等熟悉了数据结构和更新频率,再扩展到10档或20档。一口吃不成胖子,数据也是一样。

好了,Level 1和Level 2数据就讲到这里。记住一个核心原则:数据越深,信息越多,但成本和复杂度也越高。根据你的策略需求,选择合适的数据级别,才是明智的做法。


公众号:蓝海数据掘金营,微信deep3321