2. Tick数据源与格式:常见数据源、字段解析与格式对比
做Tick数据清洗,第一步不是写代码,而是搞清楚数据从哪来、长什么样。我见过太多人拿到数据就开始跑脚本,结果发现字段对不上、时间戳格式不对,白白浪费半天时间。今天咱们就把这个基础打牢。
2.1 常见数据源
Tick数据的来源,说白了就两大类:交易所直连和第三方数据商。各有各的脾气。
2.1.1 交易所直连
国内几大交易所,数据格式和获取方式都不一样。我整理了个表,方便你对照:
| 交易所 | 数据接口 | Tick频率 | 备注 |
|---|---|---|---|
| 上交所 | MDGW (行情网关) | 约3秒/笔 | Level-2需额外申请 |
| 深交所 | MDDP (行情数据平台) | 约3秒/笔 | 支持逐笔成交 |
| 中金所 | CTP (综合交易平台) | 约0.5秒/笔 | 期货Tick更密集 |
| 大商所/郑商所 | CTP / 各所专线 | 约0.5秒/笔 | 夜盘数据需注意 |
我个人习惯,做回测时优先用交易所直连数据。为什么?因为最干净。但代价也高——你得有行情服务器,还得处理断线重连。我在项目中遇到过,某次凌晨数据断流,第二天才发现回测结果全是NaN,那叫一个头疼。
2.1.2 第三方数据商
如果你不想折腾硬件,第三方数据商是更现实的选择。常见的几家:
- Wind:覆盖面最广,但Tick数据要额外付费。我建议只拿它做校验用。
- 聚宽/米筐:量化平台自带,适合快速验证策略。但历史Tick数据有截断,比如只保留最近3年。
- Tushare/akshare:开源免费,适合学习。但数据质量参差不齐,我见过时间戳错乱的情况。
- 彭博/路透:国际品种首选,价格也最贵。做跨境策略时绕不开。
2.2 Tick数据字段解析
一条Tick记录,到底包含哪些信息?咱们拿最常见的股票Tick来拆解。嗯,这里要注意,不同交易所的字段名可能不一样,但核心逻辑是相通的。
| 字段名 | 含义 | 示例 | 常见坑点 |
|---|---|---|---|
| Timestamp | 时间戳 | 2024-01-15 09:30:00.123 | 精度问题:毫秒还是微秒? |
| Symbol | 合约代码 | 600519.SH | 后缀格式不统一 |
| LastPrice | 最新成交价 | 168.50 | 除权除息后未复权 |
| Volume | 成交量(股/手) | 1200 | 是累计量还是本笔量? |
| Turnover | 成交额(元) | 202200.00 | 单位有时是万元 |
| BidPrice1 | 买一价 | 168.49 | Level-1才有 |
| AskPrice1 | 卖一价 | 168.51 | Level-1才有 |
| BidVol1 | 买一量 | 500 | 单位需确认 |
| AskVol1 | 卖一量 | 300 | 单位需确认 |
你想想看,光一个时间戳就能玩出花来。我曾经处理过一批数据,时间戳是Unix毫秒数,但文档里写的是「秒」。结果回测时所有信号都提前了1000倍,差点把策略参数调崩了。
2.3 数据格式对比
数据格式的选择,直接影响你的清洗效率和存储成本。我这些年用过CSV、Parquet、HDF5,各有各的适用场景。咱们直接上对比:
| 特性 | CSV | Parquet | HDF5 |
|---|---|---|---|
| 存储大小 | 大(未压缩) | 小(列式压缩) | 中等 |
| 读取速度 | 慢(全量解析) | 快(列式读取) | 快(支持切片) |
| 写入速度 | 快(追加模式) | 中等 | 慢(需预分配) |
| 跨语言支持 | 极好 | 好 | 一般 |
| 元数据支持 | 无 | 内嵌Schema | 支持属性 |
| 适用场景 | 小数据量、临时分析 | 大数据量、生产环境 | 科学计算、复杂查询 |
2.3.1 CSV:最通用,但最慢
CSV的好处是「是个工具就能打开」。我刚开始做量化时,所有数据都存CSV。但后来发现,一个股票一天的Tick数据就有几十万行,全市场几千只股票,CSV文件数量爆炸,读取一次要等半天。
如果你只是做小样本分析,CSV完全够用。但记住一点:永远不要用Excel直接打开大CSV。我见过有人用Excel打开500MB的Tick数据,电脑直接蓝屏。
2.3.2 Parquet:生产环境的首选
Parquet是我现在的主力格式。它是列式存储,读取时只加载你需要的列,速度极快。举个例子,你只想看某只股票某天的LastPrice和Volume,Parquet只需要读取这两列的数据,而CSV得把整行都读进来。
代码示例:用Pandas读写Parquet
import pandas as pd
# 读取Parquet文件
df = pd.read_parquet('tick_data.parquet', columns=['Timestamp', 'LastPrice', 'Volume'])
# 写入Parquet文件
df.to_parquet('tick_data_clean.parquet', compression='snappy')
我个人习惯,清洗后的数据一律存Parquet。压缩比高,读取快,而且自带Schema校验,不会出现「这列明明是浮点数,怎么读进来变成字符串」的尴尬。
2.3.3 HDF5:适合复杂查询
HDF5的优势在于支持多维数据和复杂查询。比如你想按日期、股票代码、时间范围做切片,HDF5的索引机制比Parquet更灵活。但它的写入速度慢,而且跨语言支持不如Parquet。
我在项目中遇到过,用HDF5存储全市场Tick数据,结果文件大小超过100GB,每次写入都要等几分钟。后来换成Parquet + 分区存储,速度提升了一个数量级。
- 学习阶段、小数据量 → 用CSV,方便调试
- 生产环境、大数据量 → 用Parquet,性能优先
- 需要复杂查询、科学计算 → 用HDF5,但注意文件大小
2.4 知识体系总览
为了让你更直观地理解本章内容,我画了一张结构图。它把数据源、字段、格式这三块串起来了:
这张图你看懂了吗?数据源决定了你能拿到什么字段,字段决定了你要怎么清洗,而格式决定了清洗效率。三者环环相扣,缺一不可。
公众号:蓝海资料掘金营,微信deep3321