Why Historical Mean-Variance Optimization Can Underperform Equal Weight
Summary
The document asks whether a maximum-Sharpe portfolio built from a short rolling history can underperform equal weighting when the asset universe is small. Its response says this can happen and points to research on the difficulty of estimating portfolio inputs. It illustrates the issue with a backtest using five industry portfolios: estimated means and covariances come from the previous 21 days, and weights are rebalanced monthly. In that example, maximum-Sharpe optimization and equal weight have nearly identical annualized returns, while equal weight has slightly lower reported volatility and a marginally higher return-to-volatility ratio.
The response argues that noisy estimates of expected returns are a key weakness of this approach, and contrasts maximum-Sharpe optimization with minimum-variance allocation. The example is illustrative, not proof that equal weight will always win: it uses one dataset, a particular estimation window, simplifying assumptions, and a historical backtest. Results may differ with other assets, constraints, estimation choices, costs, or market periods.
Key ideas
- Maximum-Sharpe optimization based on noisy historical inputs can underperform equal weighting.
- The illustration estimates means and covariances from a rolling 21-day window and rebalances monthly.
- In the example, equal weight has a slightly higher return-to-volatility ratio than maximum Sharpe.
- The response identifies expected-return estimation as a key source of instability.
- A single historical backtest does not establish how either method will perform in other settings.
Tags
Full text
# Subpar Results of Historical Portfolio Optimization with Few Assets
# Subpar Results of Historical Portfolio Optimization with Few Assets
Probably a simple question to the P-Quants here, but if you performed portfolio optimization using a historically calibrated covariance matrix (a rolling month of daily returns) with very few assets, say 3 European ETFs with daily rebalancing across 10 years, is it possible for the performance metrics (based on a maximum Sharpe optimization) across these 10 years to be poorer than an equal-weighted portfolio?
Inputs on how assets are selected for the sake of portfolio optimization are welcome as well!
## Answer by Enrico Schumann (score 1, accepted)
https://quant.stackexchange.com/a/79569
Yes, that is possible. In fact, this possibility (and its likelihood) was made well-known by this paper:
```
@ARTICLE{DeMiguel2007,
author = {Victor {DeMiguel} and Lorenzo Garlappi and Raman
Uppal},
title = {Optimal versus Naive Diversification: How
Inefficient is the 1/{N} Portfolio Strategy?},
journal = {Review of Financial Studies},
year = 2009,
volume = 22,
pages = {1915--1953},
number = 5
}
```
And it's even simple to demonstrate. Let's use a dataset of 5 industries, as provided by Kenneth French (https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/Data_Library/det_5_ind_port.html). I'll fetch it into R.
```
library("NMOF")
library("PMwR")
library("zoo")
P <- French(tempdir(),
"5_Industry_Portfolios_daily_CSV.zip",
price.series = TRUE)
P <- P[row.names(P) >= "2014-01-01", ]
timestamp <- as.Date(row.names(P))
```
The 5 columns of P should look like this:
Now I run two backtests. First, maximum Sharpe, using the `maxSharpe` implementation in `NMOF`. For simplicity, I assume a risk-free rate of zero. As expected returns, I'll use the mean returns of the previous 21 days. (And this is the key problem.) Whenever these are negative, I replace them by 0.01%. Otherwise, the optimization typically fails, as the portfolio should not exist: everyone would hold risk-free investments.
```
## maximum sharpe optimisation/backtest
signal <- function() {
C <- Close(n = 21)
R <- returns(C)
w <- maxSharpe(m = pmax(colMeans(R), 0.0001),
var = cov(R),
wmin = 0)
w
}
bt <- btest(list(as.matrix(P)),
signal = signal,
do.signal = "endofmonth",
convert.weights = TRUE,
initial.cash = 100,
timestamp = timestamp,
b = 21 ## burnin 21 observations
)
summary(as.NAVseries(bt, title = "max Sharpe"))
## ———————————————————————————————————————————————————————
## max Sharpe
## 31 Jan 2014 ==> 30 Apr 2024 (2579 data points, 0 NAs)
## 100 303.588
## ———————————————————————————————————————————————————————
## Return (%) 11.4 (annualised)
## ———————————————————————————————————————————————————————
## Volatility (%) 15.2 (annualised)
## _ upside 12.5
## _ downside 9.1
## ———————————————————————————————————————————————————————
## High 311.34 (09 Apr 2024)
## Low 95.34 (11 Apr 2014)
## ———————————————————————————————————————————————————————
## Max. drawdown (%) 28.9
## _ peak 194.71 (19 Feb 2020)
## _ trough 138.50 (23 Mar 2020)
## _ recovery (05 Jun 2020)
## _ underwater now (%) 2.5
## ———————————————————————————————————————————————————————
```
And now equal weight.
```
ew <- function() {
k <- ncol(Close())
rep(1/k, k)
}
bt <- btest(list(as.matrix(P)),
signal = ew,
do.signal = "endofmonth",
convert.weights = TRUE,
initial.cash = 100,
timestamp = timestamp,
b = 21)
summary(as.NAVseries(bt, title = "equal weight"))
## ———————————————————————————————————————————————————————
## equal weight
## 31 Jan 2014 ==> 30 Apr 2024 (2579 data points, 0 NAs)
## 100 302.199
## ———————————————————————————————————————————————————————
## Return (%) 11.4 (annualised)
## ———————————————————————————————————————————————————————
## Volatility (%) 15.0 (annualised)
## _ upside 12.2
## _ downside 9.4
## ———————————————————————————————————————————————————————
## High 315.24 (28 Mar 2024)
## Low 96.69 (11 Apr 2014)
## ———————————————————————————————————————————————————————
## Max. drawdown (%) 33.9
## _ peak 195.59 (19 Feb 2020)
## _ trough 129.26 (23 Mar 2020)
## _ recovery (07 Aug 2020)
## _ underwater now (%) 4.1
## ———————————————————————————————————————————————————————
```
So in this simple example, equal-weight has a (slightly) higher ratio of return/volatility than maximum Sharpe-ratio. As I said above, this result is typically driven by using historical realized returns as expected returns. There is a fairly-old strand of literature that documents this effect. See for instance:
```
@ARTICLE{,
author = {George M. Frankfurter and Herbert E. Phillips and
John P. Seagle},
title = {Portfolio Selection: The Effects of Uncertain Means,
Variances, and Covariances},
journal = {Journal of Financial and Quantitative Analysis},
year = 1971,
volume = 6,
pages = {1251--1262},
number = 5
}
@ARTICLE{,
author = {Best, Michael J. and Grauer, Robert R.},
title = {On the Sensitivity of Mean--Variance-Efficient
Portfolios to Changes in Asset Means: Some
Analytical and Computational Results},
journal = {Review of Financial Studies},
year = 1991,
volume = 4,
pages = {315--342},
number = 2
}
```
Volatility is more persistent and can be controlled. One can demonstrate this by only minimizing variance:
```
mv <- function() {
C <- Close(n = 21)
minvar(var = cov(returns(R)), wmin = 0)
}
bt <- btest(list(as.matrix(P)),
signal = signal,
do.signal = "endofmonth",
convert.weights = TRUE,
initial.cash = 100,
timestamp = timestamp,
b = 21)
summary(as.NAVseries(bt, title = "minimum variance"))
## ———————————————————————————————————————————————————————
## minimum variance
## 31 Jan 2014 ==> 30 Apr 2024 (2579 data points, 0 NAs)
## 100 361.781
## ———————————————————————————————————————————————————————
## Return (%) 13.4 (annualised)
## ———————————————————————————————————————————————————————
## Volatility (%) 13.6 (annualised)
## _ upside 11.9
## _ downside 7.6
## ———————————————————————————————————————————————————————
## High 375.36 (28 Mar 2024)
## Low 98.73 (11 Apr 2014)
## ———————————————————————————————————————————————————————
## Max. drawdown (%) 28.1
## _ peak 197.44 (19 Feb 2020)
## _ trough 141.94 (23 Mar 2020)
## _ recovery (05 Jun 2020)
## _ underwater now (%) 3.6
## ———————————————————————————————————————————————————————
```
See also https://enricoschumann.net/files/note1N_MV.pdf . (Disclosure: I am the maintainer of packages NMOF and PMwR.)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.