Search code examples
rquadprogr-portfolioanalytics

Quadratic optimization - portfolio maximization problems


In portfolio analysis, given the expectation, we aim to find the weight of each asset to minimize the variance

here is the code


install.packages("quadprog")
library(quadprog)

#Denoting annualized risk as an vector sigma
sigma <- c(0.56, 7.77, 13.48, 16.64)

#Formulazing the correlation matrix proposed by question
m <- diag(0.5, nrow = 4, ncol = 4)
m[upper.tri(m)] <- c(-0.07, -0.095, 0.959, -0.095, 0.936, 0.997)
corr <- m + t(m)
sig <- corr * outer(sigma, sigma)

#Defining the mean
mu = matrix(c(1.73, 6.65, 9.11, 10.30), nrow = 4)
m0 = 8


Amat <- t(matrix(c(1, 1, 1, 1,
                   c(mu),
                   1, 0, 0, 0,
                   0, 1, 0, 0,
                   0, 0, 1, 0,
                   0, 0, 0, 1), 6, 4, byrow = TRUE))
bvec <- c(1, m0, 0, 0, 0, 0)


qp <- solve.QP(sig, rep(0, nrow(sig)), Amat, bvec, meq = 2)
qp

x = matrix(qp$solution)
x
(t(x) %*% sig %*% x)^0.5

I understand the formulation of mu and covariance matrix and know the usage of the quadprog plot

However, I don‘t understand why Amat and bvec are defined in this way, why the are 6 by 4 matrix.

$mu0$ is the expectation we aim to have for the portfolio and it is fixed at value 8%

Attached is the questionenter image description here


Solution

  • As you are probably aware, the reason that Amat has four columns is that there are four assets that you are allocating over. It has six rows because there are six constraints in your problem:

    1. The allocations add up to 1 (100%)
    2. Expected return = 8%
    3. 'Money market' allocation >= 0
    4. 'Capital stable' allocation >= 0
    5. 'Balance' allocation >= 0
    6. 'Growth' allocation >= 0

    Look at the numbers that define each constraint. They are why bvec is [1, 8, 0, 0, 0, 0]. Of these six, the first two are equality constraints, which is why meq is set to 2 (the other four are greater than or equal constraints).

    Edited to add:

    The way the constraints work is this: each column of Amat defines a constraint, which is then multiplied by the asset allocations, with the result equal to (or greater-than-or-equal-to) some target that is set in bvec. For example:

    The first column of Amat is [1, 1, 1, 1], and the first entry of bvec is 1. So the first constraint is:

    1 * money_market + 1 * capital_stable + 1 * balance + 1 * growth = 1
    

    This is a way of saying that the asset allocations add up to 1.

    The second constraint says that the expected returns add up to 8:

    1.73 * money_market + 6.65 * capital_stable + 9.11 * balance + 10.32 * growth = 8
    

    Now consider the third constraint, which says that the 'Money market' allocation is greater than or equal to zero. That's because the 3rd column of Amat is [1, 0, 0, 0] and the third entry of bvec is 0. So this constraint looks like:

    1 * money_market + 0 * capital_stable + 0 * balance + 0 * growth >= 0
    

    Simplifying, that's the same as:

    money_market >= 0