暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

实时计算高频复杂因子,像用 Excel 一样简单

760
响应式编程是一种面向数据流和变化传播的编程范式。
用户可以通过订阅和消费,实时处理和传播数据变化,从而简化异步操作和复杂的数据处理逻辑。
Excel 大家都用过,在一个单元格中输入公式,该单元格数值将会跟随相关单元格而变化——这就是一个响应式编程的例子。

但在实际的金融计算场景下,尤其是实时计算指标时,需要完成的计算工作比远远比 a+b 复杂得多。
比如下面这个因子:

公式非常长,计算过程要用到一个自定义的函数 sum_diff,和指数移动平均函数 ema (exponential moving average)。sum_diff 函数仅依赖输入的 x、y 参数,是一个无状态函数,而 ema 涉及历史数据,是一个有状态函数。
实时计算这个因子,意味着输出结果需要随历史数据的变化而变化。
更为棘手的是,我们把计算过程分解,可以得到下面这个有向无环图(DAG)。可以看到,我们需要使用状态函数的多重嵌套。也就是说,计算这个因子的过程中,需要层层“响应”,这大大增加了代码实现的复杂度。

►►►

状态算子的解析和优化

要实现这个图中的计算过程,有2个难点:

(1)如何像我们前面分解计算过程一样,让计算机自动解析得到一个优化的有向无环图(DAG);
(2)得到解析结果后,如何优化流程中每个有状态算子的计算,保证高性能。
这里,DolphinDB 提供了一个专门针对此类问题的流计算工具——响应式状态引擎
详细的引擎教程已发布在官方 Gitee,大家可以点击文末阅读原文查看。
响应式状态引擎,顾名思义,就是可以接收输入的历史数据,通过一定的计算公式,输出实时变化结果,即实现响应式编程过程的引擎。
首先,DolphinDB 的脚本语言是支持向量化和函数化的多范式编程语言。通过函数的调用关系,不难得到计算步骤的 DAG。
其次,DolphinDB 中内置的状态算子全部使用 C++ 开发实现,算法上经过了大量的优化,提高了以增量方式实现状态算子的流式计算效率。
这个引擎强大之处在于,在静态的历史数据集上开发和验证过的高频因子,可以直接复制到引擎中进行实时计算,这就大大降低了量化金融场景中流式因子的开发成本和难度。

►►►

强大的计算性能

DolphinDB 的响应式状态引擎可以实现以下功能:

  • 投研阶段使用历史数据快速计算大量复杂因子;

  • 实盘阶段在每个行情 tick 数据到来时,为每只股票实时计算大量复杂因子;

  • 流计算的代码实现与批处理同等高效,实现代码统一,轻松保证数据一致和正确性

在 CPU 为 Intel(R) Xeon(R) Silver 4216 CPU @ 2.10GHz 的服务器条件下,我们统计了用响应式状态引擎单线程计算20个不同复杂度因子的耗时,取了10次计算的平均值。测试结果如下:


股票个数
因子个数
耗时(单位:ms)
4000
20
6
120
0.07
4000
10.8
200
20
0.2

由于 DolphinDB 内置的状态算子经过了大量的优化,因而在单个线程上的计算达到了非常好的性能。

►►►

为什么不用 Python pandas/numpy 

除了 DolphinDB 外,Python pandas/numpy 目前是研究阶段最常用的高频因子解决方案。Pandas 对历史面板数据处理有非常成熟的解决方案,而且内置了大部分高频因子计算需要用到的算子,可快速开发高频因子。
但 pandas 无论是计算历史数据,还是计算实时数据,性能都比较差。
  • 历史数据进行计算时,单线程的计算性能存在很大提升空间。

  • 由于 python 的 Global interpreter lock 限制,我们无法轻易实现并行计算。也就是说,对实时数据进行计算时,由于 python 仅支持全量计算,不支持增量计算,所以无法达到实时计算的性能要求

考虑到生产环境中的性能,很多机构也会用C++重新实现研究(历史数据)代码。不过,这种方法需要维护两套代码,开发成本(时间和人力)会大幅增加,并且还要耗费大量精力确保两套系统的结果完全一致。

►►►

为什么不用 Flink

Flink 是一种流批统一的解决方案,支持 SQL 和窗口函数,高频因子用到的基本算子在 Flink 中也已经内置实现。因此,简单的因子用 Flink 实现比较高效,运行性能也较好。

但 Flink 最大的问题是无法实现复杂的高频因子计算。比如我们前面提到的例子,需要多个窗口函数的嵌套,Flink 就无法直接实现。

与之相比,DolphinDB 既可以保证历史数据并行计算性能,又能保证复杂高频因子的实时计算,在和传统解决方案的大 PK 中,完胜!

PS:DophinDB 的响应式状态引擎还支持过滤输出结果、快照机制和并行处理,满足了投研和生产环境业务的各方面需要。更多详细内容,请点击文末阅读原文查看。

Explore More



扫描二维码,添加 DolphinDB 小助手
点击阅读原文,带你了解响应式状态引擎!

文章转载自DolphinDB智臾科技,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论