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:开源免费,适合学习。但数据质量参差不齐,我见过时间戳错乱的情况。
  • 彭博/路透:国际品种首选,价格也最贵。做跨境策略时绕不开。
注意:第三方数据商的数据,通常经过了「清洗」——但清洗不等于无损。比如他们会把明显的错误Tick直接删掉,而不是标记出来。你拿到的数据,可能已经丢失了部分真实信息。

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倍,差点把策略参数调崩了。

核心原则:拿到任何Tick数据,第一件事不是分析,而是画一条时间序列折线图。肉眼扫一遍,看看有没有跳变、有没有缺失、有没有异常值。这一步能省掉你后面80%的调试时间。

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 知识体系总览

为了让你更直观地理解本章内容,我画了一张结构图。它把数据源、字段、格式这三块串起来了:

Tick数据源与格式知识体系 数据源 字段解析 格式对比 交易所直连 第三方数据商 时间戳 价格/成交量 CSV Parquet 核心:数据源决定质量,字段决定清洗逻辑,格式决定效率

这张图你看懂了吗?数据源决定了你能拿到什么字段,字段决定了你要怎么清洗,而格式决定了清洗效率。三者环环相扣,缺一不可。

一句话总结:选对数据源,吃透字段含义,用对存储格式——Tick数据清洗的第一步就稳了。

公众号:蓝海资料掘金营,微信deep3321