Получение объекта xts из функции R, основанной на матричных операциях

У меня есть следующая функция R, которая вычисляет волатильность EWMA для заданных ценных бумаг:

EWMAvol = function(returns, lambda, rollwindow){
  EWMA.mat = matrix(NA, nrow = nrow(returns), ncol = ncol(returns))
  for (k in 1 : ncol(returns)){  
    for (j in rollwindow : nrow(returns)){
      td = returns
      data = as.matrix(td[(j - rollwindow + 1) : j, k])
      ewmaVar.mat = matrix()
      ewmaVar.mat[1] = 0
      for (i in 2 : rollwindow){
        ewmaVar.mat[i] = lambda * ewmaVar.mat[i-1]+ (1 - lambda) * data[i]^2
      }
      EWMA.mat[j, k] = sqrt(ewmaVar.mat[length(ewmaVar.mat)])
    }
  }
  return(EWMA.mat)
}

Данные, на которые опирается эта функция:

> class(rets)
[1] "xts" "zoo"

который исходит от функции Return.calculate() из пакета PerformanceAnalytics.

Вывод, который я сейчас получаю:

> class(EWMAvol)
[1] "matrix"

Можно ли вернуть объект/данные xts или zoo из моего кода? Кроме того, я хотел бы сохранить имена столбцов. Как я могу этого добиться?

Спасибо.


person AK88    schedule 17.10.2017    source источник


Ответы (1)


Функция Return.calculate возвращает xts, поэтому вы можете использовать ее index для преобразования окончательного возвращаемого значения в xts.

Я бы сделал это, заменив последнюю строку вашей функции

return(EWMA.mat)

со следующим:

EWMA.xts = xts::xts(EWMA.mat, order.by = zoo::index(returns))
colnames(EWMA.xts) = colnames(returns) # to preserve column names
return(EWMA.xts)
person lebelinoz    schedule 17.10.2017
comment
Спасибо, +1. Теперь небольшая проблема - как мне сохранить имена столбцов? - person AK88; 17.10.2017
comment
Большой! Следил за вашей активностью здесь, так как вы являетесь Quant. Просто любопытно, вы закончили разработку своих факторных моделей? - person AK88; 17.10.2017
comment
@ AK88 Более или менее. Сейчас думаю об оптимизации портфеля. - person lebelinoz; 17.10.2017