我正在尝试创建一个购买 N 期高点的函数。所以如果我有一个向量:

  x = c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)

我想把滚动的 3 期推高。这就是我希望函数的外观
 x =  c(1, 2, 3, 4, 5, 5, 5, 3, 4, 5)

我正在尝试在 xts 对象上执行此操作。
这是我尝试过的:
    rollapplyr(SPY$SPY.Adjusted, width = 40, FUN = cummax)
    rollapply(SPY$SPY.Adjusted, width = 40, FUN = "cummax")
    rapply(SPY$SPY.Adjusted, width  = 40, FUN = cummax)

我收到的错误是:
      Error in `dimnames<-.xts`(`*tmp*`, value = dn) :
      length of 'dimnames' [2] not equal to array extent

提前致谢

最佳答案

你很接近。意识到 rollapply (et al) 在这种情况下期望返回单个数字,但 cummax 返回一个向量。让我们追溯一下:

  • 使用 rollapply(..., partial=TRUE) 时,第一遍只是第一个数字:1
  • 第二次调用,前两个号码。你期待 2 (这样它会附加到上一步的 1 ),但看看 cummax(1:2) :它的长度为 2。 结论 来自这一步:cum 函数很幼稚,因为它们相对单调:它们总是考虑一切直到并包括他们执行逻辑/转换时的当前数字。
  • 第三次调用,我们第一次访问一个完整的窗口(在这种情况下):考虑到 1 2 3 ,我们想要 3max 有效。

  • 所以我想你想要这个:
    zoo::rollapplyr(x, width = 3, FUN = max, partial = TRUE)
    #  [1] 1 2 3 4 5 5 5 3 4 5
    
    partial 允许我们在继续查看 1-3 的第一个完整窗口之前查看 1 和 1-2。从帮助页面:
    partial: logical or numeric. If 'FALSE' (default) then 'FUN' is only
             applied when all indexes of the rolling window are within the
             observed time range.  If 'TRUE', then the subset of indexes
             that are in range are passed to 'FUN'.  A numeric argument to
             'partial' can be used to determin the minimal window size for
             partial computations. See below for more details.
    

    也许将 cummax 视为等效于 - 如果不是完全准确的话 - 是有帮助的
    rollapplyr(x, width = length(x), FUN = max, partial = TRUE)
    #  [1] 1 2 3 4 5 5 5 5 5 5
    cummax(x)
    #  [1] 1 2 3 4 5 5 5 5 5 5
    

    关于r - 尝试创建滚动周期 cummax,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53271579/

    10-12 22:31