2
$\begingroup$

I have implemented two different expressions (Idzorek p.6, Walters p.51) of a posterior mean return calculation within a Black-Litterman framework. My results are the same, irrespective of the implemented expression, but if compared to the results published by Idzorek they differ. Also the R package BLCOP returns yet more confusing results. What am I missing?

This is corresponding code...

# 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"))

... and the result is

               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

This is quit different from the actual results in Idzorek. Any ideas are much appreciated!

$\endgroup$
  • $\begingroup$ Note that I did experiment with different tau values, but even with tau=1 still two asset classes are showing a difference (US bonds and US large grow), even though it's small (0.01%) I am curious as to where it originates from. Also, this would not explain the remarkably different BLCOP result which fails to adjust with changing tau values. $\endgroup$ – RndmSymbl Feb 8 '14 at 1:23
0
$\begingroup$

To each closure on this: I attribute the difference to Idzorek to rounding errors. And on a side node, Idzorek sets the sample variance equal to the prior variance, an issue that kept myself busy until I found that detail confirmed by Walters paper.

$\endgroup$
  • $\begingroup$ Oh sure, will do. $\endgroup$ – RndmSymbl Feb 15 '14 at 14:45

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.