12 votos

Cómo calcular modificado-CVaR en el PerformanceAnalytics paquete?

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.

8voto

doekman Puntos 5187

El "Componente ES la sección" ?ES dice:

Para la descomposición de la Gaussiana ES, la estimación de la media y la matriz de covarianza son necesarios. Para la descomposición de la modificación ES, también estimaciones de la coskewness y cokurtosis matrices son necesarios.

La estimación de la coskewness y cokurtosis matrices son lo que tomar un largo tiempo. Usted puede calcular de antemano y pasarlos a ES. ?ES dice:

Las matrices pueden ser estimados a través de las funciones de la asimetría.MM' y 'la curtosis.MM'.

pero yo no veo esas funciones en la versión de PerformanceAnalytics instalado en mi sistema. ES sí utiliza el dejados de exportar funciones M3.MM y M4.MM, por lo que se podría llamar de forma explícita:

m3 <- PerformanceAnalytics:::M3.MM(R)
m4 <- PerformanceAnalytics:::M4.MM(R)
CVaR4 <- ES(R=R , weights=w, method="modified", portfolio_method="component",
  clean="boudt", m3=m3, m4=m4)

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X