金融市场 L1/L2 的报价和交易数据是量化交易研究非常重要的数据。国内全市场 L1/L2 的历史数据约为 20~50T,每日新增的数据量约为 20~50G。传统的关系数据库如 MS SQL Server 或 MySQL 均无法支撑这样的数据量级,即便分库分表,查询性能也远远无法达到要求。例如 Impala 和 Greenplum 的数据仓库,以及例如 HBase 的 NoSQL 数据库,可以解决这个数据量级的存储,但是这类通用的存储引擎缺乏对时序数据的友好支持,在查询和计算方面都存在严重的不足,对量化金融普遍采用的 Python 的支持也极为有限。
数据库的局限性使得一部分用户转向文件存储。HDF5,Parquet 和 pickle 是常用的二进制文件格式,其中 pickle 作为 Python 对象序列化/反序列的协议非常高效。由于 Python 是量化金融和数据分析的常用工具,因此许多用户使用 pickle 存储高频数据。但文件存储存在明显的缺陷,譬如大量的数据冗余,不同版本之间的管理困难,不提供权限控制,无法利用多个节点的资源,不同数据间的关联不便,数据管理粒度太粗,检索和查询不便等等。
目前,越来越多的券商和私募开始采用高性能时序数据库 DolphinDB 来处理高频数据。DolphinDB 采用列式存储,并提供多种灵活的分区机制,可充分利用集群中每个节点的资源。DolphinDB 的大量内置函数对时序数据的处理和计算非常友好,解决了传统关系数据库或 NoSQL 数据库处理时序数据方面的局限性。使用 DolphinDB 处理高频数据,既可以保证查询与计算的超高性能,又可以提供数据管理、权限控制、并行计算、数据关联等数据库的优势。
本文测试 DolphinDB 和 pickle 在数据读取方面的性能。与使用 pickle 文件存储相比,直接使用 DolphinDB 数据库,数据读取速度可最多可提升 10 倍以上;若为了考虑与现有 Python 系统的集成,使用 DolphinDB 提供的 Python API 读取数据,速度最多有 2~3 倍的提升。有关 DolphinDB 数据库在数据管理等方面的功能,读者可参考 DolphinDB 的在线文档或教程。
1. 测试场景和测试数据
本次测试使用了以下两个数据集。
数据集 1 是美国股市一天(2007.08.23) Level 1 的报价和交易数据。该数据共 10 列,其中 2 列是字符串类型,其余是整型或浮点数类型,存储在 dolphindb 中的表结构如下表,一天的数据约为 2 亿 3000 万行。csv 文件大小为 9.5G,转换为 pickle 文件后大小为 11.8G。
数据集 2 是中国股市 3 天(2019.09.10~2019.09.12)的 Level 2 报价数据。数据集总共 78 列,其中 2 列是字符串类型,存储在 dolphindb 中的表结构如下表,一天的数据约为 2170 万行。一天的 csv 文件大小为 11.6G,转换为 pickle 文件后大小为 12.1G。
DolphinDB database 的数据副本数设为 2。将这两个数据集写入 DolphinDB 后,磁盘占用空间为 10.6G,单份数据仅占用 5.3G,压缩比约为 8:1。pickle 文件没有采用压缩存储。测试发现 pickle 文件压缩后,加载时间大幅延长。
对比测试查询一天的数据。对 DolphinDB Python API 与 pickle,记录从客户端发出查询到接收到数据并转换成 Python pandas 的 DataFrame 对象的耗时。
对于 DolphinDB Python API,整个过程包括三个步骤:
-
从 DolphinDB 数据库查询数据耗时,即若不使用 P