Minimising the variance of a portfolio using weights of assets and covariance matrix
6 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Shaun King
am 5 Apr. 2020
Kommentiert: Shaun King
am 5 Apr. 2020
I have the formula for the variance of a portfolio
variance = transpose(weight)* covariance * weights
where the covariance(covR) is a 10*10 matrix and the weights(w) are a 10*1 matrix
I am trying to minimize the weights while having the constraints that the weights fall between 0 and 0.1
var = @ (w) w'*corR*w
I have tried to use the quadprog function, but I still can't seem to get the right answer.
Could anyone help ?
2 Kommentare
Thiago Henrique Gomes Lobato
am 5 Apr. 2020
Bearbeitet: Thiago Henrique Gomes Lobato
am 5 Apr. 2020
Why you believe you don't get the right answer? Quadprog should actually work, here is a minimalist example:
rng(42)
corR = randn(10,10);
corR = convR+eye(10)-diag(corR); % 1 diagonal
corR = 1/2*(corR+corR'); % Covariance is symmetric
lb = zeros(10,1);
up = ones(10,1)*0.1; % changing this to 0.08, 0.09 or other value may be helpful depending of your matrix
f = zeros(10,1); % no f
[x,fval,IsGlobalMin] = quadprog(corR,f,[],[],[],[],lb,up)
Akzeptierte Antwort
Thiago Henrique Gomes Lobato
am 5 Apr. 2020
If you have the additional constrain that the weights must sum to 1 than you must also increase the lower bound. Otherwise the only feasible solution is that all of them equal 0.1, so the sum is 1. Saying this you have an equality constrain that the sum of all weightings equal ones, this can be done using the Aeq and Beq options, a full example:
rng(42)
convR = randn(10,10);
convR = convR+eye(10)-diag(convR);
convR = 1/2*(convR+convR');
lb = zeros(10,1);
up = ones(10,1)*0.15;% changing this may be helpful depending of your matrix
f = zeros(10,1);
% Equality constrain
Aeq = zeros(10);
Aeq(1,1:10) = 1;
beq = zeros(10,1);
beq(1) = 1;
[x,fval,IsGlobalMin] = quadprog(convR,f,[],[],Aeq,beq,lb,up)
sum(x) % Sum of x
Aeq*beq % first element is sum of x
Another option in order to retain your initial constrain of 0.1 is just to normalize the result:
x = x/sum(x);
Weitere Antworten (1)
Ameer Hamza
am 5 Apr. 2020
Bearbeitet: Ameer Hamza
am 5 Apr. 2020
As Thiago pointed out, you can use Quadprog, and in this case, it will work, but the portfolio optimization model can become quite complex, which cannot be handled by quadprog. So this shows you a general way to handle your optimization problem, and implement the constraint that the sum of all portfolios should be one. Remember, in this case, the upper limit of 0.1 does not make sense because if there are 10 portfolios, then each one will take the value of 0.1, so I placed the upper limit of 1 on each portfolio.
A = ones(1,10); % A and B define A*x = B constraint
B = 1;
lb = zeros(size(corR,1), 1);
ub = ones(size(corR,1), 1);
obj_fun = @(w) w*corR*w'; % objective function
q = fmincon(obj_fun, rand(1,10), [], [], A, B, lb, ub);
0 Kommentare
Siehe auch
Kategorien
Mehr zu Linear Programming and Mixed-Integer Linear Programming finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!