用于组织历史股票数据的数据库模式

nal*_*all 31 sql sqlite schema stocks

我正在创建一个用于存储历史股票数据的数据库模式.我目前有一个架构,如下所示.

我的要求是为多个股票代码存储"条形数据"(日期,开盘价,最高价,最低价,收盘价).每个符号也可能有多个时间范围(例如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);
Run Code Online (Sandbox Code Playgroud)

这意味着我的查询当前类似于:查找给定符号/时间范围的timeframeID,然后在timeframeID匹配的OHLCV表上执行选择.

boe*_*100 34

我们试图找到一个适当的数据库结构,用于长时间存储大量数据.以下解决方案是超过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
Run Code Online (Sandbox Code Playgroud)

所有交易工具都存储在一个表中.我们还在符号,日期和时间列上有一个聚簇索引.

对于每日数据,我们有一个单独的表,不使用时间列.卷数据类型也是bigint而不是int.

表现?我们可以在几毫秒内从服务器获取数据.请记住,数据库大小几乎是1太字节.

我们从Kibot网站购买了所有历史市场数据:http://www.kibot.com/

  • 我们每天跟踪拆分和股息,并删除然后批量插入需要更改的每个符号的数据. (3认同)
  • 那么你如何迎合股票分割? (2认同)
  • @boe100我也在考虑这个“平面”数据库模式。我有一个疑问 - 假设有 10k 个股票行情,要存储 5 年的每日数据,单个表中将有 10k * 365 * 5 = 18,250,000 行。你的数据库能处理这么大的表吗?我可以知道您正在使用什么数据库解决方案,以及您是否进行了表分区?谢谢! (2认同)
  • @boe100 你能发送数据库的完整结构吗?因为我们要考虑基本面数据、行情数据等,如果以后需要添加很多表并进行链接,如何考虑可扩展性呢?如果可能的话,您可以分享您的邮件 ID,以便我可以从您那里得到一些指导。 (2认同)

Mic*_*ngh 27

好吧,从积极的方面来说,你首先要求输入是有道理的.这使您领先于不熟悉数据库设计的90%的人.

  • 没有明确的外键关系.我把它与之timeframeID相关symbolID
  • 目前还不清楚你如何能够以这种方式找到任何东西.阅读上述外键可以轻松提高您的理解力.
  • 您将时间范围数据存储为TEXT.从性能和可用性的角度来看,这是一个禁忌.
  • 您当前的方案无法适应最终会发生的股票拆分.最好在价格数据表和符号之间再添一个间接层
  • open,high,low,close价格更好存储为小数或货币类型,或者,优选地,作为INTEGER与单独的字段INTEGER字段,其存储所述除数,作为最小价格分数(美分,一元等的八分)允许每交换而变化.
  • 由于您支持多个交易,因此您应支持多种货币.

如果所有这些看起来都不具有"建设性",我很抱歉,特别是因为我现在太困了,建议一个更有用的选择.我希望上面的内容足以让你顺利上路.

  • Nall - 在数据库中查看 INTERGER 时考虑卷,数据类型的大小是否足够? (2认同)