R/cov_estim_ewma.R

Defines functions cov_estim_ewma

Documented in cov_estim_ewma

#' EWMA Covariance Estimation
#'
#' Computes the Exponential Moving Average (EWMA) estimator of the covariance matrix.
#'
#' @param data an nxp data matrix.
#' @param lambda a double for the decay parameter \eqn{\lambda}.
#' Default is 0.97 - the standard for monthly returns according to \insertCite{riskmetrics1996;textual}{covestim}.
#' If the data consists of daily returns, lambda should be set to 0.94.
#' @return a list with the following entries
#' \itemize{
#' \item a pxp estimated covariance matrix.
#' \item an estimation specific tuning parameter, here the decay parameter \eqn{\lambda}.
#' }
#' @details The EWMA estimator of the covariance matrix for an nxp data matrix X is computed with the following formula:
#' \deqn{\hat{\Sigma}_{t}= (1-\lambda)R_{t}R'_{t} + \lambda\hat{\Sigma}_{t-1},}
#' where \eqn{R_{t}} is the matrix of demeaned returns for the time period \eqn{t} and
#' \eqn{\hat{\Sigma}_{t-1}} is the EWMA covariance estimator for the period \eqn{t-1}.
#'
#' @examples
#' data(rets_m)
#' sigma_ewma <- cov_estim_ewma(rets_m)[[1]]
#'
#' @importFrom Rdpack reprompt
#' @references
#' \insertAllCited
#'
#' @export cov_estim_ewma
#'
cov_estim_ewma <- function(data, lambda = 0.97) {
  data <- as.matrix(data)
  names_data <- colnames(data)
  centered <- apply(data, 2, function(x) {
    x - mean(x)
  })
  n <- dim(centered)[1]
  rm(data)
  gc()

  for (i.e in seq_len(n)) {
    if (i.e == 1) {
      sigma_mat <- (centered[i.e, ] %*% t(centered[i.e, ]))
    } else {
      sigma_mat <-
        (1 - lambda) / (1 - lambda^n) * (centered[i.e, ] %*% t(centered[i.e, ])) + lambda * (sigma_mat)
    }
  }

  rownames(sigma_mat) <- names_data
  colnames(sigma_mat) <- names_data

  list(sigma_mat, lambda)
}
antshi/CovEstim documentation built on June 10, 2025, 3:11 a.m.