Пытаясь создать скользящий период cummax - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь создать функцию, которая покупает максимум 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

Заранее спасибо

1 Ответ

0 голосов
/ 13 ноября 2018

Ты рядом.Поймите, что rollapply (и другие) в этом случае ожидают одно число назад, но cummax возвращает вектор.Давайте проследим это:

  1. При использовании rollapply(..., partial=TRUE) первый проход - это только первый номер: 1
  2. Второй вызов, первые два числа.Вы ожидаете 2 (так что он добавится к 1 предыдущего шага), но посмотрите на cummax(1:2): он имеет длину 2. Заключение из этого шага: функции cumнаивны в том, что они относительно монотонны: они всегда учитывают все, вплоть до текущего номера, когда выполняют свою логику / преобразование.
  3. Третий вызов, наше первое посещение полного окна (в данном случае): учитывая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 и 1-2, прежде чем перейти к первому полномуокно 1-3.Со страницы справки:

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
...