3 votos

Reequilibrio de las ponderaciones de la cartera

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.

2voto

ARKBAN Puntos 1388

El cálculo de los rendimientos de la cartera reequilibrada utilizando PerformanceAnalytics hace uso de lo que los autores del paquete llaman pesos de "fin de periodo". Como se describe en la documentación de Return.portfolio El reequilibrio utiliza las ponderaciones del último día de negociación del período para reequilibrar la cartera después del cierre de los mercados de ese día. Como ejemplo, en el código de abajo he añadido fechas a sus datos de pesos y rendimientos. Aquí las ponderaciones para el 2015-05-31 especifican las ponderaciones utilizadas para reequilibrar la cartera tras el cierre de los mercados en esa fecha. Estas se convierten en las ponderaciones de "inicio de período" para el período de negociación que comienza el 2015-06-01 y son las adecuadas para utilizar con los rendimientos del 2015-06-30 para calcular los rendimientos de la cartera para el mes de junio. Para este caso, en el que las ponderaciones y los rendimientos tienen el mismo número de puntos de datos por período, los rendimientos de un período son simplemente el producto escalar de los rendimientos de los activos y las ponderaciones. El código siguiente también realiza este cálculo para que pueda comparar los dos métodos.

Por su mensaje, parece que también le interesan los rendimientos acumulados. El código siguiente incluye ese cálculo utilizando ambos PerformanceAnalytics y cálculos directos.

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))
library(PerformanceAnalytics)
ret <- xts(returns, order.by= as.Date(c("2015-06-30", "2015-07-31")))
wts <- xts(weights, order.by= as.Date(c("2015-05-31","2015-06-30")))
#  Period returns
returns_PA <- Return.portfolio(ret, wts)
returns_direct <- reclass(sapply(1:nrow(wts), function(n) ret[n,]%*%t(wts[n,])), ret)

# Cummulative returns
returns_PA_cum <- Return.cumulative(returns_PA)
returns_direct_cum <- prod(returns_direct+1) -1

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