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

Calculating Expected Returns as per Formula (1)

library(MASS)
exp_return = crossprod(ginv(ginv(tau*covariance) + t(view)%*%ginv(omega)%*%view),
             (ginv(tau*covariance)%*%implied_return + t(view)%*%ginv(omega)%*%Q))
exp_return*100
##            [,1]
##  [1,] 13.782406
##  [2,] 13.529602
##  [3,]  9.938237
##  [4,] 20.390936
##  [5,] 14.968322
##  [6,] 12.774986
##  [7,] 16.427901
##  [8,]  7.473361
##  [9,] 11.837721
## [10,] 12.412154
## [11,] 10.995167
## [12,]  8.890219
## [13,] 17.002955
## [14,] 14.496157
## [15,] 10.515258
## [16,] 10.722291
## [17,] 11.029228
## [18,] 14.294648
## [19,]  8.674112
## [20,] 15.495158
## [21,] 10.969205
## [22,] 14.645529
## [23,]  6.904105
## [24,] 12.836814
## [25,] 12.440699
## [26,] 18.713903
## [27,]  9.429785
## [28,]  7.893650
## [29,] 10.573428
## [30,] 12.999745

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