Попытка рассчитать EWMA на S

#r

#r

Вопрос:

Я пытаюсь использовать расчет EWMA для S amp; P500 на основе цены закрытия.
Я получил данные о ежедневном возврате и написал кодировку следующим образом:

     sigma.ewma=function(r,lambda) {
      v=r[1]^2
      for (i in 2:length(r)) {
        v[i]=lambda*v[i-1] (1-lambda)*r[i-1]^2
        }
      return(sqrt(v))
      }
  

И тогда я делаю

 sigma.ewma(r.0.94)
  

Но он продолжает показывать мне ошибку на

Ошибка в ‘[.xts'(x, i, который.i = TRUE) : нижний индекс выходит за пределы

Комментарии:

1. привет, можешь опубликовать вывод dput(head(r)) внутри своего вопроса?

2. привет! спасибо за внимание, вывод — structure(c(0.01, -0.0398913290273013, 0.00178731057409554, -0.0162019745762807, 0.0564523771975782, 0.00342466088136373), . indexTZ = «UTC», class = c(«xts», «zoo»), .indexCLASS = c(«POSIXct», «POSIXt»),tclass = «Дата», tzone = «UTC», src = «yahoo», updated = structure(1554704353.16849, class = c («POSIXct», «POSIXt»)), index = structure(c(946857600, 946944000, 947030400, 947116800, 947203200, 947462400), tzone = «UTC», tclass = c(«POSIXct», «POSIXt»)), .Dim = c (6L, 1L), .Dimnames = list(NULL, «SPY.Close»))

Ответ №1:

проблема в том, что R не знает, что v это будет вектор, потому что вы определяете v как первый компонент r квадрата. Следовательно, R считает, что v имеет только один элемент, и проблема возникает при попытке доступа v[2] внутри цикла.

Попробуйте это:

 sigma.ewma=function(r, lambda) {
  v <- r
  v[1] <- r[1]^2
  for (i in 2:length(r)) {
    v[i]=lambda*v[i-1] (1-lambda)*r[i-1]^2
  }
  return(sqrt(v))
}

sigma.ewma(r, 0.94)
            SPY.Close
2000-01-03 0.01000000
2000-01-04 0.01000000
2000-01-05 0.01376514
2000-01-06 0.01335298
2000-01-07 0.01354083
2000-01-10 0.01906738