===== Cvičení 10 ===== [[https://cw.felk.cvut.cz/lib/exe/fetch.php/courses/a4b33opt/cviceni/markowitz.pdf?id=courses%3Aa4b33opt%3Acviceni%3Astart&cache=cache|Zadání (Markowitzův model)]] * bacha na to, zadání se změnilo, stáhněte si ze stránek předmětu [[http://cw.felk.cvut.cz/lib/exe/fetch.php/courses/a4b33opt/cviceni/markowitz_24nov09.pdf?id=courses%3Aa4b33opt%3Acviceni%3Astart&cache=cache|aktuální verzi]] 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). --- //[[zacham3@fel.cvut.cz|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; ~~DISCUSSION~~