新闻

如何提升量化投研效率?来自辰钰投资的案例分享

2022.09.29

面对海量增长的高频数据,关系型数据库多次崩溃。在对 DolphinDB、MongoDB 和 KDB+ 进行充分调研对比后,辰钰投资选择了高性能、易学习、同时提供丰富金融函数的时序数据库 DolphinDB。在DolphinDB 的助力下,辰钰投资的量化投研效率得到极大提升。本文将由辰钰投资分享使用DolphinDB的具体实践。

辰钰投资 董事长 李栋

辰钰投资 董事 陈志凌

辰钰投资 数据库工程师 苏虎臣

上海辰钰财富投资管理有限公司是一家专注于国内证券市场低风险投资机会的量化对冲基金,主要投资方向为 A 股、期货和债券等市场。公司秉持“以数据理解市场,以模型解析对手,以复利回馈投资”的投资理念,致力于为客户提供优质的多策略投资管理方案,创造高回报率、低回撤的投资收益。

图1  辰钰的核心策略发展图

目前我司使用的系统可以轻松实现 Tick-to-trade 微秒级延时,支持多策略、大并发报单,同时支持券商多种风控模式,形成了低延时、高并发、强风控的显著优势。

投研到交易,全流程效率提升

在系统中,我们使用高性能时序数据库 DolphinDB 来帮助提升投研和交易的生产效率。

面对每天 20GB 左右的新增数据,DolphinDB 在我们的研究端起到了支撑作用。目前我们的主要业务是数据挖掘和策略研究。在做量化的过程中比如进行因子挖掘、性能计算时,对数据处理的性能要求非常高。在使用 DolphinDB 后,业务效率提升了5-10倍

图2  DolphinDB 的系统架构图

首先,我们使用 DolphinDB 进行数据的准备、清洗和挖掘。比如数据清洗。随着数据量的持续增长,难免出现残缺、错误或者重复的数据,那么在进行因子挖掘、策略研究等操作前要先找出并消除这些不符合规范的数据。之前使用的数据清洗工具的性能会随着数据量的增大而下降,无法处理 TB 级别以上的数据。但是通过  DolphinDB 内置的分布式文件系统,合理设计分区,分布式计算与数据清洗性能基本不会随着数据量的增大而下降,目前效率提升超过70倍

其次,使用 DolphinDB 强大的流数据功能助力指数增强、CTA、套利等方面策略研究。比如中证500指数增强,我们以大量全新的 Alpha 因子为技术核心,同时结合全新改版的交易算法和日内回转交易算法进行选股。在研发环境中,以行情回放的方式模拟实时数据流,通过流数据订阅发布机制时间序列聚合引擎、响应式状态引擎、横截面引擎等多种流计算引擎,实时高效地计算主买、主卖等量价指标,极大地提升了研发效能。

最后,我们使用 DolphinDB 的分布式计算功能处理高频数据。研发策略时,需要处理大量的逐笔行情数据,之前使用的关系型数据库的性能非常差,远远不能满足我们的业务需求。DolphinDB 的分布式架构可以轻松实现对海量数据的毫秒级快速访问和计算。再比如处理一些股票或者标的,每天要进行几十万、甚至上百万笔的自动交易,关系型数据库很难对此进行处理,但是 DolphinDB 可以快速基于逐笔数据建立策略,极大提升了研发效率。

由于团队的技术人员大多熟悉 Python,在实际使用中,我们将 DolphinDB 封装成一个库,可以通过 Python 直接进行访问。仅仅通过一行命令就可以高效、充分地使用 DolphinDB 的海量存储和快速计算功能。

存储大 PK

在使用 DolphinDB 前,我们先后使用过文件系统、MySQL 和 PostgreSQL 存储数据。

之前使用文件系统会先将数据落在本地,然后用 Python 进行计算。但是文件系统在实际应用中存在一些不足。首先,在存储过程中文件系统的 IO 是一个很大的瓶颈。其次,在处理大量数据时,文件系统过于庞大,进行存储、查询等操作费时且费力。同样地,MySQL 和 PostgreSQL 这两个数据库在实际测试中都非常慢。如果要处理的数据量很大,系统甚至会无法工作。
因此,我们想要搭建一套新的系统。主要考虑的数据库有 DolphinDB、MongoDB 和 KDB+。

由于 MongoDB 缺乏函数支持、旧代码改起来比较费劲,KDB+的语言较难学习,整体上手很慢,所以我们放弃了这两个数据库。

反观 DolphinDB,性能比 KDB+更好,语言类 SQL 容易上手,同时提供丰富的金融函数。在低频转向高频的过程中,原来的系统无法处理骤然剧增的数据,但 DolphinDB 是这方面的专家,相较之下新系统的速度可以提升10倍左右。在处理逐笔数据时,相比之前使用过的文件系统,现在的系统效率得到大大提升,并且使用起来也非常方便。此外,DolphinDB 作为一站式数据库,综合了分布式存储、编程建模和高性能计算,可以在研究时快速抽取某些特定的数据,这大大加快了我们的研究进度。

代码“惊魂”

因为之前的很多业务都用 Python 进行相关计算,所以需要将代码转移到 DolphinDB 中。当时发生了一件极其反常的事情——用 Python 和 DolphinDB 分别计算同一个问题,但最后得到了不同的结果!

究竟哪个计算结果是对的?

为什么会发生这种情况?

会不会影响到实际生产?

带着这些疑虑,我不断进行调试,最后发现原来是Python的脚本出现了编写失误。一个因子有很多计算方法,必须深入到每个因子的具体需求才能对应实现,相应的代码也会较为复杂。当时 Python 的脚本中使用了很多嵌套循环,编写的代码较多较复杂,难免出现脚本编写错误的情况。但是 DolphinDB 的语言非常简洁,实际中不需要那么多循环,只要一行代码就可以全部解决,这大大降低了脚本出错的概率,同时也可以减轻开发人员的压力,有效提升研发的效率。

本文最后

我觉得想要用好 DolphinDB,关键在于理解架构。只有清楚一些技术细节比如分区表的设计原理,才能高效使用工具进行量化投研。刚开始使用 DolphinDB 的时候,我发现使用时系统的反应速度并不是特别快,后来研究了 DolphinDB 的底层架构后,我重新优化了代码,发现速度立刻提升了很多。所以我觉得 DolphinDB 比较考验使用者的水平。使用不同的设计方法解决具体的业务问题,会得到完全不一样的效率。

在此简单分享我司使用 DolphinDB 提升投研效率的经历。希望有更多的朋友了解并使用高性能时序数据库 DolphinDB!