如何使用 "closest" 时间戳而不是 "asof" 时间戳连接两个 KDB 表?

How to join two KDB tables using the "closest" timestamp instead of "asof" timestamp?

我正在尝试以与“截至”连接非常相似的方式连接两个 table,除了不是选择具有最后一个时间戳的行来连接(假设它们按时间排序订单),我想加入最接近的时间戳。例如:

q)t: ([]time:10:00:06 10:00:03 10:00:04;sym:`msft`ibm`ge;qty:100 200 150)
q)t
time     sym  qty
-----------------
10:00:06 msft 100
10:00:03 ibm  200
10:00:04 ge   150

q)q: ([]time:10:00:00 10:00:00 10:00:02 10:00:07 10:02:00;sym:`ibm`msft`msft`msft`ibm;px:100 99 101 102 98 )
q)q
time     sym  px
-----------------
10:00:00 ibm  100
10:00:00 msft 99
10:00:02 msft 101
10:00:07 msft 102
10:02:00 ibm  98

加入标准:

q)aj[`sym`time;t;q]
time     sym  qty px
---------------------
10:00:06 msft 100 101 //10:00:02 is closest timestamp that is not greater than 10:00:06, so that px is chosen
10:00:03 ibm  200 100  
10:00:04 ge   150

问题是,对于 msft,由于 10:00:07 比 10:00:02 更接近原始的微软时间戳,即使它大于原始的 msft 时间戳,我理想的是:

q)closest_join[`sym`time;t;q]
time     sym  qty px
---------------------
10:00:06 msft 100 102  //10:00:07 is +1second, 10:00:02 is -6second, so I want it to use 10:00:07
10:00:03 ibm  200 100
10:00:04 ge   150

你会怎么做?请注意,它必须适用于源代码中的多个“msft”行 table 类似于 aj 的工作方式。

我认为没有任何干净的方法可以做到这一点,但您可以使用以下方法来做到这一点:

  1. 创建一个使用 binr 的自定义 aj(右边的 bin)
/for kdb v4.0
k).Q.ajf0r:{[f;g;x;y;z]x,:();z:0!z;d:$[g;x_z;z];g:(:;^)f;f:(,;^)f;$[&/j:-1<i:(x#z)binr x#y;f'[y;d i];+.[+.Q.ff[y]d;(!+d;j);g;.+d i j:&j]]}
k)ajr:{.Q.ft[.Q.ajf0r[0;1;x;;z]]y}

/for kdb v3.5
k)ajr:{.Q.ft[{d:x_z;$[&/j:-1<i:(x#z)binr x#y;y,'d i;+.[+.Q.ff[y]d;(!+d;j);:;.+d i j:&j]]}[x,();;0!z]]y}
  1. 做一个标准的aj
q)show a:aj[`sym`time;t;update qtime:time from q]
time     sym  qty px  qtime
------------------------------
10:00:06 msft 100 101 10:00:02
10:00:03 ibm  200 100 10:00:00
10:00:04 ge   150
  1. 做自定义 aj
q)show b:ajr[`sym`time;t;update qtime:time from q]
time     sym  qty px  qtime
------------------------------
10:00:06 msft 100 102 10:00:07
10:00:03 ibm  200 98  10:02:00
10:00:04 ge   150
  1. 根据哪个时间差较小将两者混合
q){x,y(>). abs y[`time]-y`qtime}/[0#a;flip(a;b)]
time     sym  qty px  qtime
------------------------------
10:00:06 msft 100 102 10:00:07
10:00:03 ibm  200 100 10:00:00
10:00:04 ge   150

但是请注意,在 quant/finance 中将“未来”报价加入交易通常不是一个好主意(又名前瞻性偏差)