
去年 15 日的笔记挖了个坑,给出了量化数据和因子的存储方案技术导图。这一篇笔记就开始填坑。
即使我们购买了在线数据服务,比如 tushare, 聚宽的账号,我们仍然要构建自己的本地存储,为什么?
原因如下:
- 在线数据服务一般都有 quota 限制(比如聚宽)。如果我们要频繁地进行回测,很容易用尽 quota。
- 如果我们在回测时,使用的数据要从远程服务器上获取,网络延时会大大影响到回测速度。
- 即使在线数据服务提供了因子库(比如 Alpha 101, Alpha 191 因子库),但是,真正能战胜市场的因子,必然来自于你自己的独特研究,所以, 我们也要解决自己提取的因子如何存储的问题,这也决定了我们仍然要构建自己的本地存储。
这一篇笔我们介绍 HDF5,这是最适合个人交易者的入门方案。HDF5 可以处理相当大容量的数据。

根据 Kesheng Wu 等人的研究,他们分析 2007 年到 2012 年 7 月间的期货交易数据,以构建 VPIN 因子时,处理的交易数据达 30 亿条,CSV 文件的大小达到了 140GB。当使用这么多数据进行 VPIN 计算时,使用 CSV 文件的时间是 142 秒;将其转换成 HDF5 格式后,同样的计算则只花了 0.4 秒,HDF5快了200多倍!
HDF(Hierarchical Data Format)是一种为存储和处理大容量科学数据设计的文件格式及相应库文件。最早由 NCSA (美国国家超级计算应用中心) 研究开发,现由非盈利组织 HDF Group 维护。最新的格式是第 5 版,因此就被称为 HDF5。HDF 最初提供了多种数据类型,比如光栅图像和注解等,而在第 5 版中,简化到只支持科学数据集(即同质多维数组)和群组两种类型。
HDF5 官方版本是基于 C/C++ 的,但也像 MATLAB、Java、Python、R 和 Julia 这些语言也有自己版本的 HDF5 API。
作为量化人,我们使用最多的是 h5py。

h5py 的 logo
HDF5 的基本概念
HDF5 使用文件来存储数据。它包含两种对象,即数据集(这是一种类似于数组的数据集合)和群组(类似于文件夹,其下可包含数据集 datasets 和其它群组)。我们可以这样来理解 h5py 中的基本对象:
群组象字典一样工作,而数据集则像 Numpy 数组一样工作。
h5py 的 API 比较基础,用法并不复杂。但作为行情和因子数据库,我们需要自己构建一些功能。下面的代码,将演示我们如何存储行情数据,并实现每日更新:
codes = ["000001.XSHE", "600000.XSHG"]
h5file = "/tmp/bars.h5"
h5 = h5py.File(h5file, "a")
for name in ("1m", "5m", "10m", "30m", "1d"):
if name not in h5.keys():
h5.create_group(f"/

本文详细介绍了为何个人交易者需要构建本地存储,特别是使用HDF5进行大规模数据存储的优点。HDF5在处理大量数据时表现出色,同时讨论了其局限性和可能的优化策略,如并行版本和使用PyArrow/Parquet。
最低0.47元/天 解锁文章
2090

被折叠的 条评论
为什么被折叠?



