我有一个包含一些高频股票价格数据的 csv 文件,我想从表中获取第二个价格数据。
在每个文件中,有名为date
、time
、symbol
、price
、volume
、 等的列。
有几秒钟没有交易,所以在几秒钟内会丢失数据。
我想知道如何填写 Q 中缺失的数据以完整获取从 9:30 到 16:00 的第二个数据?如果缺少价格,只需使用最近的价格作为该秒的价格。
我正在考虑编写一些循环,但我不知道该怎么做。
稍微简化一下,我假设您的数据集中有一些随机时间戳,如下所示:
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
版本快一点。
使用aj
which 是 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]