DB2 - 如何填补盘中股票数据中的空白

DB2 - How to fill gaps in Intraday Stock Data

我有一些旧的盘中 1m 柱数据,我正在尝试为我正在使用的应用程序清理这些数据,每天需要 390 个 1m 柱刻度(上午 9:30 - 16:00pm)盘中数据, 每只股票。不幸的是,数据越旧,出现的缺口就越大,因为数据仅包含该分钟内实际交易的数据。即:无交易 = 无交易量 = 无数据。

PCT_CHANGE 由标的 (CLOSE-OPEN)/OPEN*100 计算得出,未显示,反映当前 TICK 从 OPEN 到 CLOSE 的百分比变化。

示例:

TICK        DATA_TICK  PCT_CHANGE  VOLUME
9:30:00 AM          
9:31:00 AM          
9:32:00 AM          
9:33:00 AM          
9:34:00 AM          
9:35:00 AM  9:35:00 AM  0       15500
9:36:00 AM  9:36:00 AM  0.06    1500
9:37:00 AM          
9:38:00 AM  9:38:00 AM  0.24    4000
9:39:00 AM  9:39:00 AM  0.2     4500
9:40:00 AM  9:40:00 AM  0.34    500
9:41:00 AM          
9:42:00 AM  9:42:00 AM  0.34    500
9:43:00 AM          
9:44:00 AM          
9:45:00 AM          
9:46:00 AM          
9:47:00 AM  9:47:00 AM  0.13    2000
9:48:00 AM  9:48:00 AM  0.13    1000
9:49:00 AM          
9:50:00 AM  9:50:00 AM  0.22    500
9:51:00 AM  9:51:00 AM  0.24    2500
9:52:00 AM  9:52:00 AM  0.24    1000
9:53:00 AM  9:53:00 AM  0.24    2000
9:54:00 AM          
9:55:00 AM  9:55:00 AM  0.13    500
9:56:00 AM          
9:57:00 AM  9:57:00 AM  0.13    2000
9:58:00 AM  9:58:00 AM  0.24    2000
9:59:00 AM  9:59:00 AM  0.24    500
10:00:00 AM 10:00:00 AM 0.13    500

所以我想做的是用前一个现有行的值填充缺失的 1m 间隔 PCT_CHANGE 值,在开始分钟的情况下,然后是 0(零)。所有插入值的音量将为 0。

例子

9:41AM pct_change 将 = 0.34,音量 = 0

9:43-46AM pct_change 全部 = 0.34,音量 = 0。

DB2 中是否有一些巧妙的特性、SQL 语句、函数等,使我能够将这些包含在存储过程中,以 运行 超过 10 年价值的多只股票数据?我已经尝试过,但我对 SQL 的了解非常有限,但我能做的最好的就是填补 1 分钟的空白。如果缺少多分钟,我会得到糟糕的结果。

如果有好心人能给我一个例子说明如何实现这一点,我将不胜感激。

非常感谢。

你可以这样做:

select 
  t.tick, t.data_tick,
  coalesce(t.pct_change, l.pct_change, 0) as pct_change,
  coalesce(t.volume, l.volume, 0) as volume
from t
left join (
  select t.*, (
    select tick from t a where data_tick <= t.tick order by data_tick desc 
    fetch first 1 rows only
  ) as related_tick
  from t
) r on r.tick = t.tick
left join t l on l.tick = r.related_tick
order by tick

结果(为测试目的修改数据):

 TICK      DATA_TICK  PCT_CHANGE  VOLUME 
 --------- ---------- ----------- ------ 
 09:39:00             0.00        0      
 09:40:00  09:40:00   0.34        500    
 09:41:00             0.34        500    
 09:42:00  09:42:00   0.35        600    
 09:43:00             0.35        600    
 09:44:00             0.35        600    
 09:45:00             0.35        600    
 09:46:00             0.35        600    
 09:47:00  09:47:00   0.13        2000   

请参阅 db<>fiddle 中的 运行 示例。