Tengo una matriz de rendimientos y ponderaciones para cada periodo de tiempo.
returns<-rbind(c(-0.05,0.04,0.37),c(0.15,0.02,-0.07))
weights<-rbind(c(0.5,0.1,0.4),c(0.4,0.2,0.4))
Me gustaría reequilibrar los pesos al final de cada periodo de tiempo:
Para ello, primero calculo la variación porcentual de cada mes en los rendimientos:
ones <- matrix(1,ncol=ncol(returns),nrow=nrow(returns))
add <- returns
percentChange <- ones+add
entonces calculo el cambio total:
percentChangeSums <- rowSums(percentChange*weights)
entonces calculo las ponderaciones después de tener en cuenta los rendimientos:
WeightsBefore <- weights * percentChange
Calculo cuánto debería invertir en las acciones para tener los pesos originales que quería mantener:
ShareAfter <- percentChangeSums * weights
Sólo para comprobar que todavía tengo los pesos originales:
WeightsAfter <- ShareAfter/percentChangeSums
rebalanced.weights <- ShareAfter
Mi objetivo es hacerlo sin utilizar ninguna función incorporada (por ejemplo, las del paquete PerformanceAnalytics).
El problema es que obtengo resultados diferentes de las funciones incorporadas ( Return.portfolio()
).
¿Qué me falta?
Actualización:
Basándome en el comentario de XY he modificado mi código:
return <- rbind(c(-5,4,37),c(15,2,-7))
weights <- rbind(c(0.5,0.1,0.4), c(0.5,0.1,0.4),c(0.5,0.1,0.4))
N=3
add <- return/100
ones <- matrix(1,ncol=N,nrow=nrow(return))
ShareAfter <- matrix(NA,ncol=N,nrow=nrow(return))
firstPeriodReturns <- weights[1,]*add[1,]
percentChange <- ones+add
WeightsBefore <- weights[1,] * percentChange[1,]
percentChangeSums <- sum(WeightsBefore)
ShareAfter[1,] <- percentChangeSums * weights[1,]
for (i in 2:nrow(return)){
WeightsBefore <- ShareAfter[i-1,] * percentChange[i,]
percentChangeSums <- sum(WeightsBefore)
ShareAfter[i,] <- percentChangeSums * weights[i,]
}
Sigo sin obtener el resultado deseado. ¿Puede alguien indicarme qué es lo que falta?
Tenga en cuenta de nuevo que quiero hacer esto manualmente, no con un paquete.