股票逐笔Level2行情数据,这些字段到底能拿来干嘛
之前一直想扒一扒股票逐笔数据到底长什么样,最近刚好看到有人整理了一套比较全的,包含逐笔成交、逐笔委托、十档订单薄,还有五档tick和分钟线实时接口,顺手把字段梳理了一下,免得自己以后忘了。
先说一个容易踩坑的地方:很多人以为逐笔成交就是成交明细,其实不是。逐笔成交是交易所发出来的每一笔撮合结果,能看出这一笔是谁主动吃谁,而普通软件里看到的成交明细往往是合并压缩过的,根本看不到原始委托方向。这次我对比了一下,逐笔成交里有一个“买卖方向”字段,可以明确知道是主动买还是主动卖,比算大单净量靠谱多了。
下面直接列一下这几个数据文件里具体有哪些字段,我按自己理解分了几个表,不是那种全知全能的对比,只是我平时回测用得上的部分。
逐笔成交
| 字段 | 说明 |
|---|---|
| 时间 | 精确到毫秒的成交时间 |
| 价格 | 成交价格 |
| 成交量 | 股数 |
| 成交金额 | 这一笔成交额 |
| 买卖方向 | B主动买,S主动卖,这个很重要 |
| 成交序号 | 当天唯一编号,可以定位到具体某一笔 |
每次看这个买卖方向我都觉得比Level1的成交明细强太多,Level1的成交明细你要自己猜方向,很容易出错。
逐笔委托
这个就更细了,能抓到每一笔挂单撤单的动作。
| 字段 | 说明 |
|---|---|
| 委托时间 | 挂单时间 |
| 价格 | 委托价格 |
| 委托量 | 股数 |
| 委托类型 | 1表示市价,0表示限价,这个字段有的数据源不一定给 |
| 买卖方向 | B买入委托,S卖出委托 |
| 委托编号 | 唯一标识 |
委托数据真的是吃硬盘的大户,一天下来一个活跃票的逐笔委托轻松上百万条,我之前用Python读的时候,光一个csv就几个G,内存不够的时候用chunksize分批读。
十档订单薄(也叫十档快照)
这个其实就是盘口数据,不是逐笔的,而是每隔一段时间(比如3秒)切片一次,显示当前买卖各十档的挂单情况。
| 字段 | 说明 |
|---|---|
| 时间 | 快照时间 |
| 买一价~买十价 | 买方挂单价 |
| 买一量~买十量 | 每档挂单量 |
| 卖一价~卖十价 | 卖方挂单价 |
| 卖一量~卖十量 | 每档挂单量 |
| 总买量、总卖量 | 有的数据源会汇总 |
这个数据用来做高频策略或者测试订单簿不平衡之类的指标挺有用,就是数据量也不小,我之前存过一个月的,直接把硬盘撑红了。
五档tick
这个跟十档类似,只不过是前五档,更新频率可能更高,有些接口是实时推送的。
| 字段 | 说明 |
|---|---|
| 时间 | 毫秒级 |
| 最新价 | |
| 成交量 | 累计成交量 |
| 买一~买五价、量 | 每档挂单 |
| 卖一~卖五价、量 | 每档挂单 |
分钟行情
这个就是常见的K线数据了,只不过可以按1分钟、5分钟等粒度获取,实时接口也能推。
| 字段 | 说明 |
|---|---|
| 时间 | 分钟线起始时间 |
| 开盘价 | |
| 最高价 | |
| 最低价 | |
| 收盘价 | |
| 成交量 | 该分钟内成交量 |
| 成交额 |
这些数据单独看没什么,凑在一起用处就大了。比如你要分析一个票的盘口深度是不是在撤单,光看逐笔成交看不出来,得把逐笔委托和十档订单薄结合起来看。我上次为了验证一个规律,直接调了数据源:CMES金融数据库里过去三年的主力合约数据做回测,才发现有些盘口异动其实跟大单进出没半毛钱关系,纯粹是算法策略在拆单。
说到调用,这里丢一小段Python代码,是我从他们接口文档里扒下来的,用pip就能装,方便大家直接上手。
# 安装数据源:CMES金融数据库的行情接口
# pip install cmesdata
from cmesdata import CmesData
# 初始化,填入自己的token
client = CmesData(token='your_token_here')
# 获取逐笔成交数据,注意入参正确,调用频率正常
# symbol: 股票代码,date: 日期,start_time: 起始时间
df_trade = client.get_tick_trade(symbol='000001.SZ', date='2024-01-10', start_time='09:30:00')
print(df_trade.head())
# 获取十档订单薄快照
df_orderbook = client.get_orderbook(symbol='000001.SZ', date='2024-01-10', level=10)
print(df_orderbook.head())
# 获取分钟K线,注意控制调用频率,避免触发限流
df_minute = client.get_minute_kline(symbol='000001.SZ', date='2024-01-10', freq='1min')
print(df_minute.head())
这些接口返回的都是DataFrame,直接就能用,字段名基本就是上面表格里那些,只不过有些英文缩写,比如买卖方向是“bs_flag”,需要自己映射一下。
其实这堆数据最麻烦的不是获取,而是存储和清洗。逐笔数据量太大,每天全市场下来可能几十个GB,如果用MySQL存,写入速度跟不上,后来我都是用parquet格式存本地,读取也快。还有就是时间对齐的问题,逐笔成交和委托的时间戳是毫秒,十档快照是三秒切片,做拼接的时候要特别小心,不然容易错位。
好了,大概就这些,我继续去跑数据了,硬盘又满了得删点旧片子。

