新闻

性能提升30倍 | 深度不平衡、买卖压力指标和波动率计算优化案例

2022.05.31

金融场景下往往需要进行指标计算,有时会涉及大量数据和高维多列的复杂运算,因此计算过程的优化水平将决定资源利用率和开发耗时。

针对这一需求特性,DolphinDB 中提供了数组向量(Array Vector),用以存储可变长度的二维数组,这种存储方式可显著简化某些常用的查询与计算。
例如,若不同列中含有大量重复数据,使用数组向量存储可以提高数据压缩比提升查询速度

目前,仅内存表与使用 TSDB 存储引擎的分布式表支持数组向量,OLAP 存储引擎暂不支持数组向量。

数据与样本说明

  • 字段:快照中的部分字段,包括股票代码、快照时间、申买十价、申买十量、申卖十价、申卖十量。
  • 样本:2020年上证50指数的成分股,共约28.75亿条快照数据。
  • 分布式表数据总量:2,874,861,174
  • 上证50指数的成分股数据量:58,257,708
  • 逻辑 CPU 核数:8

指标定义

  • Weighted Average Price(WAP):加权平均价格

  • Depth Imbalance(DI):深度不平衡指标

  • Press:买卖压力指标

  • Realized Volatility(RV):波动率(定义为对数收益率平方和的平方根,本案例中用加权平均价格代替股价进行计算。)

一图带你读懂优化升级

本案例基于上述计算场景,开发了四份 SQL 代码,下图为大家展示了这四种不同存储计算方式下的性能差异。

OLAP 到 TSDB 性能提升原因

本案例中,可以看到 TSDB 存储引擎相比于 OLAP 引擎计算性能有了很大提升,主要原因在于:

  1. OLAP 存储引擎下,成分股涉及的分区内无关证券的数据也需要从磁盘加载到内存,然后进行数据解压、过滤和计算。而 TSDB 方式下,只需将成分股的数据从磁盘加载到内存,进行数据的计算操作。
  2. 针对上交所 Level 2 快照数据,采用 Array Vector 存储后,压缩比可以提升至 9-11;在没有任何缓存的前提下,与多列存储方案相比,单位时间内从磁盘上读取的数据条数提升。
  3. 多档量价数据采用 DolphinDB V2.00 TSDB + Array Vector 方式存储后,实现了在分布式表的某列某行中存储一个向量对象,所以矩阵运算中取某一列的多行数据返回的对象就是一个矩阵,与多列存储方案相比,省去了矩阵拼接过程