前言:
常说高频数据的获取是量化金融研究的第一道护城河,这并不是说量化研究的高深莫测与复杂,而是数据获取的成本———沪深两市逐笔数据获取难度极大。
| 数据类型 | 记录的内容 | 数据性质 |
|---|---|---|
| 快照数据(Snapshot)|3秒一条的盘口五档快照数据|状态切片| | ||
| 逐笔成交(Trade) | 每笔实际成交的时间、价格、数量及买卖方向等 | 成交结果 |
| 逐笔委托(Order) | 委托申报、撤单及其订单编号、方向、价格和数量等 | 市场事件 |
| 委托队列(Queue) | 某一时刻各价格档位上的挂单数量及排队结构 | 市场状态 |
其中,我们常说的Level 1数据指3秒的快照数据,Level 2数据指逐笔数据,又可以分为逐笔成交和逐笔委托以及委托队列。对于沪深两交易所而言,这四种数据的推送格式不尽相同,本文将仅探讨沪深两市逐笔委托级别数据的差异以及将两市数据同构便于后续分析的实用方法。
沪深数据口径差异
上交所提供的逐笔委托中委托量的数据,是经过一次撮合后的剩余委托数量。在上交所提供的字段中,A代表委托单,T代表成交单,D代表撤单。根据上述规则,沪市数据主要有以下四种情况:
- 一次撮合成交:某订单撮合后全部成交,此时只有该单逐笔成交记录,无委托记录。
- 部分撮合成交:某订单在撮合后成交$a$手,总共$b$手,则逐笔成交记录$a$手,委托记录$b-a$手
- 延迟撮合成交:某订单在第一次撮合中无成交,之后撮合成交$a$手,总共$b$手,则先有逐笔委托$b$手,再有逐笔成交$a$手
- 部分成交撤单:某订单第一次撮合成交$a$手,总共$b$手,撤单$b-a$手,则先有逐笔成交$a$手,后有逐笔委托$b$手,类型为D。
处理方法
依据上述情况,我们可以先处理撤单记录,而后通过逐笔成交数据还原委托数据。
撤单记录的处理
- 遍历逐笔委托,判断当前记录是否为新增委托。
- 如果是新增委托,则直接保留。
- 如果不是新增委托,则将其视为撤单记录,并转换为逐笔成交格式:
- 买卖双方订单号中,一方填写
0; - 另一方填写被撤销的委托单号;
- 业务序列号与原撤单记录保持一致。
- 买卖双方订单号中,一方填写
- 将构造出的撤单记录加入逐笔成交数据。
通过逐笔成交还原委托
- 遍历逐笔成交,根据成交方向确定需要记录的委托单号:
- 主动买入:记录买方委托单号;
- 主动卖出:记录卖方委托单号。
- 判断该委托单号是否已经存在于逐笔委托数据中:
- 不存在:新增一条委托,表示该委托一次撮合后全部成交;
- 已经存在:更新原委托,表示该委托一次撮合后仅部分成交。
- 反向还原时,将逐笔成交数量加回对应委托数量,并根据成交记录更新业务序列号。
总结
沪市数据和深市数据的同构逻辑并不复杂,但鉴于数据量庞大,应采用高性能的计算引擎和语言进行,博主本人在自己的机器上使用Polars进行数据处理,运行速度近似C++。而在服务器端,不应使用Polars进行大量的序列化/反序列化操作,博主实践后发现重构语法都可由SQL实现,因此在访问数据库重构时应首先采用SQL。
参考文献
- 本文链接: https://otter-garden.cn/posts/2026/07/逐笔委托数据还原/
- 版权声明: 本博客所有文章除特别声明外,均默认采用 CC BY-NC 4.0 许可协议。