Author
Keywords
portfolio optimisation
Review Status
draft
Introduction
The tangency portfolio is the portfolio that maximises the Sharpe ratio, ie, it is obtained from
(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. The vector $\mu$ holds the assets' means, $$r_f$$ is the riskfree rate (assumed to be a constant). There are no further constraints on the problem, in particular, short sales are allowed here.
The optimisation makes sense only if there exists at least ones portfolio for which $\mu'w$ is larger than $r_f$; otherwise, excess return is negative and no one would want to hold risky assets.
Using a QP solver
R
We use the quadprog package for R (see the references below).
require(quadprog)
# create artifical data
nO <- 100 # number of observations
nA <- 10 # number of assets
mData <- array(rnorm(nO * nA, mean = 0.001, sd = 0.01), dim = c(nO, nA))
rf <- 0.0001 # riskfree rate (2.5% pa)
mu <- apply(mData, 2, mean) # means
mu2 <- mu - rf # excess means
# qp
aMat <- as.matrix(mu2)
bVec <- 1
zeros <- array(0, dim = c(nA,1))
solQP <- solve.QP(cov(mData), zeros, aMat, bVec, meq = 1)
# rescale variables to obtain weights
w <- as.matrix(solQP$solution/sum(solQP$solution))
# compute sharpe ratio
SR <- t(w) %*% mu2 / sqrt(t(w) %*% cov(mData) %*% w)
A regression representation
Britten-Jones [1] showed that the same results can be obtained by running the following regression
(2)Here $1$ is a vector of ones, $X$ holds in its columns the excess returns of the assets (each row is one observation), and $\varepsilon$ holds the remaining errors.
The obtained regression weights need to be rescaled, ie,
(3)R
# (...continued)
##
# regression
# compute excess returns
X <- mData - rf
ones <- array(1, dim = c(100,1))
# run regression
solR <- lm(ones~-1 + X)
# rescale
w2 <- coef(solR)
w2 <- w2/sum(w2)
Solving a system of linear equations
The weights can also be found by solving a system of linear equations.
R
# (...continued)
# solve
w3 <- solve(cov(mData),mu2)
# rescale
w3 <- w3/sum(w3)
All three methods should give the same results:
# (...continued)
#qp
as.vector(w)
# regression
as.vector(w2)
# linear equations
as.vector(w3)
# check
all.equal(as.vector(w),as.vector(w2))
all.equal(as.vector(w),as.vector(w3))
all.equal(as.vector(w2),as.vector(w3))
Internal Links
| Concepts |
| … |
| Tutorials |
| How to compute the global minimum-variance portfolio |
| Tips |
| … |
| Related Articles |
| … |
External links
| References |
|
1. Britten-Jones, M. (1999). The Sampling Error in Estimates of Mean-Variance Efficient Portfolio Weights. Journal of Finance 64, 655-671.
2. Gilli, M., D. Maringer and E. Schumann. (2011). Numerical Methods and Optimization in Finance. Elsevier.
3. R Development Core Team (2008). R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing. http://www.R-project.org.
4. 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 |
| … |