1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| function [wOpt,kopt] = minimumVariance_acp(x,Kmax)
%purpose: this function runs the global minimum variance portfolio program with
% the inputs computed from a principal component analysis
%inputs: x is a (n,k) matrix of securities returns, with in each column the returns of
% a given security
% K is the maximal number of factors
%output: wOpt is the (k,1) vector of optimal portfolio weights
[n,p] = size(x);
Cov = cov(x,1);
%acp pour la valeur maximale (soit Kmax)
[EigenVectors,EigenValues] = pcacov(Cov);
ReturnsOfAxis = x*EigenVectors(:,1:Kmax);
Residuals = x-ReturnsOfAxis*EigenVectors(:,1:Kmax)';
sig2Kmax = mean(var(Residuals));
crit = ones(Kmax,1)*NaN;
for k=1:Kmax
% estimation des inputs par acp
[EigenVectors,EigenValues] = pcacov(Cov);
ReturnsOfAxis = x*EigenVectors(:,1:k);
Residuals = x-ReturnsOfAxis*EigenVectors(:,1:k)';
sig2k = mean(var(Residuals));
crit(k) = k*sig2k+k*sig2Kmax*((p+n)/(p*n))*log((p*n)/(p+n));
end
[val,idx] = min(crit);
kopt = idx;
%
[EigenVectors,EigenValues] = pcacov(Cov);
ReturnsOfAxis = x*EigenVectors(:,1:kopt);
Residuals = x-ReturnsOfAxis*EigenVectors(:,1:kopt)';
CovPCA = EigenVectors(:,1:kopt)*cov(ReturnsOfAxis,1)*EigenVectors(:,1:kopt)'+...
diag(diag(cov(Residuals,1)));
wOpt = (inv(CovPCA)*ones(p,1))/sum(inv(CovPCA)*ones(p,1)); |
Partager