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 中的 运行 示例。
我有一些旧的盘中 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 中的 运行 示例。