3、订单簿数据结构:Level1/Level2数据解析、买卖盘口数据结构、Tick数据与K线数据

做市策略回测,说白了就是模拟真实市场环境。而模拟的根基,就是数据。你想想看,如果连订单簿长什么样都搞不清楚,那回测出来的结果基本就是空中楼阁。今天我们就来聊聊订单簿数据结构,这是做市商策略的「地基」。

3.1 Level1与Level2数据:你到底需要多深的「水」?

很多新手一上来就问:「我要不要买Level2数据?」我的回答是:看你的策略类型。做市商策略,我个人建议至少用Level2。

Level1数据,就是大家常见的行情快照。它只告诉你当前最优的买一、卖一价格和数量。说白了,就是「水面上的冰山一角」。

Level2数据,也叫深度行情。它展示了买卖盘口多个价位的挂单情况。比如买一到买十,卖一到卖十,甚至更多。我在项目中遇到过,有些交易所的Level2能给你50档深度。

核心区别:

  • Level1:只告诉你「现在有人想用10块钱买,有人想用10.01卖」
  • Level2:告诉你「从9.9到10.1之间,每个价位有多少人等着买卖」

为什么会这样?因为做市商需要感知市场的「压力」。比如你在卖一挂了100手,突然卖二到卖五都堆了上千手,你就要小心了——这可能是大资金在压盘。

3.2 买卖盘口数据结构:订单簿的「骨架」

订单簿(Order Book)的数据结构其实不复杂。它本质上就是两个有序列表:一个买盘(Bids),一个卖盘(Asks)。

买盘按价格从高到低排列,卖盘按价格从低到高排列。每个条目包含价格和数量。嗯,这里要注意:不同交易所的字段名可能不一样,但核心逻辑是一样的。

// 一个典型的订单簿数据结构(伪代码)
{
  "bids": [
    [100.00, 500],  // 价格100,数量500
    [99.99, 1200],
    [99.98, 800]
  ],
  "asks": [
    [100.01, 300],
    [100.02, 1500],
    [100.03, 600]
  ]
}

我建议你在回测时,把订单簿维护成一个「快照+增量」的模式。什么意思呢?就是每次收到新的行情数据,不是全量替换,而是增量更新。这样可以大幅减少内存开销。

个人经验:我曾经在回测一个高频做市策略时,直接用全量快照更新订单簿,结果内存爆了。后来改成增量更新,内存占用直接降了80%。

3.3 Tick数据与K线数据:时间维度的「显微镜」与「望远镜」

Tick数据,就是每一笔成交的原始记录。它包含成交时间、价格、数量、买卖方向等。做市商策略回测,Tick数据是首选。为什么?因为它保留了市场的微观结构。

K线数据,是把Tick数据按时间窗口聚合后的结果。比如1分钟K线,就是把1分钟内的所有Tick数据,压缩成开、高、低、收、量五个数字。

数据类型 精度 数据量 适用场景
Tick数据 每笔成交 极大(一天可能几百万条) 高频做市、订单簿重建
K线数据 分钟/小时/日 较小 趋势分析、中低频策略

你想想看,如果你用K线数据回测做市策略,会有什么问题?K线把价格波动「平均化」了,你根本看不到订单簿的瞬间变化。比如一个策略在Tick级别能赚0.01的价差,但在K线级别可能完全看不出来。

避坑指南:我曾经用1分钟K线回测一个做市策略,回测结果年化收益30%,实盘一跑直接亏成狗。后来发现,K线数据把很多微小的价差机会给「平滑」掉了。所以做市策略回测,尽量用Tick数据。

3.4 知识体系结构图

下面这张图,是我自己整理的数据结构关系。你可以把它当作一个「地图」,方便理解各个数据组件之间的联系。

订单簿数据结构知识体系 市场数据源 Level1 数据(快照) Level2 数据(深度) 订单簿(Order Book) 买盘(Bids) 卖盘(Asks) Tick数据 → K线数据 数据源 Level1 Level2 订单簿 买卖盘口

3.5 实战建议:如何选择数据源?

我个人习惯是:

  • 策略开发阶段:先用K线数据快速验证策略逻辑是否合理。这一步跑得很快,能帮你筛掉明显不靠谱的想法。
  • 策略精调阶段:切换到Tick数据,重建订单簿,模拟真实的撮合过程。这一步慢,但准。
  • 实盘前验证:用Level2数据做一次完整的回测,看看策略在深度变化时的表现。

说白了,数据的选择决定了你回测的「分辨率」。分辨率太低,你可能会错过关键细节;分辨率太高,计算成本又吃不消。找到平衡点,才是做市策略回测的关键。

小技巧:如果你没有Tick数据,可以用K线数据结合一些随机模型来「模拟」Tick级别的波动。虽然不完美,但总比没有强。我早期做回测时就这么干过,效果还行。


公众号:蓝海资料掘金营,微信deep3321