V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
yagamil
V2EX  ›  Python

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

  •  
  •   yagamil · 2022-07-16 01:47:01 +08:00 · 2916 次点击
    这是一个创建于 897 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    12 条回复    2022-07-18 21:06:17 +08:00
    israinbow
        1
    israinbow  
       2022-07-16 05:38:35 +08:00 via Android
    关系型数据库把两百万条数据放一个表里是不可取得,至少得按时间段分表。
    若愿意用 kv 数据库,就上 HBase ,适合高并发的时序数据类型。
    jones2000
        2
    jones2000  
       2022-07-16 06:24:35 +08:00
    可以用 TiDB 数据库试试
    delectate
        3
    delectate  
       2022-07-16 07:34:00 +08:00   ❤️ 4
    不要造轮子,建议采用 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
        4
    BrettD  
       2022-07-16 07:50:39 +08:00 via iPhone
    Kdb
    tramm
        5
    tramm  
       2022-07-16 09:05:40 +08:00
    时序数据库?
    yagamil
        6
    yagamil  
    OP
       2022-07-16 09:57:01 +08:00
    @delectate 谢谢老哥详细的回复。 这里只用到当天的历史 tick ,3s 级的,其余的历史数据用不到。 实时查询 使用 io ,比在内存里读取还是慢很多。 之前还用的双向队列存储,长度用户初始化时设定,这样比存 sqlite 要省空间,就查询时比较麻烦。
    yagamil
        7
    yagamil  
    OP
       2022-07-16 09:58:55 +08:00
    @BrettD 搜了下,是个好东西
    yejinmo
        8
    yejinmo  
       2022-07-16 11:42:47 +08:00
    TDEngine
    国内已经有用这个做交易数据的了
    mxuan
        9
    mxuan  
       2022-07-16 15:14:13 +08:00
    KDB ,压缩比巨高,就是要收费(小数据量个人版免费)。次之就是用 HBASE ,influxdb 也是可以的。
    其实感觉你的需求偏向 HTAP 数据库,典型的就是 TiDB 。
    HelloAmadeus
        10
    HelloAmadeus  
       2022-07-17 01:07:18 +08:00
    直接存 hdf5 里,每日 tick 量都是固定的,array length 先申请,直接填数据就行,很快的。之前做量化的 tick 就是这样存的。
    yagamil
        11
    yagamil  
    OP
       2022-07-17 02:47:22 +08:00
    @HelloAmadeus 这个似乎不错,准备试试。谢谢老哥
    UN2758
        12
    UN2758  
       2022-07-18 21:06:17 +08:00
    前司是 HDF5 格式存的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2131 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 01:21 · PVG 09:21 · LAX 17:21 · JFK 20:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.