kdb双向联接(合并买/卖表)

时间:2015-06-15 14:00:32

标签: kdb

我使用了http://code.kx.com/svn/kx/kdb+/tick/tba.q中定义的架构:

贸易:出价:问:([]时间:timespan$();sym:符号$();价格:float$();size: INT $())

我想加入竞价并将表格放入单一报价表中,但无法弄清楚如何做到这一点。 aj []只使用表中的一个时间列,但我需要两个时间列组合在一起。

E.g。

出价

time     size price
----------------
10:00:00 10 0.05
10:00:03 10 0.06
10:00:06 20 0.06

time     size price
----------------
10:00:00 10 0.06
10:00:02 10 0.07
10:00:04 20 0.07

结果应为:

time      bs bprc  as aprc
--------------------------
10:00:00  10 0.05  10 0.06
10:00:02  10 0.05  10 0.07
10:00:03  10 0.06  10 0.07
10:00:04  10 0.06  20 0.07
10:00:06  20 0.06  20 0.07

是否有人使用此tba架构?它更紧凑,显着节省了磁盘空间,但我发现它在查询方面并不是很灵活。如果我想每天获得平均点差,那我该如何去做呢?

谢谢!

2 个答案:

答案 0 :(得分:3)

您不需要aj来实现您想要的效果。 uj结合fills将完成这项工作:

b: 1!`time`sym`bs`bprc xcol bid / convert bid to a keyed table
a: 1!`time`sym`as`aprc xcol ask / convert ask to a keyed table
ba: `time xasc b uj a / join them and sort by time
/ forward fill the missing prices
select time, sym, fills bs, fills bprc, fills as, fills aprc from ba

希望这有帮助。

<强>更新即可。如果您需要支持多个符号,那么您应该按{user} 3930建议的time sym进行分组:

b: 2!`time`sym`bs`bprc xcol bid / convert bid to a keyed table
a: 2!`time`sym`as`aprc xcol ask / convert ask to a keyed table

然后:

ba: `time xasc b uj a / no change here
ungroup select time, sym, fills bs, fills bprc, fills as, fills aprc by sym from ba

我们的想法是,您只将fills应用于每个组中的值,以防止价格在符号边界外泄漏。

答案 1 :(得分:1)

您可以使用联合联接来完成此任务。

q)bid
time                 sym  bsize bprice
--------------------------------------
0D10:00:00.000000000 AAPL 10    0.05
0D10:00:03.000000000 AAPL 10    0.06
0D10:00:06.000000000 AAPL 10    0.06

q)ask
time                 sym  asize aprice
--------------------------------------
0D10:00:00.000000000 AAPL 10    0.06
0D10:00:02.000000000 AAPL 10    0.07
0D10:00:04.000000000 AAPL 10    0.07

q)0!update bsize:fills bsize, bprice:fills bprice, asize:fills asize, aprice:fills aprice from `time xasc (2!bid) uj (2!ask)

time                 sym  bsize bprice asize aprice
---------------------------------------------------
0D10:00:00.000000000 AAPL 10    0.05   10    0.06
0D10:00:02.000000000 AAPL 10    0.05   10    0.07
0D10:00:03.000000000 AAPL 10    0.06   10    0.07
0D10:00:04.000000000 AAPL 10    0.06   10    0.07
0D10:00:06.000000000 AAPL 10    0.06   10    0.07 

<强>更新

因为uj在时间和sym键入的表上,所以联合连接也与sym列一起工作