【发布时间】:2020-11-27 17:17:34
【问题描述】:
我遇到了丢失数据的问题。 所以我有一个这样创建的退货表:
returns:update logret:log ret from update ret:{0.0, 1_deltas x} mid by sym from spots;
看起来像这样:
meta returns
c | t f a
------| -----
date | d
time | p
sym | s
mid | f
ret | f
logret| f
我以这种方式旋转它:
rettbl:0!exec (raze `$raze ( string (distinct sym)),\:/:("_",/:string `mid`ret`logret))!(mid, ret, logret) by time:time from returns;
这样可以在很小的时间范围内工作,但是当我扩展它时会失败并显示“类型:不匹配的类型”
我认为问题在于我对returns 表中的所有 sym 没有相同的观察结果,如 select count time by sym from returns
按符号给我一个不同的计数。
所以我的问题是:你将如何填补我桌子上所有缺失的mid returns?
为了使其快速而肮脏,我正在考虑对两个`时间之间的缺失点进行线性插值...
任何提示、链接等......将不胜感激。
编辑:
我无法共享数据,但这应该可以重现问题:
mid1: 1.2 + ({rand 1.0} each til 10) %100
mid2: 0.8 + ({rand 1.0} each til 10) %100
mid3: 104 + ({rand 1.0} each til 10) %100
sym1:{`$"EUR/USD"} each til 10
sym2:{`$"GBP/USD"} each til 10
sym3:{`$"USD/JPY"} each til 10
time1:2020.07.01D00:00:00.000000000 + 1D00:00:00 * til 10
/time2:2020.07.01D00:00:00.000000000 + 1D00:00:00 * til 10
time2:(2020.07.01D00:00:00.000000000 + 1D00:00:00 * til 3) , (2020.07.06D00:00:00.000000000 + 1D00:00:00 * til 3) , (2020.07.10D00:00:00.000000000 + 1D00:00:00 * til 4)
time3:2020.07.01D00:00:00.000000000 + 1D00:00:00 * til 10
spots:([] sym:sym1,sym2,sym3; time:time1,time2,time3; mid:mid1,mid2,mid3)
spots:update date:"d"$time from spots
returns:update logret:log ret from update ret:{0.0, 1_deltas x} mid by sym from spots;
rettbl:0!exec (raze `$raze ( string (distinct sym)),\:/:("_",/:string `mid`ret`logret))!(mid, ret, logret) by time:time from returns;
请注意 time2 的定义。
根据所需的输出,如果您将 time2 定义替换为我注释掉的定义,您将看到。
根据解决方案,我怀疑添加到表中会返回丢失的时间,以便所有 sym 相同的时间列表相同将解决问题,即值 select time by sym from returns 应该相同,并且快速脏解决方法是使用周围中间的线性插值添加缺失的中间。
【问题讨论】:
-
您能提供一个样品退货表吗?
-
也是一个预期的输出,以便了解您想要什么
-
嗨,垫子。我尽力创建一个表来重现该问题。我希望我清楚问题的原因(sym 的时间不一样)以及我试图解决的问题:填充退货表,以便退货表的所有时间都存在所有 sym,缺失的中间值将被线性插值。我相信支点会在这些条件下发挥作用。
标签: missing-data kdb linear-interpolation