【问题标题】:asof (aj) join strictly less than in KDB/Qasof (aj) join 严格小于 KDB/Q
【发布时间】:2019-07-06 11:34:03
【问题描述】:

我有一个报价表和交易表,并想列出报价表并加入交易表,匹配的时间戳严格小于交易的时间戳。

例如:

    q:([]time:10:00:00 10:01:00 10:01:00 10:01:02;sym:`ibm`ibm`ibm`ibm;qty:100 200 300 400)
    t:([]time:10:01:00 10:01:00 10:01:02;sym:`ibm`ibm`ibm;px:10 20 25)
    aj[`time;q;t]

返回

+------------+-----+-----+----+
|     time   | sym | qty | px |
+------------+-----+-----+----+
|   10:00:00 | ibm | 100 |    |
|   10:01:00 | ibm | 200 | 20 |
|   10:01:00 | ibm | 300 | 20 |
|   10:01:02 | ibm | 400 | 25 |
+------------+-----+-----+----+

但我试图得到如下结果:

+------------+-----+-----+----+
|     time   | sym | qty | px |
+------------+-----+-----+----+
|   10:00:00 | ibm | 100 |    |
|   10:01:00 | ibm | 100 | 10 |
|   10:01:00 | ibm | 100 | 20 |
|   10:01:02 | ibm | 300 | 25 |
+------------+-----+-----+----+

是否有一个连接函数可以根据严格小于时间的时间戳进行匹配,而不是最多并包含?

【问题讨论】:

  • 通常,此连接以aj[`time;t;q] 的形式完成,如wiki 上的此示例所示,因为您正在查看交易前的报价。尽管在这种情况下,3 笔交易的输出只有 3 行。
  • 它并非严格小于的事实是因为 aj 基于 binbin 小于或等于 - 请参阅 code.kx.com/q/ref/search/#bin-binr 。所提出的时移技术将起作用,尽管这会对性能产生影响,尤其是在磁盘连接的情况下。或许可以通过修改标准的aj来制作自己的aj函数(用一些自定义逻辑替换bin

标签: kdb


【解决方案1】:

我认为如果您对aj[`time;q;t] 进行一些变体,那么您将无法修改qty 列,因为表t 不包含它。相反,您可能需要使用更“传统”的aj[`time;t;q]

q)@[;`time;+;00:00:01]aj[`time;@[t;`time;-;00:00:01];q]
time     sym px qty
-------------------
10:01:00 ibm 10 100
10:01:00 ibm 20 100
10:01:02 ibm 25 300

这会改变时间以避免匹配它们相等但不包含您在开头的每个报价的行。

我认为,如果您希望将交易加入报价而不是像我所做的那样将报价加入交易,您可能需要考虑一些方法来区分在您的示例中同时发生的 2 笔交易。一种方法可能是使用它们到达的顺序,即将第一个报价与第一个交易相匹配。

【讨论】:

    【解决方案2】:

    我认为的一种“黑客”方式是将所有交易转移到最小时间单位做 aj,然后再转移

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多