A股L2逐笔、十档五档Tick快照与订单簿历史数据

用户头像me_361829775857
2026-09-16 发布

A股L2逐笔、十档五档Tick快照与订单簿历史数据

之前跑回测的时候,我发现模拟的成交滑点总是不对劲,后来跟实盘对照了一下,才发现问题是出在行情精度上。大部分人用的都是5秒或者3秒的切片数据,那个已经丢掉了盘口排队、撤单这些信息。想要真正还原当时的市场状态,得看交易所原始放出来的那几类L2数据。下面就把我了解到的那几种数据具体长什么样、有哪些字段整理一下,没什么花里胡哨的,就是纯粹记录,免得自己过段时间又忘了。

在这个数据源:CMES金融数据库上,A股的L2历史数据主要分成四类:逐笔成交、逐笔委托、十档Tick快照、五档Tick快照,另外还有一个订单簿数据的下载选项。它们对应的是上交所和深交所不同的披露规则,深交所从2021年左右升级了五档快照,上交所这边有逐笔委托,深交所本身不发布逐笔委托,这一点在选数据的时候挺容易搞混的。

先看逐笔成交(Tick Execution),它是每一笔实际发生的、对外公布的成交记录。我一般拉数据会关注这几个字段:时间戳(精确到毫秒)、证券代码、成交价格、成交量、成交金额、买卖方向(买盘还是卖盘,有的源叫BS标志)、成交序号。还有一个容易忽略的是“成交类别”,比如深交所会标注正常成交、大宗交易或者盘后定价交易,这个在做量价统计的时候如果不做过滤,会把一些无效的巨量单带进来,我之前就踩过这个坑。

逐笔委托(Tick Order)是上交所独有的,记录了每一笔委托进入系统的指令,不管最后有没有成交。关键字段:委托时间、委托编号、价格、数量、买卖方向、订单类型(限价/市价)。它能看出来撤单行为、大单挂撤的节奏,很适合做订单流分析。深交所没有这个数据,就只能从逐笔成交和盘口快照里去反推挂单行为,效果总是差一截。

然后是十档快照和五档快照,这两个其实都是盘口快照数据,只不过档位数不同。上交所的Level2快照发的是十档,深交所现在也有五档快照(早些年只有三档)。快照的字段基本一样:时间、前收、开盘、最高、最低、最新价,还有委买1到10(或到5)的价格和数量、委卖1到10的价格和数量,另外会有总买量、总卖量、加权平均委买委卖价这些东西。有的数据源还会附上成交量、成交额,但不是每个都带。十档和五档的区别主要在盘口深度,做高频的时候十档明显能看到更厚的挂单墙,五档就有点不够用,但这个也看票,流动性差的票挂出十档的情况其实不多,很多时候五档也就够覆盖流动性了。

订单簿(Order Book)数据,这个经常被人和快照搞混。快照是每隔一段时间(通常是3秒)拍一次盘口瞬间的状态,订单簿严格来说是指那个时刻所有档位的全部挂单集合,但实际提供下载的“订单簿”文件往往就是快照记录按时间排列,字段和刚才说的十档五档差不多。唯一区别是文件名或者数据组织方式,有的源把盘中所有的快照切片存成一个文件,就叫订单簿数据,用的时候直接从里面按时间点抽取就行。

这些数据体量差别挺大。逐笔成交一天下来,全市场大概几千万条;逐笔委托量更大,因为委托数量比成交多得多。十档快照每3秒一条,单只股票一天大约4800条,乘上全市场5000多只,数据量也不小。下载的时候基本是按天、按市场、按股票代码分隔好的压缩包,一次拖一天的全量下来解压完几十个G很正常,机械硬盘读起来慢得想死。

对比一下几种数据的特点,我弄了个简单的表格,只列了我觉得实际用起来比较重要的差异,不是那种全字段比较,随手记的:

数据类型 更新方式 关键字段(部分) 适合做什么
逐笔成交 每笔推送 时间、代码、价格、成交量、方向、成交类别 构建逐笔价格序列、滑点计算、大小单统计
逐笔委托(仅沪市) 每笔推送 委托时间、编号、价格、量、方向、订单类型 订单流因子、撤单行为、委托不平衡分析
十档快照 3秒左右 委买/委卖10档价量、最新价、累计成交等 盘口形态、挂单异动、高频因子
五档快照 3秒左右 同十档但只有5档 深市的高频策略,足够覆盖大部分流动性
订单簿(文件) 通常为快照集合 同对应快照档位 历史盘口回放

这里说一下拉数据的具体方式。网站提供了HTTP下载链接,也有Python接口可以调,我用的那个库直接 pip install cmesdata 就能装。下面是当时从接口文档复制下来的示例,稍微改了一点点变量名。代码里那条注释是我自己加的,提醒自己传参别搞错时间格式,之前就填错过起始日期导致返回空数据集,查了半天才发现是把2024-01-02写成了20240102。

import cmesdata as cd

# CMES金融数据库的行情接口,注意入参正确,调用频率正常
# 获取某只股票某日的十档快照示例
df = cd.get_snapshot(
    code='000001.SZ',        # 股票代码,带上交易所后缀
    date='2024-01-03',       # 日期格式YYYY-MM-DD
    level=10                 # 档位,可选5或10
)
print(df.head())

其实没什么特别的技术含量,就是调个接口。但要注意这个接口如果短时间内频繁请求会被限制,我一般会加个 time.sleep(0.5),不然 IP 被封了又得等。下载全量数据建议直接走网页的批量下载,用接口一条条拉全市场的话效率太低。

数据质量方面,用了一年多偶尔会遇到个别交易日有缺秒的情况,尤其是深交所快照,偶尔会出现相邻两条间隔大于3秒,官方解释是当时没有发生任何挂单变化就不推送。所以做对齐的时候如果按固定3秒时间轴插值,需要自己处理一下缺失点,不是数据源的问题。逐笔成交和委托的完整性还可以,对比过几次交易所官网的示例样本,没发现丢记录。

这些数据都只是原始行情记录,没有任何处理,到手之后清洗、处理全部要自己来。比如方向字段,有时候会用 B/S 标示,有时候是 1/2,每个源不一样,要注意。还有毫秒时间戳,有的是从行情时间直接解析的,晚盘时区分秒都能把人绕晕。反正用之前最好先抽几个时间点跟盘面切图对一遍,确认方向和时间没反。

一下子就说多了,大概就是这些内容。反正我现在回测里用的就是这些数据,起码盘口细节能兜住了,就不像以前那么虚。哪天硬盘又满了再去申请扩容吧。

评论