其次填写Q KDB +的数据

时间:2015-01-20 18:31:52

标签: loops kdb q-lang

我有一个带有一些高频股价数据的csv文件,我想从表中获得第二个价格数据。

在每个文件中,都有名为datetimesymbolpricevolume等的列。

有几秒没有交易,因此在几秒钟内缺少数据。

我想知道如何填写Q中的缺失数据以便从9:30到16:00完整获取第二个数据?如果缺少价格,只需使用最近的价格作为其价格。

我正在考虑写一些循环,但我不知道该怎么做。

2 个答案:

答案 0 :(得分:1)

简化一点,我假设您的数据集中有一些随机时间戳,如下所示:

time                            price
--------------------------------------
2015.01.20D22:42:34.776607000   7
2015.01.20D22:42:34.886607000   3
2015.01.20D22:42:36.776607000   4
2015.01.20D22:42:37.776607000   8
2015.01.20D22:42:37.886607000   7
2015.01.20D22:42:39.776607000   9
2015.01.20D22:42:40.776607000   4
2015.01.20D22:42:41.776607000   9

所以那里有一些缺失的秒。我打算打电话给这张桌子t。因此,如果您执行秒级类型的查询,显然缺少的秒数仍然缺失:

q)select max price by time.second from t
second  | price
--------| -----
22:42:34| 7
22:42:36| 4
22:42:37| 8
22:42:39| 9
22:42:40| 4
22:42:41| 9

要获得缺失的秒数,您必须加入空值列表。在这种情况下,我们知道数据从22:42:34到22:42:41,但实际上你必须找到最小/最大时间并使用它来创建一个临时的" null&# 34;要加入的表:

q)([] second:22:42:34 + til 1+`int$22:42:41-22:42:34 ; price:(1+`int$22:42:41-22:42:34)#0N)
second   price
--------------
22:42:34
22:42:35
22:42:36
22:42:37
22:42:38
22:42:39
22:42:40
22:42:41

然后离开加入:

q)([] second:22:42:34 + til 1+`int$22:42:41-22:42:34 ; price:(1+`int$22:42:41-22:42:34)#0N) lj select max price by time.second from t
second   price
--------------
22:42:34 7
22:42:35
22:42:36 4
22:42:37 8
22:42:38
22:42:39 9
22:42:40 4
22:42:41 9

您可以使用fills或之后您最喜欢的填充启发式。

q)fills `second xasc asc ([] second:22:42:34 + til 1+`int$22:42:41-22:42:34 ; price:(1+`int$22:42:41-22:42:34)#0N) lj select max price by time.second from t
second   price
--------------
22:42:34 7
22:42:35 7
22:42:36 4
22:42:37 8
22:42:38 8
22:42:39 9
22:42:40 4
22:42:41 9

(请注意second之前fills上的排序!)

顺便说一下,对于较大的表,这将比循环更快 。 q中的循环通常是一个坏主意。

修改

你也可以使用逗号连接,两个表都需要在second列上键入

t,t1

(其中t1是在second上键入的空填充表)

我还没有测试过它,但我怀疑它会比lj版本略快一些。

答案 1 :(得分:0)

使用aj,这是KDB最强大的功能之一:

q)data
sym  time     price     size
----------------------------
MS   10:24:04 93.35974  8
MS   10:10:47 4.586986  1
APPL 10:50:23 0.7831685 1
GOOG 10:19:52 49.17305  0

内存表需要symtime排序,并且将g#属性应用于sym

q)data:update `g#sym from `sym`time xasc data
q)meta trade
c    | t f a
-----| -----
sym  | s   g
time | v
price| f
size | j

创建每个符号每秒间隔的rack表:

q)rack: `sym`time xasc (select distinct sym from data) cross   ([] time:{x[0]+til `int$x[1]-x[0]}(min;max)@\:data`time)

使用aj合并数据:

q)aj[`sym`time; rack; data]