He implementado dos expresiones diferentes ( Idzorek p.6, Walters p.51) de un cálculo de rentabilidad media posterior en un marco Black-Litterman. Mis resultados son los mismos, independientemente de la expresión implementada, pero si se comparan con los resultados publicados por Idzorek difieren. También el paquete R BLCOP devuelve resultados aún más confusos. ¿Qué me falta?
Este es el código correspondiente...
# Equilibrium returns from CAPM, Idzorek p.5
mu = c(0.08, 0.67, 6.41, 4.08, 7.43, 3.70, 4.80, 6.60)/100
assetNames = c("US bonds", "Int bonds", "US large grow", "US large value",
"US small grow", "US small value", "Int dev EQ", "Int emerg EQ")
# Views (returns and pick matrix), Idzorek p.7, p.13
Q = c(5.25, 0.25, 2)/100
P = matrix(0, ncol = 8, nrow = 3, dimnames = list(NULL, assetNames))
P[1,7] = 1
P[2,1] = -1; P[2,2] <- 1
P[3, 3:6] = c(0.9, -0.9, .1, -.1)
# Prior covariance-variance matrix, Idzorek table 5
entries = c(0.001005,0.001328,-0.000579,-0.000675,0.000121,0.000128,
-0.000445, -0.000437, 0.001328,0.007277,-0.001307,-0.000610,
-0.002237,-0.000989,0.001442,-0.001535, -0.000579,-0.001307,
0.059852,0.027588,0.063497,0.023036,0.032967,0.048039,-0.000675,
-0.000610,0.027588,0.029609,0.026572,0.021465,0.020697,0.029854,
0.000121,-0.002237,0.063497,0.026572,0.102488,0.042744,0.039943,
0.065994 ,0.000128,-0.000989,0.023036,0.021465,0.042744,0.032056,
0.019881,0.032235 ,-0.000445,0.001442,0.032967,0.020697,0.039943,
0.019881,0.028355,0.035064 ,-0.000437,-0.001535,0.048039,0.029854,
0.065994,0.032235,0.035064,0.079958 )
sigma = matrix(entries, ncol = 8, nrow = 8)
# Equilibrium variance uncertainty, Idzorek p. 15
tau = 0.25
omega = diag(c((P[1,]%*%sigma%*%P[1,])*tau,
(P[2,]%*%sigma%*%P[2,])*tau,
(P[3,]%*%sigma%*%P[3,]))*tau)
# BL master formula for posterior mu in Walters, Appendix E
mu_JWalters = mu+(tau*sigma%*%t(P))%*%inv((tau*P%*%sigma%*%t(P))+omega)%*%(Q-P%*%mu)
# BL master formula for posterior mu in Idzorek p. 6
mu_Idzorek = inv(inv(tau*sigma)+(t(P)%*%inv(omega)%*%P))%*%((inv(tau*sigma)%*%mu)+(t(P)%*%inv(omega)%*%Q))
# BL posterior mu using BLCOP package
views = BLViews(P, Q,confidences=diag(omega), assetNames)
mu_BLCOP = posteriorEst(views=views,mu=mu,tau=tau,sigma=sigma)@posteriorMean
posteriorMuSet = round(cbind(mu_JWalters,mu_Idzorek,mu_BLCOP),digits=4)*100
dimnames(posteriorMuSet) = list(assetNames,c("Walters", "Idzorek", "BLCOP"))
... y el resultado es
Walters Idzorek BLCOP
US bonds 0.05 0.05 0.08
Int bonds 0.32 0.32 0.67
US large grow 6.75 6.75 6.41
US large value 4.51 4.51 4.08
US small grow 7.95 7.95 7.43
US small value 4.15 4.15 3.70
Int dev EQ 5.11 5.11 4.80
Int emerg EQ 7.16 7.16 6.60
Esto es muy diferente de los resultados reales en Idzorek . Cualquier idea es muy apreciada.