【问题标题】:kdb 2-way asof join (merge bid/ask tables)kdb 2-way asof join(合并买/卖表)
【发布时间】:2015-08-31 01:35:03
【问题描述】:

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

交易:出价:要价:([]时间:timespan$();sym:symbol$();价格:float$();size:int$())

我想将出价和询价表合并到一个单引号表中,但不知道该怎么做。 aj[] 仅使用表的时间列之一,但我需要合并两个时间列。

例如

出价

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 架构吗?它更加紧凑并且显着节省了磁盘空间,但我发现它在查询方面并不是很灵活。如果我想获得每天的平均点差,我会怎么做?

谢谢!

【问题讨论】:

  • 你试过嵌套aj吗?以aj[`sym`time;aj[`sym`time;trade;bid];ask] 为例

标签: kdb


【解决方案1】:

你不需要aj 来实现你想要的。 ujfills 结合使用即可:

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

希望这会有所帮助。

更新。如果您需要支持多个符号,那么您应该按照@user2393012 的建议按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 应用于每个组内的值,以防止价格泄漏到符号边界之外。

【讨论】:

  • 顺便说一句,您不需要对每一列进行填充。 fills select... 足够了
  • 谢谢伊戈尔。不幸的是,不适用于添加的 sym 列。当您按时间排序时,填充正在用不同的符号填充表格。我试图做“time xasc fills sym`time xasc b uj a”,但它也没有工作......
  • @derenik 那是因为您还需要输入符号和时间。这就是1! 的用途。因此,如果您想键入前两列,则为 2!
  • 我正在这样做,但价格是跨越符号边界填充的。看起来我需要像这样分别由每个 sym 执行此操作:{ where sym=x} each exec distinct sym from bid
【解决方案2】:

您可以使用联合联接来完成此操作。

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 在由 time 和 sym 键控的表上,因此联合连接也适用于 sym 列

【讨论】:

  • 我无法让它与表格中的多个符号一起使用 - 填充不断跨越符号边界,用 AAPL 填充 GOOG 价格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多