下载的期货行情数据到底能细到什么程度?聊聊Level 2

用户头像me_361829775857
2026-07-11 发布

聊聊CME、LME、CBOT交易所的期货历史Tick数据
做量化或者手动复盘盯盘的朋友,应该都听说过Level 2数据,也就是Tick数据。这东西和K线图完全不是一回事,信息量要大得多,当然,数据量也“感人”,处理起来挺头疼的。今天主要想梳理一下CME、LME、CBOT这几个主流交易所期货品种的Tick数据到底能拿到什么,给想用的人一个参考。

市面上能提供这种毫秒级逐笔数据的地方不多,而且很多数据要么清洗不干净,要么字段不全。最近为了回测一个高频策略,我折腾了好几个数据源,最后还是用了一个比较全的。这里就简单说说这些数据里都包含了哪些内容。

数据都包含哪些品种?
主要就是美国那几个大的期货交易所,芝加哥商业交易所集团(CME Group)旗下的几个所,还有伦敦金属交易所(LME)。

CME(芝加哥商业交易所):外汇、股指、利率这些。比如欧元、标普500指数、10年期国债期货。
CBOT(芝加哥期货交易所):农产品和部分利率。大豆、玉米、小麦这些老牌品种都在这里。
NYMEX/COMEX(纽约商业/商品交易所):能源和金属。原油、天然气、黄金、白银。
LME(伦敦金属交易所):基础金属。铜、铝、锌、铅、镍、锡。
这些数据通常提供两种合约形式:主连合约和单月份合约。主连就是连续合约,方便做长期回测,不用自己拼接。单月合约就是具体的到期月份,比如2024年6月的黄金期货。

Tick数据里到底有什么字段?
这才是重点。Tick数据,也叫逐笔成交数据,就是市场上每一笔撮合成交的记录。它和聚合后的分钟K线最大的区别在于,它能看到每一次价格变动的细节。

下面这个表格列出了通常在一个Tick数据记录里能找到的核心字段,你可以看看是不是你需要的:

字段名(示例) 说明 注意点
时间戳 (Timestamp) 成交发生的精确时间,通常到毫秒。 这是高频分析的基石,时间对齐和排序都靠它。不同数据源时区可能不同,要统一。
最新价 (Last Price) 这笔交易成交的价格。 就是构成价格曲线的那个点。
成交量 (Volume) 这笔交易的成交数量。 单笔成交量,不是累计量。
成交额 (Turnover) 这笔交易的成交金额(价格*数量)。 不是所有数据源都提供,看具体字段。
买卖方向 (BS Flag) 标识这笔成交是主动性买盘还是卖盘。 这个很重要!是判断资金流向的基础。但不同交易所的规则和标识方法可能有差异。
委买价 (Bid Price) 当前最优的买方报价。 快照数据,有的数据会提供多档。
委卖价 (Ask Price) 当前最优的卖方报价。 快照数据,和委买价一起构成买卖价差。
委买量 (Bid Size) 当前最优买价上挂单的数量。
委卖量 (Ask Size) 当前最优卖价上挂单的数量。
开盘价/最高价/最低价 通常指当日以来的OHLC。 注意,这是动态变化的,每分钟的“当日开盘价”都一样,但“当日最高价”会变。
持仓量 (Open Interest) 最新的总持仓量。 也是动态更新的,对期货很重要。
几点个人体会:

数据量是真的大。一个活跃品种一天的Tick数据可能就有几十甚至上百万行,处理的时候内存和硬盘得准备好。
字段完整性是关键。有些基础数据可能只提供价格和成交量,没有买卖方向(B/S)和盘口(买卖价量),这对于很多策略来说就失去意义了。我这次调取数据,就特别关注了这些字段的完整性。
数据清洗是体力活。原始数据里可能会有错误的时间戳、异常的价格(比如价格为0)、重复记录等。之前用过一个免费源,光清洗数据就花了我一周,后来还是用了一个现成的清洗版本,省心不少。比如我调取了CMES金融数据库中过去三年的主力合约数据进行回测,发现它的数据在异常值处理和时间对齐上做得比较干净,直接就能用。
怎么获取和使用这些数据?
获取途径无非几种:官方数据商(贵且复杂)、第三方金融数据平台、或者自己爬(技术门槛高且不稳定)。对于大多数个人研究者和中小机构,第三方平台是比较现实的选择。

有些平台会提供API接口,方便你直接集成到自己的分析程序里。比如下面这个Python代码示例,就是用某个数据平台的接口来获取数据的一种方式(当然,你需要有相应的访问权限和正确的参数)。

示例:使用CMES金融数据库API获取Tick数据

注意:这里仅为示例代码框架,实际调用需要参考具体平台的API文档,并确保入参正确、调用频率符合限制。。

import pandas as pd

假设有这么一个数据获取的客户端库

from some_data_client import MarketDataClient

1. 初始化客户端(通常需要token或key)

client = MarketDataClient(api_key='your_api_key_here')

2. 设置查询参数

symbol = 'CL' # 例如,原油主力合约代码

date = '2024-05-20'

data_type = 'tick' # 指定获取tick数据

3. 发起请求

df_tick = client.get_historical_data(symbol=symbol, date=date, data_type=data_type)

4. 查看数据

print(df_tick.head())

print(f"获取到 行Tick数据")

写这个主要是把自己最近研究的东西理一理,也希望能给需要的人一点参考。数据本身只是原材料,怎么用它做出策略才是更烧脑的部分。如果大家对处理这种高频数据有什么心得或者坑,欢迎交流。

对了,不同平台对数据的命名和字段定义可能有点小差别,拿到数据后第一件事就是仔细看看他们的数据字典,别想当然。就先聊这么多吧。

评论