实时保存股票 tick 数据,采用什么数据结构或者数据库比较好?

2022-07-16 01:47:01 +08:00
 yagamil

场景: 定时器每 3s 接收到一次数据,拿到股票池( 500 多只)的实时价格。 这时需要吧这些数据进行存储,存储完毕后需要运算,比如获取 x 分钟内的涨速,( x 为变量,有用户设定),选出标的。类似这样需要使用日内 tick 数据进行运算。

目前的方案是使用的 sqlite 进行存储( memory 模式),一天下来大概 200 万条数据。各种指标也转换为一些的 sql 语句。 但由于数据越到后面,插入和查询的时间也明显增长得比较厉害。

请问高手们,有什么好的数据结构或者数据库可以推荐,或者有什么好的架构思路?

交易也是实时进行的。 后期还需要扩展到使用 level 数据,时间间隔会在毫秒的。

暂且还是用 python ,我也知道 c++快,可是实现太难,进度也不允许。

2863 次点击
所在节点    Python
12 条回复
israinbow
2022-07-16 05:38:35 +08:00
关系型数据库把两百万条数据放一个表里是不可取得,至少得按时间段分表。
若愿意用 kv 数据库,就上 HBase ,适合高并发的时序数据类型。
jones2000
2022-07-16 06:24:35 +08:00
可以用 TiDB 数据库试试
delectate
2022-07-16 07:34:00 +08:00
不要造轮子,建议采用 win 所有股票软件常用的方法解决问题:
不同品种,不同周期,分别放在不同的文件内。这样一来每个文件体积会很小,剩下的就是考验 fs 的极限了。

举个例子,rb2210 。tick 、1 、5 、日这四个数据分别按照月或者更小的颗粒度保存在不同文件夹。
2022-07
|-tick / rb / 2210 / data.bin
|-1min / rb / 2210 / data.bin
|-5min / rb / 2210 / data.bin
|-day / rb / 2210 / data.bin

要单独维护一张表,即该品种的主力合约存在移仓、跨月情况,要去读取哪几个数据库。

非 5f 倍数的周期用 1f 数据(如 3f ); 5f 倍数的周期用 5f 数据(如 5f 、15f 、30f 、1H 、4H );日线或者以上用日线的数据计算(如周、月、季、年),此方式适合股票,期货另说。
BrettD
2022-07-16 07:50:39 +08:00
Kdb
tramm
2022-07-16 09:05:40 +08:00
时序数据库?
yagamil
2022-07-16 09:57:01 +08:00
@delectate 谢谢老哥详细的回复。 这里只用到当天的历史 tick ,3s 级的,其余的历史数据用不到。 实时查询 使用 io ,比在内存里读取还是慢很多。 之前还用的双向队列存储,长度用户初始化时设定,这样比存 sqlite 要省空间,就查询时比较麻烦。
yagamil
2022-07-16 09:58:55 +08:00
@BrettD 搜了下,是个好东西
yejinmo
2022-07-16 11:42:47 +08:00
TDEngine
国内已经有用这个做交易数据的了
mxuan
2022-07-16 15:14:13 +08:00
KDB ,压缩比巨高,就是要收费(小数据量个人版免费)。次之就是用 HBASE ,influxdb 也是可以的。
其实感觉你的需求偏向 HTAP 数据库,典型的就是 TiDB 。
HelloAmadeus
2022-07-17 01:07:18 +08:00
直接存 hdf5 里,每日 tick 量都是固定的,array length 先申请,直接填数据就行,很快的。之前做量化的 tick 就是这样存的。
yagamil
2022-07-17 02:47:22 +08:00
@HelloAmadeus 这个似乎不错,准备试试。谢谢老哥
UN2758
2022-07-18 21:06:17 +08:00
前司是 HDF5 格式存的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/866555

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX