【问题标题】:How to design a database to store OHLC time-series of different resolutions?如何设计一个数据库来存储不同分辨率的 OHLC 时间序列?
【发布时间】:2017-11-22 04:37:04
【问题描述】:

如果我可能对股票有不同的频率,那么存储各种股票的 OHLC 数据的最佳方式是什么?例如,我可能有:

* OHLC for 5-minute bars for APPL
* OHLC for 1-minute bars for APPL
* OHLC for 5-minute bars for IBM

我正在考虑将所有内容存储在同一个表中,然后添加一个指定分辨率的列,因此它可能看起来像这样:

symbol, date,       time, resolution, open,  high,   low,   close
AAPL,   2017-06-19, 9:30, 5 min,      99.12, 102.52, 94.22, 98.34   
AAPL,   2017-06-19, 9:30, 1 min,      99.12, 100.11, 99.01, 100.34
IBM,    2017-06-19, 9:30, 5 min,      40.15, 45.78,  39.18, 44.22

这样还好吗?

【问题讨论】:

    标签: sql time-series google-bigquery database-schema


    【解决方案1】:

    看起来不错。作为您的另一种可能性,您还可以将每个新分辨率存储为ARRAY(重复字段)内的单独STRUCT(记录),如下所示:

    WITH data AS(
      select 'APPL' as symbol, ARRAY<STRUCT<date string, time string, resolution INT64, open FLOAT64, high FLOAT64, low FLOAT64, close FLOAT64>> [STRUCT('2017-06-19' as date, '9:30' as time, 5 as resolution, 99.12 as open, 102.52 as high, 94.22 as low, 98.32 as close), STRUCT('2017-06-19' as date, '9:30' as time, 1 as resolution, 99.12 as open, 100.11 as high, 99.01 as low, 100.34 as close)] stock union all
      select 'IBM' as symbol, ARRAY<STRUCT<date string, time string, resolution INT64, open FLOAT64, high FLOAT64, low FLOAT64, close FLOAT64>> [STRUCT('2017-06-19' as date, '9:30' as time, 5 as resolution, 40.15 as open, 45.78 as high, 39.18 as low, 44.22 as close)]
    )
    
    SELECT * FROM data
    

    结果:

    请注意,当您存储新的分辨率值时,它会在为每个股票定义的 ARRAY 中添加另一行。

    您还可以像这样在日期级别聚合 ARRAYS:

    WITH data AS(
      select 'APPL' as symbol, STRUCT<date string, time string, hit ARRAY<STRUCT<resolution INT64, open FLOAT64, high FLOAT64, low FLOAT64, close FLOAT64>>> ('2017-06-19', '9:30', [STRUCT(1 as resolution, 99.12 as open, 102.52 as high, 94.22 as low, 98.32 as close), STRUCT(5 as resolution, 99.12 as open, 100.11 as high, 99.01 as low, 100.34 as close)]) stock union all
      select 'IBM' as symbol, STRUCT<date string, time string, hit ARRAY<STRUCT<resolution INT64, open FLOAT64, high FLOAT64, low FLOAT64, close FLOAT64>>> ('2017-06-19', '9:30', [STRUCT(1 as resolution, 40.15 as open, 45.78 as high, 39.18 as low, 44.22 as close)])
    )
    SELECT * FROM data
    

    结果:

    这种类型的架构可能会给您带来一些优势,具体取决于您正在处理的数据量,例如更便宜、更有效的存储以及更快的查询(有时您可能会发现返回 Resources Exceeded 错误的查询和它的工作原理是明智地使用STRUCTS and ARRAYS)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-10
      • 2014-07-05
      • 2014-02-16
      • 2013-11-14
      • 2011-11-16
      • 2011-01-02
      • 2021-09-07
      • 1970-01-01
      相关资源
      最近更新 更多