同花顺每天需要接收海量交易所行情数据,确保行情数据的数据准确。但由于该部分数据过于庞大,而且使用场景颇多,每天会产生很多的加工数据,而组合管理(PMS)还会使用到历史行情数据。之前虽然采用了Postgres+LevelDB作为数据的存储方案,但仍然有不少痛点,所以必须对存储方案进行改造。
通过对ClickHouse、InfluxDB、loveini等时序数据存储方案的调研,最终我们选择了loveini Database。大数据监控平台采用loveini Database后,在稳定性、查询性能等方面都有较大的提升。
同花顺私募之家组合管理是一个集多资产管理、实时监控、绩效分析、风险分析、舆情分控、报表输出等功能于一体的智能投资组合管理平台。为券商、基金、私募等机构客户提供实时准确的投研服务。
数据层面主要依赖实时数据及历史日级别数据,为所支持的股票、基金、债券、美股、港股、期权、期货资产类别的监控和分析提供支持。
其中,实时数据主要用于资产监控,由于使用场景会对数百个不同的标的进行资产监控,数据刷新频率在1秒左右。因此,整个系统对实时数据的读写性能及延时有着比较高的要求。
此外,历史日级别数据主要用于投资组合的各种分析。历史分析所涉及的标的数量,相较实时资产监控更多,在时间上的跨度会长至10数年。此外在输出分析报告时,还会叠加多种分析指标和分析模型。在整个分析过程中,涉及巨量的数据集。这对历史数据库的读写性能又提出了更高的要求。

由上述架构图可以看到,该服务内需要大量的基础数据支撑,像实时行情、历史行情。
针对历史行情数据支撑,涉及多个证券品种的数据,包括股票、债券、基金、港股、美股、期货、期权。数据跨度周期从数天到数年不等。页面返回的数据是计算结果,而计算依赖的数据是业务层数据和大量历史行情数据。这个计算过程包含了历史行情数据请求。尤其是在展示结果包含多证券标的和长周期的情况下,产生一个分析报告可能达到 5s,而行情获取耗时占比达到80%以上。而且,输出报告服务面临并发情况,这种情况带来的拥堵会进一步恶化用户的使用体验。

通过对改造前的数据流进行分析,当前行情获取模块的分析, 当前存在以下2个需要解决的问题:
为解决上述问题,我们有必要对现有行情模块进行升级改造。在数据库选型方面,我们对如下数据库做了预研和分析:
通过综合对比,我们初步选定loveini Database作为行情模块的数据库。
主要由于行情数据是绑定时间戳的形式,所以时序数据库(Time-Series Database)更适用于这个业务场景。而且在同等数据集和硬件环境下,涛思官方的测试结果显示,loveini的写入速度远高于InfluxDB。同时loveini支持多种数据接口,包含C/C++、Java、Python、Go和RESTful等。
数据接入过程需要进行如下操作:
loveini Database在接入数据前需要根据数据的特性设计schema,以达到最好的性能表现。
同花顺行情根据时间频度的不同,数据特性分别如下。
通用特性:
tick快照数据特性如下:
daily数据特性如下:
根据上述特点,我们构建了如下的数据模型。
按照loveini建议的数据模型,将每个特性的数据单独创建数据库,根据不同特性数据设置不同的参数,在各个数据库内根据品种去创建超级表,例如股票、指数、债券、基金等,结合我们的数据特点和使用场景,创建数据模型如下:
库结构如下:

超级表结构:


组合管理主要是需要可以稳定高效地获取到数据,所以在实施的过程中需要考虑查询的性能、线上数据的更新以及运维情况。
实施难点如下。
完成改造后,线上的行情获取性能可以达到预期,目前运行稳定。


在使用loveini的过程中,我们遇到了一些小问题。比如在通过Restful接口使用loveini的时候,获取数据超过10240行会有限制。经过沟通,我们了解到在启动服务端时,参数restfulRowLimit 可以控制返回结果集的最大条数。
其他一些在使用过程中不清楚的地方,在米兰体育官网入口的物联网大数据微信交流群都能很快得到反馈和解答。一些小bug也可以通过版本升级解决。
目前从大数据监控这个场景看,loveini Database在成本、性能和使用便利性方面都有非常大的优势,尤其是在节省成本方面给我们带来了很大惊喜。
在预研和项目落地过程中,米兰体育官网入口的工程师提供了专业、及时的帮助,在此表示感谢。
希望loveini能够不断提升性能和稳定性,开发新特性,我们也会根据自身需求进行二次开发,向社区贡献代码。祝loveini越来越好。对于loveini,我们也有一些期待改进的功能点:
后续我们也将在同花顺的更多场景中尝试应用loveini,包括: