17 votos

Simulación de rendimientos

Empezaré con una pregunta bastante amplia: Estoy tratando de simular los rendimientos de un gran número de activos dentro de una cartera de diferentes clases: renta variable y renta fija en un primer paso, digamos 100 acciones y 100 bonos. El objetivo principal es preservar algo parecido a una estructura de correlación realista dentro de los rendimientos. ¿Cuál sería una buena manera de hacerlo?

Mi primera idea fue estimar la correlación entre las clases, dibujar retornos normales multivariados (sí, lo sé, pero si tienes mejores ideas, me gustaría escucharlas) basados en la media, sd y correlación históricas, y luego replicar las dos series de retornos de referencia con errores aleatorios, digamos algo así (código pseudo R, creo que está claro lo que quiero decir)

require(mnormt)
n <- 100 # number of assets
m <- 1000 # days of simulated data
means <- apply(cbind(equity,bond),2,mean)
Sigma <- cov(cbind(equity,bond))
sim.returns <- rmnorm(1000,means,Sigma)
sim.equities <- matrix(sim.returns[,"equity"]*rnorm(m*n,mean=1,sd=0.5),ncol=n)
sim.bonds <- matrix(sim.returns[,"bond"]*rnorm(m*n,mean=1,sd=0.2),ncol=n)

Cualquier sugerencia, mejora u otro comentario es bienvenido: ¿cómo lo harías tú, o lo harías mejor?

Actualización: Aquí es donde estoy ahora (a partir de 2011-04-29):

require(quantmod)
rets.dax <- dailyReturn(GDAXI)
(DBCNumber <- 100)
(DBCNames <- as.character(paste("DBC",1:DBCNumber,sep="_")))
(DBCBetas <- runif(DBCNumber, min=0.8,max=1.5)) # seeding Betas
DBCErrors <- matrix(rnorm(nrow(rets.dax)*DBCNumber,sd=0.01),ncol=DBCNumber) #seeding errors
DBCReturns <- matrix(rep(NA,nrow(rets.dax)*DBCNumber),ncol=DBCNumber)
#simulating returns with the betas and errors
for(i in 1:DBCNumber){DBCReturns[,i] <- rets.dax*DBCBetas[i]+DBCErrors[,i]} 
DBCReturns <- xts(DBCReturns,order.by=index(rets.dax))
colnames(DBCReturns) <- DBCNames
DBCIndizes <- xts(apply(DBCReturns+1,2,cumprod),order.by=index(rets.dax)) #calculating prices

cols <- heat.colors(DBCNumber)
chart.RelativePerformance(DBCReturns,rets.dax,colorset=cols, lwd=1)

Ahora estoy bastante contento con los rendimientos de la renta variable, pero ¿tiene sugerencias para los rendimientos de la renta fija (fuentes de datos, puedo copiar el enfoque de la renta variable?)

0 votos

Tal vez sólo mencionar que el "truco" que está utilizando aquí viene de la rmnorm función de QRMlib . Podría entenderse como una errata. También podría asumir la dinámica de sus activos y "discretizarlos" para simular trayectorias; su covarianza se convierte en un parámetro de la dinámica y sólo utiliza movimientos brownianos.

0 votos

Gracias por la indicación, no conocía el procedimiento QRMlib, de hecho estoy utilizando rmnorm del paquete mnormt.

2 votos

Sinceramente, unos comentarios en su código serían muy bienvenidos...

4voto

EndangeredMassa Puntos 9532

Tengo algunas ideas, pero ninguna respuesta real :).

  • Se toman los rendimientos del DAX, que no son normales, luego se hacen normales y se les aplica ruido normal. Parece que podría ser un poco mejor sólo aplicar el ruido a la original, DAX no normalizado.

  • ¿Ha considerado la distribución t? Hay paquetes de distribución t multivariante en R (por ejemplo mnormt )

  • Las colas normales y flacas realmente se ven en la trama. Yo esperaría que unos pocos tuvieran enormes rendimientos o pérdidas.

A partir de esto tengo dos sugerencias:

  • ¿Por qué no sacar datos bursátiles reales de Yahoo a través de QuantMod ? ¿Alguno de los paquetes tiene scripts para sacar todos los teletipos?

  • ¿Por qué no asignar un $\beta$ a cada acción (y bono) simulada? Siempre y cuando el $\beta$ suman a uno, debería estar bien (aunque entonces serás vulnerable a tus suposiciones sobre la distribución de $\beta$ -- usar datos reales te libera de esto, aunque incluso entonces eres vulnerable al periodo de tiempo).

0 votos

Volví a esto. Como puede ver, hice caso a su consejo de sembrar betas. ¿Hay alguna sugerencia con respecto a la gama de posibles betas y errores?

3voto

ashishsony Puntos 191

Creo que lo mejor será algún tipo de muestreo bootstrap bloqueado utilizando datos reales del mercado. Si utilizas un enfoque de simulación pura para "maquillar" un conjunto de datos, hay una probabilidad significativa de que termines con un modelo mal especificado.

Para empezar, puede utilizar el paquete R quantmod para obtener datos diarios del mercado de valores y calcular los rendimientos, y la función tsbootstrap del paquete tseries le permitirá construir series de rendimientos hipotéticos con cierta base en la realidad.

0voto

Scott Miller Puntos 1388

Para preservar la estructura de dependencia de los rendimientos del mercado, la forma más sencilla es realizar un remuestreo (bootstrap): Tome sus rendimientos y normalice cada activo por su desviación estándar diaria. A continuación, en cada paso, extraiga una fecha aleatoria elegida uniformemente en su muestra y utilice el vector de rendimientos normalizados de esa fecha como su ruido IID. Este procedimiento preserva la estructura de dependencia de los rendimientos sin asumir ninguna distribución específica. No sólo la correlación, sino también la dependencia de la cola

Se puede combinar con cualquier modelo de distribución o de volatilidad (GARCH, SV, etc.) para cada activo.

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