我如何在 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 的元素组成。因此,在您的第二个示例中,您有一个 date
和 zR
列,其长度与 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
我想在我的查询中总结接下来的 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 的元素组成。因此,在您的第二个示例中,您有一个 date
和 zR
列,其长度与 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