想要构建一个简单的股市数据库,老哥们给提点建议?

2020-11-16 14:12:21 +08:00
 LeeReamond

最近疫情都在远程办公,闲下来的时候想试着开发一下副业。虽然有的老哥说炒股行,有的认为属于赌博,我个人虽然也不太看好真的能赚钱,但是不妨碍先做一些技术性测试么。

目前想实现一个最小需求,先做到能实时监控 A 股所有股票的价格。具体来说就是保存 A 股大约 4000 只个股(只包含个股,不包含基金、指数等)的每分钟 K 线数据,包括开盘价,收盘价,最高价,最低价。并且取数据的话保证每次取到的都是 3-5 秒内的最新数据。

可用性方面目前不考虑多用户,只考虑能负担我一个人的即时存取就可以了。

========================================================================

简单考虑了一下,我目前能考虑到的技术问题有以下这些

1 、后端技术栈选择。我目前能用的技术栈有 java/go/python/node,感觉后两者应该可以直接枪毙,不知道有没有朋友用 go 开发过相关业务,各方面怎么样。

2 、数据库选择。考虑到数据更新频率应该很高,应该尽可能选择性能较高的数据库。我个人不会折腾容器式数据库,所以理想情况下应该是非容器数据库的读写性能能满足要求就最好了。数据库应该选择 Oracle/pg/mysql?mysql 我觉得应该枪毙,在这种场景下应该性能会比较拉胯。

3 、数据库表结构如何设计?

存储 K 线数据,一种情况是设计一张大表,包括股票代码、时间、以及价格这么几项,所有数据放在一块。不过如果考虑到存储粒度是一分钟 K 线的话,A 股每天大概会新增一百万行数据。如果要存历史数据的话,这个表应该会变得无限大,我觉得这么搞不太行。

那么应该如何设计呢?为每个只个股单独建一张表?如果这么设计的话,我觉得要实现每秒持续地,分别在 4000 个表里 update 数据,我没测试过,但我觉得一个表问题不大,4000 个表应该没有数据库扛得住。

3.1 、作为上个问题的衍生,是否需要 nosql 缓存? 所以折中办法是缓存最近一分钟数据,然后每分钟更新?这样会增加比如取 K 线这种业务代码的复杂度。

4 、是否要设计冗余?

股票的一个特点是,虽然储存的比较细粒度的是每分钟数据,但是经常按日汇总、周汇总、月汇总这样来看,是否将这部分数据单独冗余出来呢,还是取数据的时候现场计算?如果从 5-30-60-120-240 这种分钟级别逐层冗余上去,总体存储体积可能会增加一倍,同时数据即时更新的压力也会增大(原先每分钟只需要更新 4 千张表,现在可能需要更新 4 万张表了)

====================================================

目前大概能想到这么多问题,虽然是跟股票相关但基本还是局限在跟股票没有关系的技术范围内。各位老哥提提意见,谢谢了。

我的想法是先把数据库建起来,然后跑一些历史回测,反正做一个模型看起来不是很花时间的样子。

我知道现在网上有一些免费提供回测能力的项目,但是我本身也在享受自建数据库这个过程,所以不准备用别人做好的服务。

1771 次点击
所在节点    问与答
19 条回复
imn1
2020-11-16 14:39:22 +08:00
网上不是已经有了么?免费收费都有
你想去分一杯羹?

善意提醒
1.真・实时不是谁都能做的,需要一些接入资格,个人只能二手 API 获取,而且分笔这种要上服务器,普通机器估计够呛
2.每分钟 /分笔这种,字节数巨大,单纯 A 股百 G 不夸张,如果还有其他证券类型,…… 自己想象
LeeReamond
2020-11-16 15:01:14 +08:00
@imn1 分笔肯定是不考虑了,维护不起。分钟跟分笔之间有海一样深的差距,也不敢想?
LeeReamond
2020-11-16 15:05:19 +08:00
@imn1 我估算了一下,如果储存 5 分钟级的话,行数应该在十亿以内,如果一分钟级大概在几十亿。我觉得百 G 级数据库完全 OK 啊,一台物理机器就搞定了,又不是百 T 级
sikariba
2020-11-16 15:44:16 +08:00
不排斥新技术的话,数据库考虑一下 kdb ?华尔街全用这个,国内有些交易所和头部券商这两年也跟上了。内存型数据库,针对时间序列数据有专门优化,有完整的金融解决方案,就是学习曲线比较陡峭(但本身是一门非常长见识的语言)
LeeReamond
2020-11-16 15:45:58 +08:00
@sikariba 感谢回复,搜索了一下。不过内存型的话,没那么多钱啊
sikariba
2020-11-16 15:50:59 +08:00
@LeeReamond #5 32 位的版本是免费的,你描述的需求场景足够了
yzbythesea
2020-11-16 16:06:10 +08:00
你这个估计得用 time series db,我想了一下其实实现和一般的 metric server 特别像。你其实可以试下 Prometheus 来做。
LeeReamond
2020-11-16 16:10:54 +08:00
@sikariba 我的意思是没钱搞一台百 G 内存的机器专门跑这个。。百 G 内存和百 G 硬盘不是一个概念。。
sikariba
2020-11-16 16:18:50 +08:00
@LeeReamond #8 不是,它是 load on demand 的,你这个需求正常 8~16G 主存的电脑就可以了。不过看下来似乎你不是很感冒😂😂😂,fine~
LeeReamond
2020-11-16 16:24:02 +08:00
@sikariba 感谢回复。如果没有硬性要求的话我倒是很乐意尝试这套解决方案,老哥推荐个搜索关键字,我去学习一下。另外他跟后端语言的对接怎么样
renmu123
2020-11-16 16:33:26 +08:00
每分钟 60 秒,算每四秒一次,15*4000=60000,一分钟六万次请求性能和带宽要求可不低。且不说有没有这样的接口,而且可能还要代理。如果没有接口,手动解析 html,那速度就更够呛了。

一般可能就使用时序数据库了
redtea
2020-11-16 16:51:18 +08:00
有这时间还不如研究一下量化策略,数据花点钱买就是了,最多写写数据怎么入库的代码就行了。
sikariba
2020-11-16 16:56:44 +08:00
学习资料基本只能啃官网: https://code.kx.com/ ,常用的后端语言 C 、Python 、Java 、JS 、Go 都有库的: https://code.kx.com/q/interfaces/
入库的语言要看你对接的数据源都支持哪些语言,这个肯定越快越好。但你前面说后端枪毙 Python/Node 的这个,用了 kdb 的话就无所谓了,股票分析放在 kdb 里做是最快的,后端语言只是对接 web 做个展示,砍掉都行
vhysug01
2020-11-16 17:37:14 +08:00
推荐下 jqdata
wander639
2020-11-16 22:06:06 +08:00
我自己在用 influxdb,可以按时间聚合以及连续查询,但是我的数据量很小(采集单个品种的分钟行情),所以不知道性能够不够用
LeeReamond
2020-11-18 12:17:36 +08:00
@wander639 老哥,我简单了解了一下国产的时序数据库,他这些数据库似乎都是为了大量写入模型开发的,我看他们说写入和聚合很快,但是传统的单条修改很慢,为了修改一条数据需要修改整个区块,你怎么解决这个问题的
LeeReamond
2020-11-18 12:19:39 +08:00
@LeeReamond 因为股票数据可能有这个问题,比如你每 3 秒一次采集数据,仍然有可能因为各种原因漏掉一些极值点(比如在这三秒期间股价上去又下来了,你没采集到),收盘后通常会做更正。如果没有更正能力的话这东西要怎么保证准确呢
LeeReamond
2020-11-18 12:55:20 +08:00
@vhysug01 看了一下,确实不错,应该数据把存储之外的需求全都完成了。不过免费额度不够用啊,老哥开付费了吗
vhysug01
2020-11-19 09:41:36 +08:00
@LeeReamond 看自己需求吧,我偶尔看看数据,用量不大,所以没开

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

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

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

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

© 2021 V2EX