R/value_at_risk.R

Defines functions value_at_risk

Documented in value_at_risk

#' Value-at-Risk function
#'
#' @param returns Numeric vector of portfolio or asset returns
#' @param method Default historical method. Other possible normal distribution method
#' @param significance Significance level for value-at-risk calculation. Deafult set to 0.05
#' @param plot If TRUE plot VaR and ES.
#'
#' @export
#' @return List with value-at-risk and expected shortfall.
#'
#' @examples
#' value_at_risk(portfolio_returns, method = 'historical')
#' @examples
#' value_at_risk(portfolio_returns, method = 'normal')

value_at_risk <- function(returns
                          ,method = c('historical', 'normal')
                          ,significance = 0.05
                          ,plot = TRUE) {

  # Check if returns is numeric vector
  if (class(returns) != 'numeric'){
    stop('returns is not numeric vector')
  }

  results <- list()

  if(method == 'historical'){

    results$VaR <- as.numeric(
      quantile(returns, significance)
    )

    es_indicator <- (returns < results$VaR)
    results$ES <- sum(returns * es_indicator) / sum(es_indicator)

  }

  if(method == 'normal'){

    invisible(capture.output(
      params <- returns_diagnostics(returns, plot = FALSE)$norm_param
    ))

    results$VaR <- qnorm(0.05) * params[2] + params[1]
    results$ES <- params[1] - params[2] * dnorm(qnorm(significance)) / significance

  }

  if (plot == TRUE){

    var_plot(returns = returns
             ,VaR = results$VaR
             ,ES = results$ES
             ,significance = significance
             ,method = method)

  }

  return(results)

}
pawel-wieczynski/PolishStock documentation built on March 23, 2022, 3:32 p.m.