1 votos

R devuelve numeric(0) al poner p=0.995 para calcular VaR

Mi código en realidad funciona muy bien. Lo que no entiendo es, si pongo p=0.995 en lugar de 0.95, la consola me da numeric(0). ¿Qué puede causar este error? Sin embargo, cuando uso el método "gaussian", funciona perfectamente.

La función intenta calcular el Valor en Riesgo en el nivel de probabilidad del 99.5%. A 95% la función funciona como debería. Puedes reconstruirlo usando el siguiente código.

¡Gracias!

VaR(bonds.returns, p=0.995, weights=weights, portfolio_method="component", method="historical")

bonds.returns

structure(c(0.0075452479085516, -0.000430602750240983, -0.000618087487474384, 
0.00222086866888427, 0.0106496372204352, 0.00136921667853951, 
...

weights

c(0.039728041, 0.040869022, 0.042067239, 0.039212564, 0.039765805, 
...

0 votos

¿Dónde se define la función VaR?

0 votos

También obtengo numeric(0) para 0.95... debe de haber algo más mal...

1voto

AK88 Puntos 1368

El problema surge debido a tus datos. Algunas de tus columnas no tienen un valor negativo en ese percentil (revisa por ejemplo XS1463101680 y XS1203860934 -- todos positivos), por lo tanto, el VaR histórico no tiene sentido (tus pérdidas no pueden ser un valor positivo, la pérdida siempre es negativa). Por lo tanto, obtendrás un error.

Además, tu código para p = 0.95 también devuelve el mismo error.

EDICIÓN

Desafortunadamente, esta función en particular no funcionará si tienes menos de 200 observaciones de datos (retornos). ¿Por qué? Bueno, al investigar el código, encontré lo siguiente:

En la parte inferior de esta página puedes ver la fórmula que se utiliza para calcular el VaR histórico del componente:

component = {
        # @todo need to add another loop here for subsetting, I think, when weights is a timeseries
        #if (mu=NULL or sigma=NULL) {
        #     pfolioret = Return.portfolio(R, weights, wealth.index = FALSE, contribution=FALSE, method = c("simple"))
        #}
        # for now, use as.vector
        weights=as.vector(weights)
        names(weights)<-colnames(R)

    switch(method,
        modified = { return(VaR.CornishFisher.portfolio(p,weights,mu,sigma,m3,m4))},
        gaussian = { return(VaR.Gaussian.portfolio(p,weights,mu,sigma)) },
        historical = { return(VaR.historical.portfolio(R, p,weights)) },
        kernel = { return(VaR.kernel.portfolio(R, p,weights)) }
    )

}, # end component portfolio switch

Rastreando la función VaR.historical.portfolio, en la parte inferior de esta página observamos:

VaR.historical.portfolio = function(R,p,w)
{
    alpha = .setalphaprob(p)
    portret = c();
    T = dim(R)[1]
    N = dim(R)[2]
    for( t in c(1:T) ){
       portret = c(portret,sum(w*as.numeric(R[t,])))
    }
    hVaR = -1* sort(portret)[floor(alpha*T)]
    return(hVaR)
}

El fragmento T = dim(R)[1] te da el número de filas de tus datos. Tu alpha es 1 - 0.995 o 0.005. Luego tienes este código floor(alpha*T) que básicamente lo está arruinando todo ya que alpha*T es 0.76 y floor(0.76) es 0. Y sort(portret)[0] devuelve numeric(0).

La función funciona para p = 0.95 porque tu alpha es 0.05 y 102 * 0.05 = 5.1 y floor(5.1) = 5 por lo que obtienes el quinto elemento como tu VaR histórico del componente.

0 votos

Hey AK88, esto se debe a que estoy reduciendo mi conjunto de datos para poder publicarlo aquí. Mi conjunto de datos original es mucho más largo y seguramente tiene rendimientos negativos en ellos. ¿Crees que tal vez el 99.5% no tiene ningún valor negativo, pero el 95% sí? Por lo tanto, ¿el resultado no puede calcularse? Pero esto aún no tiene sentido. El VaR histórico ordena todos los rendimientos y calcula dónde está ese 5%. ¿No puede el VaR también medir todos los rendimientos positivos?

0 votos

Tengo otra observación aquí. Calculé VaR individual utilizando esto: VaR(bonds.returns,p=0.995, weights= NULL,portfolio_method = "single", method="historical"), ¡funcionó bien! La salida me dio un VaR de cada columna de datos individual. Esto significa que mis datos no deberían tener ningún problema. Solo cuando calculo el VaR de la cartera, arroja este error.

0 votos

¿Puedes publicar tus datos completos?

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