0

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

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

有几秒钟没有交易,所以在几秒钟内会丢失数据。

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

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

4

2 回答 2

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,但实际上您必须找到最小/最大时间并使用它来创建一个临时的“空”表来加入:

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版本快一点。

于 2015-01-20T22:54:16.973 回答
0

使用ajwhich 是 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

内存中的表需要使用应用于列的属性sym进行time排序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每个 sym 每秒间隔创建一个表:

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]
于 2018-09-22T21:58:50.753 回答