Introduction:
I have recreated the calculations in the papeer “A STEP-BY-STEP GUIDE TO THE BLACK-LITTERMAN MODEL”.
The paper presents an example of performing Black-Litterman model on Dow Jones Industrial Average (DJIA)constituents
Importing the tables given in the paper
portfoilio_weigths = read.csv("Portfolio Weights.csv",header=FALSE)
market_cap_weight = portfoilio_weigths$V6
market_cap_weight = market_cap_weight[-1]# removing the column name
market_cap_weight <- as.matrix(market_cap_weight)
class(market_cap_weight) = "numeric"
implied_weight = read.csv("Implied Equilibrium Weights.csv",header=FALSE)
omega = read.csv("omega.csv",header=FALSE)
omega = as.matrix(omega)
view = read.csv("View.csv",header=FALSE)
view = as.matrix(view)
covariance = read.csv("Covariance.csv",header=FALSE)
covariance <- covariance[-1,]
covariance = as.matrix(covariance)
class(covariance) <- "numeric"
Calculating the Implied Equilibrium Returns from Formula on Page 1
risk_aversion_parameter <- 2.25 # risk aversion parameter from Appendix B.
implied_return = risk_aversion_parameter*covariance%*%market_cap_weight
# Implied Returns
risk_free = 0.05 # risk free rate
implied_return = implied_return + risk_free
implied_return*100
## [,1]
## 2 13.811630
## 3 13.584088
## 4 9.766805
## 5 20.404243
## 6 14.923580
## 7 12.807612
## 8 16.462535
## 9 7.557463
## 10 11.782445
## 11 12.513673
## 12 10.897925
## 13 8.789180
## 14 16.970540
## 15 14.513203
## 16 10.439893
## 17 10.775097
## 18 10.930775
## 19 14.439088
## 20 8.658297
## 21 15.481220
## 22 10.970263
## 23 14.658035
## 24 6.853280
## 25 12.781580
## 26 12.409070
## 27 18.700700
## 28 9.203202
## 29 7.857298
## 30 10.616090
## 31 12.948552
Setting the view vector and setting tau as given in page 9 as per formula (8)
Q <- c(10,3,1.5)/100
Q = as.matrix(Q)
tau <- 0.873
Finding the weights using risk aversion parameter and expected returns
e_return = exp_return-risk_free # Substracting Risk free rate as per Appendix B.7
mu <- as.vector(e_return)
weights = ginv(risk_aversion_parameter*covariance)%*%mu
weights = weights*100
Creating a dataframe to verify our results with Table 4 of the paper
final_table = data.frame (Symbol=portfoilio_weigths$V1[-1],
Exp_ret = exp_return*100,
Imp_Equb_ret = implied_return*100,
Diff_ret = exp_return*100 -implied_return*100,
New_weight = round(weights,2),
Mkt_cap_weight = market_cap_weight*100,
Diff_weight = round(round(weights,2)-market_cap_weight*100,2))
final_table
## Symbol Exp_ret Imp_Equb_ret Diff_ret New_weight Mkt_cap_weight
## 2 aa 13.782406 13.811630 -0.029223666 0.88 0.88
## 3 ge 13.529602 13.584088 -0.054485531 10.76 11.62
## 4 jnj 9.938237 9.766805 0.171432210 6.25 5.29
## 5 msft 20.390936 20.404243 -0.013306782 10.41 10.41
## 6 axp 14.968322 14.923580 0.044742197 1.39 1.39
## 7 gm 12.774986 12.807612 -0.032626629 0.84 0.79
## 8 jpm 16.427901 16.462535 -0.034634431 2.09 2.09
## 9 pg 7.473361 7.557463 -0.084101226 2.03 2.99
## 10 ba 11.837721 11.782445 0.055275814 0.90 0.90
## 11 hd 12.412154 12.513673 -0.101518731 3.23 3.49
## 12 ko 10.995167 10.897925 0.097241684 3.42 3.42
## 13 sbc 8.890219 8.789180 0.101039234 3.84 3.84
## 14 c 17.002955 16.970540 0.032414927 7.58 7.58
## 15 hon 14.496157 14.513203 -0.017045065 0.80 0.80
## 16 mcd 10.515258 10.439893 0.075365967 0.99 0.99
## 17 t 10.722291 10.775097 -0.052806439 1.87 1.87
## 18 cat 11.029228 10.930775 0.098452630 0.52 0.52
## 19 hwp 14.294648 14.439088 -0.144439568 1.16 1.16
## 20 mmm 8.674112 8.658297 0.015814743 1.35 1.35
## 21 utx 15.495158 15.481220 0.013937524 0.88 0.88
## 22 dd 10.969205 10.970263 -0.001057626 1.29 1.29
## 23 ibm 14.645529 14.658035 -0.012505972 6.08 6.08
## 24 mo 6.904105 6.853280 0.050824839 2.90 2.90
## 25 wmt 12.836814 12.781580 0.055234300 8.01 7.49
## 26 dis 12.440699 12.409070 0.031628716 1.23 1.23
## 27 intc 18.713903 18.700700 0.013202863 6.16 6.16
## 28 mrk 9.429785 9.203202 0.226582908 4.69 3.90
## 29 xom 7.893650 7.857298 0.036352474 8.39 7.85
## 30 ek 10.573428 10.616090 -0.042662359 0.25 0.25
## 31 ip 12.999745 12.948552 0.051192960 0.57 0.57
## Diff_weight
## 2 0.00
## 3 -0.86
## 4 0.96
## 5 0.00
## 6 0.00
## 7 0.05
## 8 0.00
## 9 -0.96
## 10 0.00
## 11 -0.26
## 12 0.00
## 13 0.00
## 14 0.00
## 15 0.00
## 16 0.00
## 17 0.00
## 18 0.00
## 19 0.00
## 20 0.00
## 21 0.00
## 22 0.00
## 23 0.00
## 24 0.00
## 25 0.52
## 26 0.00
## 27 0.00
## 28 0.79
## 29 0.54
## 30 0.00
## 31 0.00
Observation
From the Views that were expressed we expect absolute return of 10% from Merck and hence the weightage is above the Index weightage.
We also have a relative view that J&J will outperform P&G and hence we can see that the weightage of J&J in the custom Black Litterman model is higher than the Index weightage of J&J. The inverse happens for P&G were we are investing lower than the Market Portfolio.
Since the confidence level that GE and HD will outperform, GM,WMT and XOM is a low 30%, the weightage of GE,HD is lower than the Index weightage and that of GM, WMT, XOM is greater than the Index weightage.
Therefore, if the view exceeds the difference between the two Weighted average Implied Eq returns differential, the model will tilt the portfolio towards the outperforming asset.
Summary of Paper
As can be seen from our implementation, all the constituents ‘mrk’,‘jnj’,‘pg’,‘ge’,‘hd’,‘gm’,‘wmt’,‘xom’ on which we had a stated position have a different weightage from the Index weightage and this is based on the personal perspective we have on the performance of these stocks. This incorporation of our views on the stocks with a certain confidence level is the main contribution of the Black Litterman Model. That is, instead of selecting a random portfolio based on an expected return and minimization of the standard deviation alone, the Black Litterman Model helps the investor to utilize their analysis and create a view that can be applied on the Equilibrium Return Vector and create a more customized Combied Return Vector.
Each of the views expressed by the investor is also based on the confidence level that he/she has on the view and hence the weightage is also adjusted accordingly using the Black Litterman formulation.
In addition to the ability to generate a custom based portfolio in case there are additional investment constraints, the New Combined Return Vector can also be provided to a Mean-Variance optimizer to generated an optimized portfolio.
Conclusion
The Results are very similar to the paper and therefore we have successfully implemented the Black-Litterman Model