新闻

一种优于 Python + HDF5 的存算方案 | 以高频因子为例

2023.06.14me

因子计算是非常常见的投研需求,以L2高频行情为例,目前国内全市场十年的 L2 历史数据约为 20 ~ 50T,每日新增的数据量约为 10 ~ 20G。常见的方案是使用 Python 进行投研开发,并配合 HDF5 存储行情数据,组合进行量化金融计算

在高频数据的存储上,虽然 HDF5 的支持强于 MS SQL Server、MySQL 等传统的关系型数据库,但仍然存在以下问题:

  • 数据权限管理困难
  • 不同数据关联不便
  • 检索和查询不便
  • 需要通过数据冗余来提高性能
  • 与 Python 之间的数据交互耗费时间
  • ……
  • 目前,越来越多的券商和私募机构开始采用 DolphinDB 进行高频数据存储和计算。那么,Python + HDF5 和 DolphinDB 库内一体化因子计算这两种方案,对比之下哪种更优呢
  • 这里我们以流动状态因子(flow)权重偏度因子(mathWghtSkew)为例进行对比测试,计算的数据量为 1992 只股票,3天总计 2200万行。我们调节不同的并行度,测试在使用不同 CPU 核数的情况下,两种方式计算因子的耗时。
完整的测试脚本和教程已发布在官方知乎,可点击文末阅读原文查看。

可以看到,在两种方案计算结果完全一致的前提下,单核 DolphinDB 库内计算比 Python + HDF5计算快接近100倍,随着可用 CPU 核数逐渐增加,DolphinDB 与 Python + HDF5 耗时比逐渐趋近 1:25 左右

我们所使用的快照表测试数据在 DolphinDB 中共55个字段,部分字段展示如下:

测试的软硬件环境如下:

01 存储引擎与分区机制保证高效数据读取

HDF5 文件的读写基本是单线程,存储结构的设计对读写效率至关重要,通常需要通过一些数据冗余存储来满足不同场景的高效读写。在数据量上升到 T 级后,数据管理和操作的复杂度会大幅增加,耗费大量时间和存储空间。

相比之下,DolphinDB 的数据管理、查询、使用更为简单便捷。得益于 DolphinDB 的不同存储引擎及分区机制,用户可以以普通数据库的方式轻松管理和使用 PB 级及以上数量级别的数据。


02 移动窗口计算优化提供更高性能

从代码实现来看,使用 DolphinDB 和 Python 两种语言来开发这两个高频因子的难度差别并不大。但代码量上,由于 DolphinDB 提供了 row 系列的行计算函数,开发会容易一些。

在移动窗口计算上,Python 通过 rolling 函数 + mean 等函数组合来计算,难以进行针对性的增量优化。而 DolphinDB 提供了 mavg (滑动窗口系列 m 系列) 和 rowWavg (行计算系列row 系列)函数,并进行了针对性的性能优化,相比之下计算性能最高可以提高100倍。


03 原生分布式自动并行调度

Python 中需要使用 Joblib 库,将要计算的股票从文件中读出后,按照并行度拆分成多组实现多进程的并行调度。

而 DolphinDB 计算框架会将一个大的计算任务拆解,自动分析数据涉及的分区,并通过参数配置最大工作线程数,进行多线程并行计算。

综合而言,在生产环境中,使用 DolphinDB 进行因子计算和存储远比使用 Python + HDF5 计算方式更加高效:

  • 代码实现方面,DolphinDB 的库内计算更易于实现因子计算调用及并行调用。
  • 计算速度方面,DolphinDB 的库内计算比 Python + HDF5 的计算方式快 25 倍以上。
  • 并行计算方面,DolphinDB 可以自动使用当前可用的 CPU 资源,而Python 脚本需要通过并行调度代码实现。