1

跟进这个问题...... KDB:在某些事件的“左右”时间选择数据

考虑一个巨大的市场数据表 T。我对 Status=`SSS 的行特别感兴趣。

但是,除了 (select from T where Status=`SSS) 给出的行之外,我还想选择该事件周围某个短时间间隔内的记录(与前面的问题相反,我们选择了一个围绕事件的固定数量的记录)。请注意,在某些情况下,这些间隔可能会重叠。什么是有效的方法来做到这一点?

4

2 回答 2

1

我们有一个想法可能对您有所帮助:

q)n:10000000;
q)T:([]time:asc n?1D0;sym:n?3;price:n?100f;status:@[n?`3;-100000?n;:;`SSS])
q)f:{[t;x;d]t where 0<sums sum @[c#0;;+;]'[(-1+c:count t)&t[`time]binr/:x+/:-1 1*d;1 -1]}
q)f[T;exec time from T where status=`SSS;0D00:00:00.01]
time                 sym price     status
-----------------------------------------
0D00:00:01.169838756 2   77.1118   lbh
0D00:00:01.175813376 2   24.94157  emk
0D00:00:01.176316291 2   68.49994  SSS
0D00:00:01.180037856 1   81.54316  hhi
0D00:00:01.183518022 1   0.6516971 hni
0D00:00:01.291926205 2   51.94651  kjf
0D00:00:01.300173997 0   14.67675  SSS
0D00:00:01.309709250 1   82.77418  oji

这里的想法是提取事件时间并用于binr查找您需要的所有时间窗口:

t1  t2  t3  t4  t5  t6  t7  t8  t9  t10
`a  `b  `c  `S  `d  `e  `S  `f  `g  `h

假设 t3, t5 和 t6,t8 符合时间窗口,我们在它们周围放置一个标记

t1  t2  t3  t4  t5  t6  t7  t8  t9  t10
`a  `b  `c  `S  `d  `e  `S  `f  `g  `h
0   0   1   0   0   1   0   0   0   0
0   0   0   0   0   -1  0   0   -1  0

sums sum将突出显示您需要的所有记录:

t1  t2  t3  t4  t5  t6  t7  t8  t9  t10
`a  `b  `c  `S  `d  `e  `S  `f  `g  `h
0   0   1   1   1   1   1   1   0   0

那么剩下的就是直截了当......

于 2014-08-21T08:49:08.580 回答
0

另一种方法是使用窗口连接,wj1它允许您每次传入自定义窗口并对该窗口内的数据执行聚合。语法的简化解释是:

wj[window pairs;common columns;table 1;(table 2;(function;column))]

以下表为例:

q)trade              / simplified trade table
time  sym
---------
09:00 a
09:30 a
10:00 a
q)quote              / simplified quote table
time  sym px
------------------
09:12 a   9.420396
09:29 a   6.416515
10:07 a   8.53406

为了对每个时间quote任一侧的 20 分钟窗口内的所有价格求和,我们使用以下方法。首先为窗口创建一对开始和结束时间:tradesym

q)show window:-20 20+\:x`time
08:40 09:10 09:40
09:20 09:50 10:20

其中每个列表的长度与trade表格相同。然后将其与价格wj的聚合函数一起传递给:sumpx

q)wj1[window;`sym`time;x;(y;(sum;`px))]
time  sym px
------------------
09:00 a   9.420396
09:30 a   15.83691
10:00 a   8.53406

要调查在每个窗口中聚合的值,我们可以使用 null 函数::

q)wj1[window;`sym`time;x;(y;(::;`px))]
time  sym px
---------------------------
09:00 a   ,9.420396
09:30 a   9.420396 6.416515
10:00 a   ,8.53406

应该注意的是,wj1仅考虑窗口内的值,而wj将流行值视为窗口的一部分。

于 2017-11-28T23:49:54.153 回答