我正在创建一个用于存储历史股票数据的数据库模式.我目前有一个架构,如下所示.
我的要求是为多个股票代码存储"条形数据"(日期,开盘价,最高价,最低价,收盘价).每个符号也可能有多个时间范围(例如Google Weekly bars和Google Daily bar).
我当前的架构将大部分数据放在OHLCV表中.我远非数据库专家,如果这太天真,我很好奇.建设性的投入非常受欢迎.
CREATE TABLE Exchange (exchange TEXT UNIQUE NOT NULL); CREATE TABLE Symbol (symbol TEXT UNIQUE NOT NULL, exchangeID INTEGER NOT NULL); CREATE TABLE Timeframe (timeframe TEXT NOT NULL, symbolID INTEGER NOT NULL); CREATE TABLE OHLCV (date TEXT NOT NULL CHECK (date LIKE '____-__-__ __:__:__'), open REAL NOT NULL, high REAL NOT NULL, low REAL NOT NULL, close REAL NOT NULL, volume INTEGER NOT NULL, timeframeID INTEGER NOT NULL);
这意味着我的查询当前类似于:查找给定符号/时间范围的timeframeID,然后在timeframeID匹配的OHLCV表上执行选择.
我们试图找到一个适当的数据库结构,用于长时间存储大量数据.以下解决方案是超过6年经验的结果.它现在可以完美地进行定量分析.
我们已经能够在SQL Server中使用此方案存储数百GB的日内和日常数据:
Symbol - char 6 Date - date Time - time Open - decimal 18, 4 High - decimal 18, 4 Low - decimal 18, 4 Close - decimal 18, 4 Volume - int
所有交易工具都存储在一个表中.我们还在符号,日期和时间列上有一个聚簇索引.
对于每日数据,我们有一个单独的表,不使用时间列.卷数据类型也是bigint而不是int.
表现?我们可以在几毫秒内从服务器获取数据.请记住,数据库大小几乎是1太字节.
我们从Kibot网站购买了所有历史市场数据:http://www.kibot.com/
好吧,从积极的方面来说,你首先要求输入是有道理的.这使您领先于不熟悉数据库设计的90%的人.
没有明确的外键关系.我把它与之timeframeID
相关symbolID
?
目前还不清楚你如何能够以这种方式找到任何东西.阅读上述外键可以轻松提高您的理解力.
您将时间范围数据存储为TEXT
.从性能和可用性的角度来看,这是一个禁忌.
您当前的方案无法适应最终会发生的股票拆分.最好在价格数据表和符号之间再添一个间接层
open
,high
,low
,close
价格更好存储为小数或货币类型,或者,优选地,作为INTEGER
与单独的字段INTEGER
字段,其存储所述除数,作为最小价格分数(美分,一元等的八分)允许每交换而变化.
由于您支持多个交易,因此您应支持多种货币.
如果所有这些看起来都不具有"建设性",我很抱歉,特别是因为我现在太困了,建议一个更有用的选择.我希望上面的内容足以让你顺利上路.