IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> TDengine在弘源泰平量化投资中的实践 -> 正文阅读

[大数据]TDengine在弘源泰平量化投资中的实践

公司简介

深圳市弘源泰平资产管理有限公司组建于2016年,团队核心成员来自于知名高校,有丰富的资产配置与策略构建的实践经验。弘源泰平以套戥交易绝对收益型配置工具为起点,致力于为用户提供流动性好、费率公允的资产配置工具。产品线全面、丰富,涵盖股、债、商品等各大类资产,通胀、趋势等各类因子。

场景简介+核心诉求

我们的量化交易系统每天要接收大量的行情数据,也要基于行情产生大量的决策信号。这些数据都需要及时存下来,供盘中和盘后使用。

传统存放行情数据的方式有文件系统、关系型数据库或者文档数据库。我们尝试了MySQL和知名的时序数据库InfluxDB,但是性能都没有达到预期。分别遇到了如下问题:

  • MySQL:在写入大量实时的时序数据时,性能不理想;即便是优化之后,对于资源的浪费仍然十分惊人。而且随着数据量的增加,对设备数据的实时查询、时间范围分析的需求增加,基于MySQL的查询分析操作,响应时间会越来越长,甚至会无响应。缺乏自动建表功能,使用很不方便。
  • InfluxDB:虽然是时序数据库,但是经过测试后性能不能满足预期,在完成同样数据量的写入时对于资源的使用程度也并不能令人满意。

最后,我们改用TDengine彻底解决了实时写入大量数据点和快速查询的问题。

TDengine具体落地

对于策略研究员而言,历史行情和信号是交易策略研究的重要素材。下面以行情数据和策略信号数据为案例予以介绍。

数据建模

首先,将行情数据和信号数据分别存储。在TDengine中分别创建了一个行情数据库和信号数据库。

虽然是时序数据库,但是TDengine使用了关系型数据库的模型,建库,建表,使用SQL,十分便于传统关系型数据库的用户入手。并且,他们还很有创意地设计了超级表的概念,与我们的场景十分契合。

因为所有行情数据结构相同,行情库中只需要一个超级表,下面每个工具(衍生品基金等)对应一个子表。比如CU2101表示2021年1月份到期的铜期货交易合约。在合约到期之前,都会有行情数据写入。下面重点介绍策略信号数据库。

信号库有两张超级表,分别对应合约级别信号和策略级别信号,每个交易信号对应一张子表,当前共有 40,000多张表,表结构分别如下所示:

?下面是信号库执行show tables的截图:

?数据库配置以及写入

我们选用的TDengine版本是2.2.0.0,由于单机版尚无压力,目前还不需要集群。此外,机器有40核,而TDengine的每一个vnode又是拥有独立运行线程的工作单元。所以,根据文章《这几个神秘参数,教你TDengine集群的正确使用方式》,我调整了minTablesPerVnode、tableIncStepPerVnode和maxVgroupsPerDb参数,让vnode的数量恰好等于CPU核数,让每个核独立运行一个线程,实现了数据的合理化分布,以争取达到最佳性能。

?

写入性能

当前,我们大概每秒写入3万行数据。单节点TDengine可以十分轻松地实现这个级别数据量的写入。同时,消耗服务器资源又比InfluxDB与MySQL小的多。因此,即便未来业务扩大,我们也不需要担心额外的硬件成本。

资源消耗

我们当前的服务器配置如下:64G内存+40核 1.8GHz CPU+机械硬盘。

在业务运行期间,taosd的%CPU只有4%上下浮动,进程使用的物理内存百分比为11.2%。虽然内存占用稍多,但这是由于我们的vnode配置的比较多,每个vnode都有自己固定的内存缓冲区。因此,后续即便是继续大量增加新表或者加大写入量,内存占用也不会有明显的浮动了。

?截至目前,通过TDengine录入的两个信号表已经写入了82亿条数据,原数据大概为92GB,实际占用存储空间为20G左右,压缩率高达23%,如果是整型数据应该还会更高。

?

??

查询性能

除了写入与存储,使用TDengine做日常查询的速度也十分优秀,即便是对于几十亿级别的大表,也是毫秒级响应。我们来看两个场景。

场景1:查询特定策略信号下一段时间的均值。

select avg(v) from stgbox.strategy_signal where stg_name = '{stg_id}' and signal_name ='{signal_name}' and ts >= '{from_date} 00:00:00' and ts <= '{to_date} 23:59:59.999' interval({interval})

以下是我们用场景1查询出的数据进行可视化分析的示例。

场景2:查询满足模糊查询条件的信号的最新值。

select name,last(v) from stgbox.global_signal where name like '%keyword%' group by name。

?

在修改cachelast缓存之前,查询效率如上。

后面在涛思数据的技术支持之下,我们将cachelast参数设置成了3。

?再执行了同样的查询,查询效率得到了很大提升:

这两个都是我们比较典型的查询场景,TDengine完美地匹配了我们对功能以及性能上的需求。

写在最后

我们目前对TDengine的使用还处于初级阶段,TDengine不仅仅是时序数据库,还可以作为消息队列,支持数据订阅。以后我们会探索将TDengine用于更多的业务场景,以更好地服务于我们的各类分析与交易执行。

关于作者:

丁博,弘源泰平量化工程师。目前负责公司交易执行系统、交易策略信号系统和交易组合管理系统的研发。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章           查看所有文章
加:2021-11-02 23:14:32  更:2021-11-02 23:14:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:40:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码