#' 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)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.