【问题标题】:How do I do a moving sum forwards in KDB?如何在 KDB 中进行移动总和?
【发布时间】:2021-10-05 12:57:14
【问题描述】:

我想在我的查询中总结未来 5 天的回报 (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”写法?

【问题讨论】:

    标签: kdb


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我同意 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多