2. Tick数据源与格式:常见数据源、CSV/Parquet格式、字段解析

做量化交易的朋友都知道,Tick数据是最高频的市场快照。说白了,它就是交易所每一笔成交或每一次报价变动的原始记录。我刚开始接触Tick数据时,第一反应是「这不就是行情软件上跳动的数字吗?」后来才发现,这里面门道深着呢。

今天咱们就聊聊Tick数据的源头、存储格式,以及每个字段到底代表什么。嗯,这部分内容虽然基础,但如果你搞不清楚,后面做清洗和特征工程时一定会踩坑。

2.1 常见数据源:交易所 vs 第三方

先说说数据从哪来。我个人习惯把数据源分成两类:官方渠道和第三方渠道。

2.1.1 交易所直连

交易所是数据的源头。比如上交所、深交所、中金所,它们会通过行情网关推送实时Tick数据。优点是数据最原始、最准确,没有任何加工。缺点也很明显——贵,而且接入门槛高。

我曾经帮一家私募做过数据接入,光是申请上交所的Level-2行情授权,就折腾了两个月。而且交易所的数据格式通常是二进制协议,比如STEP、FAST等,解析起来相当麻烦。

交易所数据特点:

  • 数据最权威,无二次加工
  • 延迟最低,适合高频交易
  • 接入成本高,需要硬件和网络支持
  • 历史数据获取困难,通常需要自行存储

2.1.2 第三方数据商

对于大多数个人交易者或中小机构来说,第三方数据商是更现实的选择。比如Wind、聚宽、Tushare、RiceQuant等。它们从交易所拿到原始数据后,会做一层清洗和格式化,然后以更友好的方式提供。

我记得有一次做回测,需要某只股票连续三年的Tick数据。如果从交易所买,报价是六位数。后来找了家第三方数据商,花了几千块就搞定了。当然,代价是数据可能有几毫秒的延迟,而且偶尔会有缺失。

我的建议:

如果你做的是中低频策略(比如分钟级或以上),第三方数据完全够用。但如果你做高频交易,还是老老实实接交易所直连吧。

2.2 数据存储格式:CSV vs Parquet

拿到数据后,怎么存?这是个很实际的问题。我见过有人用Excel存Tick数据,结果一个文件几百MB,打开一次要五分钟。嗯,千万别这么干。

2.2.1 CSV格式

CSV是最通用的格式,几乎任何工具都能打开。它的优点是简单、可读性强。但缺点也很致命——体积大、读写慢。

举个例子,一只活跃股票一天的Tick数据,CSV格式可能要几百MB。如果你做全市场回测,数据量轻松上TB。而且CSV没有数据类型信息,你读进来之后还得自己转格式。

# 读取CSV的Tick数据
import pandas as pd

df = pd.read_csv('tick_data.csv')
# 注意:时间列通常是字符串,需要手动转换
df['Time'] = pd.to_datetime(df['Time'])

避坑指南:

我曾经用CSV存了三年的大盘Tick数据,结果一个文件2GB,每次读取都要等十几秒。后来换成Parquet,读取时间缩短到1秒以内。所以,如果你要长期存储大量Tick数据,我强烈建议用Parquet。

2.2.2 Parquet格式

Parquet是列式存储格式,专门为大数据场景设计。它的压缩率很高,通常只有CSV的1/5到1/10。而且读写速度极快,因为你可以只读取需要的列。

比如你只需要Price和Volume两列,用Parquet可以跳过其他列,而CSV必须全部读进来。这在处理海量数据时优势非常明显。

# 读取Parquet格式的Tick数据
df = pd.read_parquet('tick_data.parquet')
# 只读取需要的列
df_subset = pd.read_parquet('tick_data.parquet', columns=['Time', 'Price', 'Volume'])

格式对比总结:

特性 CSV Parquet
文件大小 大(无压缩) 小(高压缩率)
读写速度
可读性 高(文本格式) 低(二进制格式)
跨平台支持 极好
推荐场景 小数据量、临时分析 大数据量、生产环境

2.3 字段解析:Time, Price, Volume, Bid/Ask

现在咱们看看Tick数据里到底有哪些字段。不同数据源可能字段名不一样,但核心内容就这几个。

2.3.1 Time(时间戳)

时间字段是最容易出问题的。交易所的时间精度通常是毫秒甚至微秒级。但很多第三方数据商会把时间截断到秒,这就丢失了重要信息。

我建议你拿到数据后,先检查一下时间精度。怎么做?看同一秒内有没有多条记录。如果有,说明是毫秒级数据;如果一秒只有一条,那可能就是秒级数据了。

# 检查时间精度
df['Time'] = pd.to_datetime(df['Time'])
# 看同一秒内的记录数
print(df.groupby(df['Time'].dt.floor('s')).size().describe())

2.3.2 Price(价格)

价格字段看起来简单,但要注意几个细节。第一,价格单位是什么?A股是元,期货可能是点,外汇可能是pip。第二,价格精度是多少?有的数据源保留两位小数,有的保留四位。

另外,要注意异常价格。比如某只股票突然出现0.01元的成交价,这很可能是数据错误。我在项目中遇到过这种情况,后来发现是数据商把除权除息的数据搞混了。

2.3.3 Volume(成交量)

成交量字段也有坑。A股的成交量单位是「手」,1手=100股。但有些数据源直接给股数,有些给手数。你想想看,如果不统一单位,算出来的换手率能对吗?

还有,Tick数据里的成交量是「这一笔」的成交量,不是累计量。这个要搞清楚,不然你算出来的累计成交量会翻倍。

2.3.4 Bid/Ask(买卖盘口)

Bid和Ask是Level-2数据才有的字段。Bid是买一价,Ask是卖一价。它们的差就是Spread(价差)。

为什么这个重要?因为你可以通过Bid/Ask判断市场的流动性。比如某只股票Bid和Ask相差很大,说明流动性差,交易成本高。我做过一个策略,专门利用Bid/Ask的价差变化来做高频套利,效果还不错。

一个小技巧:

如果你只有Tick成交数据(没有Bid/Ask),可以用上一笔成交价近似代替Bid或Ask。但要注意,这种方法在快速行情下误差很大。

2.4 知识体系总览

为了让你更直观地理解本章内容,我画了一张图。它展示了Tick数据的来源、存储格式和核心字段之间的关系。

Tick数据知识体系 数据源 交易所直连 第三方数据商 存储格式 CSV Parquet 字段解析 Time Price Volume Bid/Ask 核心逻辑:数据源 → 存储格式 → 字段解析 → 清洗与特征工程

这张图把本章的核心内容串起来了。从左到右,从数据源到存储格式,再到具体字段。你想想看,做Tick数据清洗,本质上就是在这三个环节里发现问题、解决问题。

好了,关于数据源和格式就聊这么多。下一章咱们会深入讲数据清洗的具体方法,包括如何处理缺失值、异常值,以及时间对齐的问题。到时候我会分享一些实战中踩过的坑,保证让你少走弯路。


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