我正在尝试创建一个购买 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
,我们想要 3
。 max
有效。 所以我想你想要这个:
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/