4、Tick数据存储:CSV、HDF5、Parquet格式对比与选择

做量化交易的朋友都知道,Tick数据是高频交易的“原油”。每一笔成交、每一次报价,都是真金白银堆出来的信号。但数据量一上来,存储就成了大问题。

我刚开始做Tick数据清洗那会儿,就吃过存储格式的亏。当时图省事,全用CSV存,结果一个月的沪深300Tick数据,硬盘直接爆了。后来换HDF5,读写速度上来了,但跨平台共享又成了噩梦。直到Parquet出现,才算找到了平衡点。

今天咱们就掰开揉碎,聊聊这三种格式的优缺点,以及在实际项目中怎么选。

4.1 三种格式的“性格”差异

先给个直观的对比,你一看就明白:

特性 CSV HDF5 Parquet
存储空间 极大(未压缩) 中等(支持压缩) 极小(列式压缩)
读写速度 慢(逐行解析) 快(二进制块) 极快(列式裁剪)
跨平台兼容 极好(任何文本编辑器) 差(依赖HDF5库) 好(主流语言都支持)
数据类型支持 弱(全是字符串) 强(支持复杂结构) 强(原生类型)
适合场景 小数据量、临时交换 科研数据、单机大文件 大数据分析、分布式系统

说白了,CSV是“万金油”,但性能拉胯;HDF5是“大力士”,但脾气古怪;Parquet是“特种兵”,专为分析而生。

4.2 CSV:最熟悉的陌生人

CSV的好处不用我多说,任何工具都能打开。但Tick数据用CSV存,简直是暴殄天物。

痛点一:体积爆炸

一个Tick数据行,包含时间戳、价格、成交量、买卖盘口……用逗号分隔后,光字段名就占了不少空间。我算过,同样的数据量,CSV比Parquet大5-8倍。

痛点二:读写慢如蜗牛

CSV是行式存储,你要读某一天的某个股票,得把整个文件从头扫到尾。你想想看,一个月的Tick数据动辄几十GB,每次查询都全表扫描,CPU和内存都在哭泣。

避坑指南
我曾经用CSV存了半年的股指期货Tick数据,结果做回测时,光是加载数据就花了20分钟。后来换成Parquet,加载时间缩短到30秒。嗯,那之后我再也没用CSV存过生产数据。

4.3 HDF5:科研界的“老大哥”

HDF5在科学计算领域地位很高,能存多维数组、支持压缩、读写也快。但用在量化交易上,有几个坑你得注意。

优点:

  • 支持分层结构,一个文件里可以放多个数据集
  • 读写速度快,尤其是顺序读取
  • 支持多种压缩算法

缺点:

  • 跨平台兼容性差。你在Windows上写的HDF5文件,拿到Linux上可能打不开(版本问题)
  • 并发写入容易损坏文件。多个进程同时写一个HDF5文件,大概率会崩
  • 文件体积会“膨胀”。删除数据后,空间不会自动回收
我的建议
如果你只是单机做研究,不涉及团队协作,HDF5是个不错的选择。但一旦要上生产环境,或者需要跟别人共享数据,我建议你慎重。

4.4 Parquet:大数据时代的“新贵”

Parquet是列式存储格式,天生为分析场景设计。现在Spark、Pandas、Dask都原生支持它。

为什么Parquet适合Tick数据?

  • 列式裁剪:你只需要读“时间戳”和“价格”两列,Parquet只加载这两列的数据,IO量大幅减少
  • 压缩率高:同一列的数据类型相同,压缩算法效果更好。我实测过,Tick数据用Snappy压缩,体积只有CSV的1/10
  • 支持谓词下推:查询时带上过滤条件(比如只查某只股票),Parquet会在读取文件时就过滤掉无关数据
  • 跨平台友好:Python、Java、R、C++都能读写,不存在版本兼容问题

来看个代码示例,你就知道Parquet有多方便:

import pandas as pd

# 读取Tick数据(假设是CSV格式)
df = pd.read_csv('tick_data.csv', parse_dates=['timestamp'])

# 保存为Parquet
df.to_parquet('tick_data.parquet', compression='snappy')

# 读取时只加载需要的列
df_subset = pd.read_parquet(
    'tick_data.parquet',
    columns=['timestamp', 'price', 'volume'],
    filters=[('symbol', '==', '000001.SZ')]
)

你看,代码就这么几行。而且读取速度比CSV快了一个数量级。

核心结论
对于Tick级数据,我个人强烈推荐Parquet。它兼顾了存储效率、读写速度和跨平台兼容性。除非你有特殊需求(比如必须用文本格式交换),否则Parquet是首选。

4.5 实战中的选择策略

说了这么多,到底怎么选?我总结了一个简单的决策树:

  1. 数据量小于1GB,且只是临时分析 → 用CSV,省事
  2. 单机研究,数据量大,不跟别人共享 → 用HDF5,性能好
  3. 生产环境,需要频繁查询,多人协作 → 用Parquet,没毛病
  4. 需要跟外部机构交换数据 → 用CSV(对方可能没有Parquet库)

我个人习惯是:原始数据落地用Parquet,中间处理结果也用Parquet,只有最终输出给业务部门时,才转成CSV。

4.6 知识体系总览

下面这张图,帮你理清三种格式的核心差异和选择逻辑:

Tick数据存储格式对比与选择 CSV HDF5 Parquet 行式存储 文本格式 兼容性极好 二进制块 支持压缩 单机性能强 列式存储 高压缩率 跨平台友好 选择标准:数据量大小 | 查询频率 | 团队协作 | 跨平台需求 推荐:Parquet(生产环境首选)

嗯,这张图把核心逻辑都串起来了。你保存下来,以后选存储格式时拿出来看一眼,基本不会出错。

避坑指南
我曾经在团队里推广Parquet时,遇到一个坑:旧版Pandas(0.24以下)不支持Parquet。如果你还在用老版本,记得先升级。另外,Parquet的压缩算法要选对,Snappy速度快但压缩率一般,Gzip压缩率高但慢。Tick数据我建议用Snappy,平衡读写速度和存储空间。

好了,关于Tick数据存储格式,咱们就聊到这儿。记住一句话:没有最好的格式,只有最合适的场景。但如果你问我个人意见,Parquet,闭眼入。


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