我如何在 KDB 中进行移动总和?

How do I do a moving sum forwards in KDB?

我想在我的查询中总结接下来的 5 天 returns (target)。

它的工作方式是:

 select date, zR, target: -5 xprev (5 msum zR) from a where sym=`AAPL

我不明白的是为什么 -5 msum zR 不起作用:

 select date, zR, target: -5 msum zR from a where sym=`AAPL

有没有更优雅的'KDB'写法?

x#y 创建一个长度为 x 的列表,由来自 y 的元素组成。因此,在您的第二个示例中,您有一个 datezR 列,其长度与 a 相同,但您的 target 列的长度为 5。由于表需要具有列相同的长度,在这种情况下你会看到一个错误。

我认为您目前的做法没有任何问题,您的查询会在每 5 天的周期开始时让您知道 target。 你绝对可以去掉 5 msum zR 周围的括号,因为 kdb 不关心这些(评估严格从右到左)。

由于您正在移动数组中的元素,因此您将留下空值,因此您需要找到一种方法来填充这些元素(如果这是您想要做的)。

我同意 Sean 的观点,您采用的方法没有任何问题。遗憾的是,-5 msum zR 无法正常工作,因为它有点直观,但 Kx 尚未将该功能添加到 msum 中。你可以随时向他们推荐。

另一种方法是使用 next 移位然后求和:

q)t:([]date:.z.D+til 10;sym:`AAPL;zR:til 10)
q)update target:sum 1_5 next\zR by sym from t
date       sym  zR target
-------------------------
2021.10.05 AAPL 0  15
2021.10.06 AAPL 1  20
2021.10.07 AAPL 2  25
2021.10.08 AAPL 3  30
2021.10.09 AAPL 4  35
2021.10.10 AAPL 5
2021.10.11 AAPL 6
2021.10.12 AAPL 7
2021.10.13 AAPL 8
2021.10.14 AAPL 9