matlaboptimizationconstraintslinear-programmingquadprog

How to define a negative constraint only in Aeq * X <= Beq


I am using quadprog link to find a portfolio of optimal weights.

So far, I have managed to implement a long only constraint (i.e. weights cannot be smaller than zero w >= 0 and w1 + w2 + ... wN = 1) as follows:

FirstDegree             = zeros(NumAssets,1);
SecondDegree            = Covariance;
Aeq                     = ones(1,NumAssets);
beq                     = 1;
A                       = -eye(NumAssets);
b                       = zeros(NumAssets,1);

x0                      = 1/NumAssets*ones(NumAssets,1);
MinVol_Weights          = quadprog(SecondDegree,FirstDegree,A,b,Aeq,beq,[],[],x0, options);

I am now tring to setup a short-only constraints, i.e. all the weights need to add up to -1 and they should be all strict smaller or equal to zero. How can this be rewritten?


Solution

  • Note that you can rewrite any “greater than” inequality a ≥ b into a “less than” inequality -a ≤ -b by flipping signs. In your example, choose

    Aeq = ones(1,NumAssets);
    beq = -1;
    A   = eye(NumAssets);
    b   = zeros(NumAssets,1);
    

    That means Aeq*w == w(1) + w(2) + … + w(NumAssets) == -1, and A*w <= 0 which is the same as saying w(i) <= 0 for all i.