这些数据实际上并不具备关系性,将被存储在几个庞大的表中。我还在考虑能否按分钟/小时/日/周/月等统计数据的总和、最小值和最大值,以便进行更快速的计算。
示例数据: 500个符号* 60分钟* 60秒* 300天... (每条记录我们存储:日期、开盘价、最高价、最低价、收盘价、成交量、持仓量-所有十进制/浮点数)
那么你们认为呢?
自2010年此问题被提出以来,已经发布或开发了多个数据库引擎,其中包括专门处理时间序列(例如股票tick数据)的功能:
对于MongoDB或其他文档导向的数据库,如果你追求性能,则建议 扭曲数据模型,将ticks组织成以秒为键的对象(或每分钟一个对象,每个分钟另一个对象有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
)。
与文档导向数据库相比,时序数据库更适合存储和查询大量的股票交易数据。
另一方面,您将遇到SQL的不同变体问题。
当然,这里有一些好处:
正如其他人所提到的,您将失去访问ETL和其他常见分析工具的权限。您肯定需要编写很多自己的分析工具。
这里是我对这个想法的保留意见 - 我要公开承认,我对文档数据库的工作知识很弱。我假设您希望将所有这些数据存储起来,以便可以对其执行一些聚合或基于趋势的分析。
如果您使用基于文档的数据库作为源,则每行数据的加载和操作(CRUD操作)非常简单。非常高效,非常直接,基本上很好。
糟糕的是,几乎没有任何选项可以提取此数据并将其压缩到更适合统计分析的结构中,例如列式数据库或立方体。如果将其加载到基本关系数据库中,则有许多工具,包括商业和开源工具,例如pentaho,可以很好地容纳ETL和分析。
但最终,您要记住的是,世界上每家金融公司都有股票分析/自动交易应用程序;他们刚刚引起了美国股市的重大动荡,它们不是玩具。 :)
在进行分析超出单个系统容量的情况下,使用简单的数据存储,如键值或文档数据库也是有益的。(否则需要一个异常大的机器来处理负载。)在这些情况下,使用简单的存储是有意义的,因为分析需要批处理。我个人会考虑找到一种横向扩展的处理方法来满足单位/时间分析的要求。
我会研究使用基于Hadoop的并行处理。可以原生地在Java/C++中使用该框架,或者使用一些更高级别的抽象:Pig、Wukong、通过流接口的二进制可执行文件等。如果感兴趣,亚马逊提供了相对便宜的处理时间和存储空间。(我没有个人经验,但许多人依赖它来开展业务。)