Diagnosing Differences in Black–Litterman Posterior Mean Results
Summary
The document investigates why posterior expected returns calculated from two equivalent Black–Litterman formulas differ from published results. It compares calculations based on equilibrium returns, asset covariance, investor views and view uncertainty with values reported in a reference example and output from a software package. The two formulas in the question agree with each other, while the package output appears to reproduce the prior returns.
The response attributes the discrepancy with the published figures to rounding and adds that the reference example sets sample variance equal to prior variance. That implementation detail had caused confusion for the respondent and was corroborated by another paper. The exchange offers a diagnostic clue about reproducing a published example, rather than a full derivation or systematic comparison of implementations. It does not establish which issue accounts for every mismatch, explain the package behavior, or provide a rerun with corrected inputs, so users should check the original assumptions and parameter definitions when replicating the calculation.
Key ideas
- The two posterior-mean formulas implemented in the question produce matching results.
- Differences from published Black–Litterman results may arise from rounding.
- The cited discussion says the example equates sample variance with prior variance.
- Reproductions should check the reference example’s assumptions and input definitions.
Tags
Full text
# Why does my posterior mean differs from Idzorek's results?
# Why does my posterior mean differs from Idzorek's results?
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!
## Answer by RndmSymbl (score 0, accepted)
https://quant.stackexchange.com/a/10255
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.Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.