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...
2 votos
Estoy un poco confundido. Tal como está tu código ahora, estás usando las funciones equicorr() y rmnorm(). ¿No viene equicorr() del paquete QRMlib? Pero, si cargas QRMlib, ¿no cambia eso el uso de rmnorm() para que coincida con rmnorm() en QRMlib, y no en el paquete mnormt (como se muestra aquí)?
0 votos
Yo mismo he replicado la función equicorr, perdón por no incluirla. He actualizado el código "actual".
0 votos
En su declaración sim.equities, ¿de dónde viene el 0,3? Y, fíjate que rnorm(m*n,1,0.3) proporcionará números negativos. En su declaración sim.bonds, ¿de dónde viene el 0,1?
0 votos
... vamos a discutir de nuevo cuando el código se comenta ...
0 votos
Espero que esto siga siendo interesante, si es necesario hacer más comentarios, por favor hágamelo saber.