Minimum Expected Shortfall, Part 2

[This article was first published on Adventures in Statistical Computing, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Previously, we setup the problem of constructing a minimum expected shortfall portfolio.   We exported the portfolio weights from each quarterly rebalancing into R objects.

This post will process those weights and compare the portfolio statistics to a cap-weight portfolio, a minimum variance portfolio, an equal weight portfolio, the DIA ETF, and the SPY ETF.  The weights are converted into share holdings and those holdings used to mark the portfolio.  The returns from those marks are used for portfolio statistics.  There is nothing new in the R code — all the topics have been covered previously in this blog.

A note on cap-weight.  I do not have access to historic market capitalization.  In a perfect world, the shares held in the current weighting would be the same as the initial weighting.  I make the assumption that the “Adjusted Price” available from Yahoo! captures all historic corporate actions.

All R code and data frames can be found here.

The main portion of R code loads the data frames and then creates the portfolios by calling an R script for each portfolio.
require(fImport)
require(PerformanceAnalytics)
require(quadprog)

setwd(“c:/temp/dow30_files”)

vars = c(“mmm”, “aa”, “axp”, “t”, “bac”, “ba”, “cat”, “cvx”, “csco”, “ko”, “dd”, “xom”, “ge”, “hpq”, “hd”, “intc”, “ibm”, “jnj”, “jpm”, “mcd”, “mrk”, “msft”, “pfe”, “pg”, “trv”, “utx”, “vz”, “wmt”, “dis”)
load(“optES”)
load(“cov”)
load(“prices”)
load(“prices_wk”)
load(“dia”)

startingValue = 100000

source(“functions.r”)

source(“dow30_minES.r”)

source(“dow30_ew.r”)

source(“dow30_minVar.r”)

source(“dow30_capw.r”)

dia = as.xts(dia_spy$dia,dia_spy$Date)
spy = as.xts(dia_spy$spy,dia_spy$Date)

m = merge(minES,minVar)
m = merge(m,ew)
m = merge(m,capw)
m = merge(m,dia)
m = merge(m,spy)

chart.CumReturns(m,main=“Reduced Volatility Portfolios”,legend.loc=“topleft”)
print(table.AnnualizedReturns(m))
print(table.CAPM(as.xts(m[,c(“minES”,“minVar”,“ew”,“capw”,“dia”)]),as.xts(m$spy)))
Without further ado here is the chart of cumulative returns:
 We see the minimum variance portfolio outperforms the minimum ES portfolio.  Those two along with the equal weight portfolio vastly outperform the traditional cap-weight, DIA, and SPY.


minES
minVar
ew
capw
dia
spy
Annualized Return
0.0538
0.0615
0.0367
-0.0054
0.0119
-0.0103
Annualized Std Dev
0.1722
0.1902
0.217
0.2149
0.205
0.2181
Annualized Sharpe (Rf=0%)
0.3122
0.3231
0.1689
-0.025
0.0581
-0.0471

The minimum ES portfolio has the lowest volatility, lower than the minimum variance portfolio.  The Sharpe ratios are close between the two.


minES to spy
minVar to spy
ew to spy
capw to spy
dia to spy
Alpha
0.0002
0.0003
0.0002
0
0.0001
Beta
0.696
0.7852
0.9441
0.9372
0.9019
Beta+
0.7076
0.8009
0.9515
0.9471
0.9302
Beta-
0.6882
0.7887
0.9369
0.9365
0.8927
R-squared
0.7875
0.8212
0.9127
0.9166
0.9197
Annualized Alpha
0.0558
0.0653
0.043
0.0004
0.0209
Correlation
0.8874
0.9062
0.9554
0.9574
0.959
Correlation p-value
0
0
0
0
0
Tracking Error
0.1037
0.0932
0.0653
0.0636
0.0619
Active Premium
0.0594
0.0671
0.0423
0.0002
0.0222
Information Ratio
0.5725
0.7195
0.6477
0.0038
0.3583
Treynor Ratio
0.0772
0.0783
0.0388
-0.0057
0.0132

The interesting thing here is the downside beta from the minimum ES portfolio.  It is the lowest of all the portfolios.  That makes sense as our methodology takes into account portfolio skews and will tend to select portfolios with a positive skew.  The minimum ES also has the lowest overall Beta and least correlation with the SPY.

This study is limited in scope and is intended as a proof of concept.  The results show promise.  Nothing here should be taken as investment advise.

To leave a comment for the author, please follow the link and comment on their blog: Adventures in Statistical Computing.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)