在财务数据库中添加缺失行

时间:2016-10-06 14:02:48

标签: sql mariadb quantitative-finance

从今天的日期开始,我有以下数据库可以追溯到1997年。(在下面剪断)

# TIME               , OPEN      , HIGH     , LOW      , CLOSE    , VOLUME
'2016-09-22 21:00:00',  '1.30743', '1.30876', '1.29149', '1.29579', '168985'
'2016-09-20 21:00:00',  '1.29869', '1.29969', '1.29828', '1.29873', '764'
'2016-09-19 21:00:00',  '1.30275', '1.30648', '1.2947' , '1.29847', '201072'
'2016-09-18 21:00:00',  '1.29991', '1.3081' , '1.2996' , '1.30795', '142635'
'2016-09-15 21:00:00',  '1.32371', '1.32475', '1.2994' , '1.29958', '256907'
'2016-09-14 21:00:00',  '1.32318', '1.32784', '1.31791', '1.32371', '598912'
'2016-09-13 21:00:00',  '1.31879', '1.32404', '1.31381', '1.32318', '241908'

仔细观察后,我注意到缺少数据点。例如,在2016-09-21 21:00:00以上的剪辑中缺失。

2016-09-16 21:00:00和2016-09-17 21:00:00也不见了,但是我不担心这些日期,因为它们会在周末落下。

我在考虑使用丢失数据的平均值。有些数据点缺少3行,这使得这一点更加复杂。

我想也许

(a + b) / (q+1) = x

a = data point after the missing row 
b = data point before the missing row 
q = amount of data points missing 
x = increment value

结果将是

# TIME               , OPEN      , HIGH     , LOW      , CLOSE    , VOLUME
'2016-09-22 21:00:00',  '1.30743', '1.30876', '1.29149', '1.29579', '168985'
'2016-09-21 21:00:00',  '1.30306', '1.30422', '1.29488', '1.29726', '85256'
'2016-09-20 21:00:00',  '1.29869', '1.29969', '1.29828', '1.29873', '764'
'2016-09-19 21:00:00',  '1.30275', '1.30648', '1.2947' , '1.29847', '201072'
'2016-09-18 21:00:00',  '1.29991', '1.3081' , '1.2996' , '1.30795', '142635'
'2016-09-15 21:00:00',  '1.32371', '1.32475', '1.2994' , '1.29958', '256907'
'2016-09-14 21:00:00',  '1.32318', '1.32784', '1.31791', '1.32371', '598912'
'2016-09-13 21:00:00',  '1.31879', '1.32404', '1.31381', '1.32318', '241908'

是否有方法找到然后使用SQL代码将缺少的行添加到数据库中,不包括星期五和星期六?

2 个答案:

答案 0 :(得分:1)

怎么做:

  • 使用MariaDB sequence生成所有日期。
  • 添加WHERE子句以折腾Sat / Sun。
  • 执行LEFT JOIN查看缺少的日期。
  • 担心市场关闭的日期。
  • 将剩余的日期放入临时表。
  • 现在,构建一个丑陋的查询,将该临时表连接两次到原始数据中以获取两行,执行平均值并生成虚假数据。
  • 将其置于INSERT

为什么不这样做:

坦率地说,我认为这是错误的。您现在将拥有一个包含一些有效数据和一些估计数据的表。任何用户(包括你自己)都会被认为是完全有效的数据。请不要构建这样的“谎言”。

答案 1 :(得分:0)

我不认为在查询中这样做很容易。除非性能非常重要,否则我会使用过程语言:https://mariadb.com/kb/en/mariadb/create-procedure/

这可以让你分步进行。

我没有时间写出整个查询,但我的建议是首先生成一个自1997年9点以来所有日期的列表,然后将其过滤到只有不会出现的日期在列表中。然后,为每个查询原始表以生成所需的数字。然后将整个列表插入表中。