Cvičení 10

Zadání (Markowitzův model)

Ke spolecnemu vypracovani:

clc;
clear;
close all;
%% Markowitzùv model
% 1 Nacteni dat
load akcie.mat;
% init
[T,I] = size(AkcieOdhad);
% vynosy akcii za cas
r = zeros(I,T);
vyberR = zeros(I,1);
p = 1/(T-1);
p2 = 1/(T-2);
for i=1:I
    for t=2:T
        r(i,t)= (AkcieOdhad(t,i) - AkcieOdhad(t-1,i))/(AkcieOdhad(t-1,i));
    end;
    vyberR(i) = p*sum(r(i,[2:T]));
end;
 
V = zeros (I);
 
for i=1:I
    for j=1:I
        V(i,j) = p2 * ( r(i,:) - vyberR(i) )*(( r(j,:) - vyberR(j) )');
    end;
end;
 
%% 3
% Interpretujte význam omezujících podmínek problému
%
% sum(X(i))=1   ... X(i) ~ vahy akcii i = jaky objem z celkove sumy investovat
%                                         do akcie i
%               ... mame predem danou sumu - tu pak delime podle x, takze
%               cela suma je 1*SUMA = SUMA, rozdeleni na 2 je pak X(1)*SUMA
%               + X(2)*SUMA = SUMA ... analogicky pro N
%
% X(i) >= 0     ... nelze nakoupit zaporny objem akcii...
%
% sum( X(i) * R(i) ) >= Rp ... Rp je pozadovany minimalni vynos, soucet
% vynosu z jednotlivych akcii musi dat minimalne Rp
%
%% 4
% Jak by se zmenila formulace problemu (1), pokud bychom chteli investovat do
% kazde akcie maximálne 30% z celkove hodnoty portfolia ?
%
% pribyla by jeste podminka X(i) <= 0.3
%
%% 5
MinRp = min(vyberR);
MaxRp = max(vyberR);
r_p = [MinRp : (MaxRp-MinRp)/50 : MaxRp ];
cnt = size(r_p);
rp = 0.02;
 
riziko = zeros(cnt);
vynos = zeros(cnt);
 
H = V;
f = zeros (I,1);
A = -vyberR';
Aeq = ones(1,I);
beq = 1;
lb = zeros(1,I);
ub = ones(1,I);
 
for i=1:cnt(2)
    rp = r_p(i);
    b = -rp;
    [x,fval] = quadprog(H,f,A,b,Aeq,beq,lb,ub);
    vynos(i) = x'*vyberR;
    riziko(i) = 2*fval;
end
plot(riziko, vynos);

Prosim editujte a komentujte…

Tak moje řešení včetně šestky. Ale ta se asi počítá poněkud špatně. Každopádně u nás na cviku to prošlo. Zřejmě je tam naopak to rovnoměrné rozložení a váhové rozložení, které by mělo být úplně nahoře (nejlepší výsledky). — Martin Zachar 2009/11/26 18:38

clear vars;
close all;
clear all;
clc;
load akcie.mat;
 
%% 1 Vypocet parametru Markowitzova modelu
 
[aoH, aoW] = size(AkcieOdhad);
 
r = (AkcieOdhad((aoH - 1) : -1: 1, :) - AkcieOdhad(aoH : -1 : 2, :)) ./ AkcieOdhad(aoH : -1 : 2, :);
rprum = 1 / (aoH - 1) * sum (r);
 
r = r';
rprum = rprum';
 
V = zeros(aoW);
 
for i = 1 : aoW
    for j = 1 : aoW        
        V(i,j) = 1 / (aoH - 2) * sum ((r(i, :) - rprum(i)) * (r(j,:) - rprum(j))');        
    end;
end;
 
%% 5 Vypocet, kolik koupit akcii od ktere spolecnosti
 
r_p = min(rprum) : (max(rprum) - min(rprum)) / 50 : max(rprum);
 
Aeq = ones(1, aoW);
beq = 1;
 
lb = zeros(1, aoW);
A = -rprum';
b = - r_p;
f = zeros(1, aoW);
 
rx = zeros(size(r_p));
sigma = zeros(size(r_p));
 
for i = 1 : size(r_p,2)
    [x, fval] = quadprog(V, f, A, b(1,i), Aeq, beq, lb, []);
    rx(i) = x' * rprum;
    sigma(i) = 2*fval;
end;
 
 
figure;
hold on;
title('Zavislost r(x) na sigma');
xlabel('risk \sigma^2(x)');
ylabel('r(x)');
plot(sigma, rx, '-');
hold off;
 
 
%% 6 a) Od kazde spolecnosti nakoupim stejne akcii
clc; %close all;
x = ones(1,aoW) / aoW;
vklad = AkcieOdhad(1, :) .* x;
 
vynos = zeros(size(AkcieTest));
 
for i = size(AkcieTest,1) : -1 : 1
    vynos(i, :) = AkcieTest(i, :).*x - vklad;
end;
 
vynos = flipud(vynos);
 
figure;
hold on;
title('Celkovy vynos za jednotlive mesice');
xlabel('Mesice');
ylabel('Vynos');
plot(sum(vynos, 2), '-ro');
 
%% 6 quadprog - vypoctu vahy jako v uloze 5 a podle toho nakoupim akcie
 
r_p = 0.037;
b = - r_p;
 
x = quadprog(V, f, A, b, Aeq, beq, lb, []);
vklad = AkcieOdhad(1, :) .* x';
vynos = zeros(size(AkcieTest));
 
for i = size(AkcieTest,1) : -1 : 1
    vynos(i, :) = AkcieTest(i, :).*x' - vklad;
end;
 
vynos = flipud(vynos);
 
xlabel('Mesice');
ylabel('Vynos');
plot(sum(vynos, 2), '-go');
 
 
%% 6 b) Najdu nejsilnejsi spolecnot a do te dam vsechno
 
maximum = max(x);
for i = 1 : size(x, 1)
    if x(i) == maximum
        x(i) = 1;
    else
        x(i) = 0;
    end;
end;
 
vklad = AkcieOdhad(1, :) .* x';
vynos = zeros(size(AkcieTest));
 
for i = size(AkcieTest,1) : -1 : 1
    vynos(i, :) = AkcieTest(i, :).*x' - vklad;
end;
 
vynos = flipud(vynos);
 
plot(sum(vynos, 2), '-bo');
 
h = legend('rovnomerne rozlozeni', 'investice podle vah', 'investovani do nejocekavanejsiho', 'Location', 'Best');
set(h,'Interpreter', 'none');
hold off;