公司简介
深圳市弘源泰平资产治理有限公司组建于 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 用于更多的业务场景,以更好地服务于咱们的各类剖析与交易执行。
对于作者:
丁博,弘源泰平量化工程师。目前负责公司交易执行零碎、交易策略信号系统和交易组合管理系统的研发。