我正在考虑使用像mongodb或ravendb这样的数据库来存储大量的股票价格数据,并想知道与标准关系(如Sql Server)相比这是否可行。
数据实际上不是关系数据,而是几个巨大的表格。我还在想,我可以按分钟/小时/天/周/月等来加/最小/最大行数据,以便更快地进行计算。
示例数据: 500个符号* 60分钟* 60秒* 300天......(每个记录我们存储:日期,开放,高,低,关闭,交易量,开放 - 所有小数/浮点数)
那你们觉得怎么样?
答案 0 :(得分:5)
自2010年提出这个问题以来,已经发布了几个数据库引擎,或者开发了专门处理时间序列的功能,例如股票价格数据:
使用MongoDB或其他面向文档的数据库,如果您的目标是性能,建议是contort your schema来组织以秒为单位的对象中的刻度(或者是分钟的对象,每分钟是60秒的另一个对象) )。使用专门的时间序列数据库,您只需使用
查询数据SELECT open, close FROM market_data
WHERE symbol = 'AAPL' AND time > '2016-09-14' AND time < '2016-09-21'
我还在想,我可以按分钟/小时/天/周/月等对每行数据进行求和/最小/最大行数,以便进行更快的计算。
使用InfluxDB,这非常简单。以下是如何获得每日最低和最高限额:
SELECT MIN("close"), MAX("close") FROM "market_data" WHERE WHERE symbol = 'AAPL'
GROUP BY time(1d)
您可以按时间间隔进行分组,时间间隔可以是微秒(u
),秒(s
),分钟(m
),小时(h
),天(d
)或周(w
)。
时间序列数据库比面向文档的数据库更适合存储和查询大量的股票价格数据。
答案 1 :(得分:4)
这里的答案取决于范围。
MongoDB是获取数据的绝佳方式,它在查询单个部分时非常快。它也很好,因为它是为水平扩展而构建的。
但是,您必须记住的是,所有重要的“查询”实际上都来自“批处理作业输出”。
例如,Gilt Groupe创建了一个名为Hummingbird的系统,用于在其网站上进行实时分析。演讲here。它们基本上是以紧密的间隔(15分钟)基于收集的性能数据动态呈现页面。
在他们的情况下,他们有一个简单的周期:将数据发布到mongo - &gt; run map-reduce - &gt;将数据推送到网络以进行实时优化 - &gt;冲洗/重复。
这实际上非常接近你可能想做的事情。但是,这里有一些限制:
另一方面,您将使用SQL遇到这些问题的不同变体。
当然这里有一些好处:
正如其他人所说,你将失去对ETL和其他常用分析工具的访问权限。你绝对可以编写很多自己的分析工具。
答案 2 :(得分:1)
这是我对这个想法的保留 - 我将公开承认我对文档数据库的工作知识很薄弱。我假设您希望存储所有这些数据,以便您可以对其执行一些聚合或基于趋势的分析。
如果使用基于文档的数据库作为源,则每行数据的加载和操作(CRUD操作)非常简单。非常高效,非常直接,基本上很可爱。
很糟糕的是,提取这些数据的选项非常少(如果有的话),并将其塞进一个更适合统计分析的结构,例如:柱状数据库或多维数据集。如果将其加载到基本关系数据库中,则有许多工具,包括商业和开源,例如pentaho,可以很好地适应ETL和分析。
最终,您要记住的是,世界上每家金融公司都有股票分析/自动交易应用程序;他们只是导致美国股市大幅下挫并且他们不是玩具。 :)
答案 3 :(得分:0)
在执行分析合理地超过单个系统容量的情况下,诸如键值或文档数据库之类的简单数据存储也是有益的。 (或者它需要一个特别大的机器来处理负载。)在这些情况下,使用简单的存储是有意义的,因为分析需要批处理。我个人会寻找一种水平扩展处理方法来提出所需的单位/时间分析。
我会调查使用基于Hadoop构建的东西进行并行处理。要么在Java / C ++中使用本地框架,要么在更高级别的抽象中使用:Pig,Wukong,通过流接口的二进制可执行文件等。如果感兴趣的话,亚马逊提供相当便宜的处理时间和存储。 (我没有个人经验,但很多人为他们的业务做了并依赖它。)