Mi objetivo es medir la modificación de la CVAR para una cartera dada su ponderaciones de la matriz y de la seguridad de las devoluciones. Por suerte, el maravilloso paquete de PerformanceAnalytics tiene un ES() función que hace precisamente esto.
El problema que estoy teniendo es que la modificación de la CVAR toma unos minutos para calcular, cuando de acuerdo con este papel (de los mismos autores) el algoritmo debe solo segundos: "...nos ofrecen una larga pero explícita fórmula para calcular la derivada de mES. Aunque las fórmulas son bastante complejas, que se prestan a la eficiencia de la traducción en un simple algoritmo que calcula en menos de un segundo de mES y el componente de mES, incluso para las carteras con un gran número de activos." (página 14)
Me re-generar código a partir de una viñeta que funciona bien cuando se utiliza method = "gaussian"
pero no method = "modified"
. También he revisado el CRAN de referencia para la PerformanceAnalytics paquete aunque no es tan claro como el de papel (enlazado más arriba).
library(PerformanceAnalytics)
tickers = c( "VNO" , "VMC" , "WMT" , "WAG" , "DIS" , "WPO" , "WFC" , "WDC" ,
"WY" , "WHR" , "WMB" , "WEC" , "XEL" , "XRX" , "XLNX" ,"ZION" ,"MMM" ,
"ABT", "ADBE" , "AMD" , "AET" , "AFL" , "APD" , "ARG" ,"AA" , "AGN" ,
"ALTR" , "MO" , "AEP" , "AXP" , "AIG" , "AMGN" , "APC" ,"ADI" , "AON" ,
"APA", "AAPL" , "AMAT" ,"ADM" , "T" , "ADSK" , "ADP" , "AZO" , "AVY" ,
"AVP", "BHI" , "BLL" , "BAC" , "BK" , "BCR" , "BAX" , "BBT" , "BDX" ,
"BMS" , "BBY" , "BIG" , "HRB" , "BMC" , "BA" , "BMY" , "CA" , "COG" ,
"CPB" , "CAH" , "CCL" , "CAT" , "CELG" , "CNP" , "CTL" , "CEPH", "CERN" ,
"SCHW" , "CVX" , "CB" , "CI" ,"CINF" ,"CTAS" , "CSCO" , "C" , "CLF" ,
"CLX", "CMS" , "KO" , "CCE" , "CL" , "CMCSA" ,"CMA" , "CSC" , "CAG" ,
"COP" , "ED" , "CEG" ,"GLW" , "COST" , "CVH" , "CSX" , "CMI" , "CVS" ,
"DHR" , "DE")
library(quantmod)
getSymbols(tickers, from = "2000-12-01", to = "2010-12-31")
P <- NULL; seltickers <- NULL
for(ticker in tickers) {
tmp <- Cl(to.monthly(eval(parse(text=ticker))))
if(is.null(P)){ timeP = time(tmp) }
if( any( time(tmp)!=timeP )) next
else P<-cbind(P,as.numeric(tmp))
seltickers = c( seltickers , ticker )
}
P = xts(P,order.by=timeP)
colnames(P) <- seltickers
R <- diff(log(P))
R <- R[-1,]
dim(R)
mu <- colMeans(R)
sigma <- cov(R)
obj <- function(w) {
if (sum(w) == 0) {
w <- w + 1e-2
}
w <- w / sum(w)
CVaR <- ES(weights = w,
method = "gaussian",
portfolio_method = "component",
mu = mu,
sigma = sigma)
tmp1 <- CVaR$ES
tmp2 <- max(CVaR$pct_contrib_ES - 0.05, 0)
out <- tmp1 + 1e3 * tmp2
return(out)
}
N <- ncol(R)
minw <- 0
maxw <- 1
lower <- rep(minw,N)
upper <- rep(maxw,N)
w<-rep(100/120 , 100)
# works
CVaR1 <- ES(weights = w, method = "gaussian", portfolio_method = "component", mu = mu, sigma = sigma)
# takes too long
date()
CVaR4 <- ES(R = R , weights = w, method = "modified" , portfolio_method = "component" , clean = "boudt")
date()
Actualización:
Resulta que si se desea estimar la m3 y m4 (asimetría y curtosis) que usted necesita para construir matrices con la dimensión (número de activos) elevado a la 3ª y la 4ª poderes. Por lo tanto para matrices grandes, tales como el S&P 500, las demandas de memoria son importantes - mi espalda de la envolvente de los cálculos son 25Gb. Por lo que este procedimiento adolece de la maldición de la dimensionalidad.