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. Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
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.
Without further ado here is the chart of cumulative returns: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 = 100000source(“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)))
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.