*An updated version of this tutorial is available.*

## Author

## Keywords

portfolio optimisation, R

## Review Status

*draft*

# Introduction

The global minimum-variance (MV) portfolio is the leftmost point of the mean-variance efficient frontier. It is found by solving the problem

(1)where $w$ is the vector of portfolio weights, $\Sigma$ is the variance-covariance matrix of the assets, and $\iota$ is an appropriately-sized vector of ones. We do not put any further constraints on the problem, in particular, short sales are allowed here.

# Using a QP solver

## R

We use the `quadprog` package for `R` (see the references below).

```
require(quadprog)
# create artificial data with mean 0 and sd 5%
nO <- 100 # number of observations
nA <- 10 # number of assets
mData <- array(rnorm(nO * nA, mean = 0, sd = 0.05), dim = c(nO, nA))
##
# qp
aMat <- array(1, dim = c(1,nA))
bVec <- 1
zeros <- array(0, dim = c(nA,1))
solQP <- solve.QP(cov(mData), zeros, t(aMat), bVec, meq = 1)
```

The `quadprod` package will minimise an obvective function $\frac{1}{2} w' \Sigma w$, hence the returned minimum-value will be one-half of the portfolio's variance.

`all.equal(as.numeric(var(mData %*% solQP$solution)), as.numeric(2 * solQP$value))`

# A regression representation

The problem can also be implemented as a regression, see Kempf and Memmel [1]. The authors show that regressing the negative excess returns of $\mathrm{n_A} - 1$ assets on the returns of the remaining asset results in coefficients that equal the $\mathrm{n_A} - 1$ respective portfolio weights; the remaining asset's weight is determined by the budget constraint. (Excess return here means with respect to the remaining asset.) Formally, we run the regression

(2)where $r_i$ is the vector of returns of the $i$th asset, and $\epsilon$ is the vector of errors.

From this equation, we directly obtain the weights $w_1$ to $w_{\mathrm{n_A}-1}$. Since the weights need to sum to unity, we have

(3)Furthermore, the resulting portfolio's mean return will equal $\alpha$, and the portfolio's variance will equal the variance of the residuals.

## R

```
# (...continued)
##
# regression
# choose 1st asset as regressand
y <- mData[,1]
X <- mData[,1] - mData[,2:nA]
solR <- lm(y~X)
```

The results should be the same as the results from `quadprog`.

```
# weights from qp
as.vector(solQP$solution)
# weights from regression
as.vector(c(1-sum(coef(solR)[-1]), coef(solR)[-1]))
# variance of portfolio
all.equal(as.numeric(var(mData %*% solQP$solution)), var(solR$residuals))
```

# Solving a system of linear equations

The weights can also be found by solving a system of linear equations.

## R

```
# solve
x <- solve(cov(mData), numeric(nA) + 1)
# rescale
x <- x / sum(x)
```

The resulting vector `x` should give the same weights.

# Internal Links

Concepts |

… |

Tutorials |

How to compute the tangency portfolio |

Tips |

… |

Related Articles |

… |

# External links

References |

1. Kempf, A. and C. Memmel (2006). Estimating the Global Minimum Variance Portfolio.
Schmalenbach Business Review 58, 332-348.2. R Development Core Team (2008).
R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing. http://www.R-project.org.3. Turlach, B.A. [S original] and A. Weingessel [R port] (2007).
quadprog: Functions to solve Quadratic Programming Problems. R package version 1.4-11. available from CRAN. |

Weblinks |

Gilli, M., Maringer, D., Schumann, E. (2011) . Numerical Methods and Optimization in Finance. Elsevier. http://www.elsevierdirect.com/ISBN/9780123756626/Numerical-Methods-and-Optimization-in-Finance |