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)![\begin{split} \max_{w} \frac{\mu'w-r_f}{\sqrt{w' \Sigma w}}\\[1.2ex] w'\iota = 1 \end{split}](/local--math/eqs/b4912ba3145e3a583077923ba80a5c23.png)
where
is the vector of portfolio weights,
is the variance-covariance matrix of the assets, and
is an appropriately-sized vector of ones. The vector
holds the assets' means,
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
is larger than
; 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
is a vector of ones,
holds in its columns the excess returns of the assets (each row is one observation), and
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. 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 |
| … |