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 知识体系结构图
下面这张图,是我自己整理的数据结构关系。你可以把它当作一个「地图」,方便理解各个数据组件之间的联系。
3.5 实战建议:如何选择数据源?
我个人习惯是:
- 策略开发阶段:先用K线数据快速验证策略逻辑是否合理。这一步跑得很快,能帮你筛掉明显不靠谱的想法。
- 策略精调阶段:切换到Tick数据,重建订单簿,模拟真实的撮合过程。这一步慢,但准。
- 实盘前验证:用Level2数据做一次完整的回测,看看策略在深度变化时的表现。
说白了,数据的选择决定了你回测的「分辨率」。分辨率太低,你可能会错过关键细节;分辨率太高,计算成本又吃不消。找到平衡点,才是做市策略回测的关键。
小技巧:如果你没有Tick数据,可以用K线数据结合一些随机模型来「模拟」Tick级别的波动。虽然不完美,但总比没有强。我早期做回测时就这么干过,效果还行。
公众号:蓝海资料掘金营,微信deep3321