如何使用“最近”时间戳而不是“asof”时间戳连接两个KDB表?
我试图以与“as of”连接非常相似的方式连接两个表,除了不是选择具有最后一个时间戳的行进行连接(假设它们按时间顺序排序),我想加入最接近的时间戳。例如:
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”行,类似于 aj 的工作方式。
回答
我认为没有任何干净的方法可以做到这一点,但您可以使用以下方法:
- 创建一个使用的自定义 aj
binr(右侧的 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}
- 做一个标准的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
- 做自定义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
- 根据哪个时间间隔较小来混合两者
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
但是请注意,将“未来”报价加入交易通常是量化/金融领域的一个坏主意(又名前瞻偏差)