CVAR Optimisation - Portfolio Weights and Iterations
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
Good Afternoon,
I'm trying to do a CVAR optimisation on 6 stock tickers and have no problems retrieving the data. However, my code seems to have the following issues:
1) Produces strange portfolio weights
2) Hits the iteration limit which I understand is 1000 . Is this normal?
I'm new to Matlab so would really appreciate guidance from more experienced users.
Linus
c = yahoo; ClosePriceBXMT = fetch(c,'BXMT','Close','08/01/15','08/25/10'); ClosePriceSTWD = fetch(c,'STWD','Close','08/01/15','08/25/10'); ClosePriceCLNY = fetch(c,'CLNY','Close','08/01/15','08/25/10'); ClosePriceSTAR = fetch(c,'STAR','Close','08/01/15','08/25/10'); ClosePriceRWT = fetch(c,'RWT','Close','08/01/15','08/25/10'); ClosePriceNRF = fetch(c,'NRF','Close','08/01/15','08/25/10');
pricematrix= [ClosePriceBXMT(:,2) ClosePriceSTWD(:,2) ClosePriceCLNY(:,2) ClosePriceSTAR(:,2) ClosePriceRWT(:,2) ClosePriceNRF(:,2)];
ScenRets = price2ret(pricematrix);
close(c);
%The code estimates the portfolio CVaR and the asset weights
%INPUTS: %The data matrix (historical returns or simulation) ScenRets size JxnAssets % the confidence level beta (scalar, between 0.9 and 0.999, usually o.95 or % 0.99) %the Upper Bounds for the weights in order to inforce diversification %R0 the portfolio target return [J, nAssets]=size(ScenRets); i=1:nAssets; beta=0.95; %change it if you want but stay between 0.9 and 0.999 UB=0.25; %the upper bound to force diversification, positive between (0,1) R0=0.03; %the target return ShortP=0; %If ShortP=1 allow for short positions, else if ShortP=0 only long positions are allowed %function to be minimized %w(31)=VaR objfun=@(w) w(nAssets+1)+(1/J)*(1/(1-beta))*sum(max(-w(i)*ScenRets(:,i)'-w(nAssets+1),0)); % initial guess w0=[(1/nAssets)*ones(1,nAssets)]; VaR0=abs(quantile(ScenRets*w0',1-beta)); % the initial guess for VaR is the %HS VaR of the equally weighted portfolio w0=[w0 VaR0]; % the (linear) equalities and unequalities matrixes A=[-mean(ScenRets) 0]; if ShortP==0 A=[A; -eye(nAssets) zeros(nAssets,1)]; A=[A; eye(nAssets) zeros(nAssets,1)]; b=[-R0 zeros(1,nAssets) UB*ones(1,nAssets)]; elseif ShortP==1 A=[A; -eye(nAssets) zeros(nAssets,1)]; A=[A; eye(nAssets) zeros(nAssets,1)]; b=[-R0 -LB*ones(1,nAssets) UB*ones(1,nAssets)]; elseif ShortP~=0|ShortP~=1 error('Input ShortP=1 (line14) if you allow short positions and 0 else!!')
end b=b'; Aeq=[ ones(1,nAssets) 0]; beq=[1];
options=optimset('LargeScale','off');
options=optimset(options,'MaxFunEvals',100000); [w,fval,exitflag,output]=fmincon(objfun,w0,A,b,Aeq,beq,[],[],[],options) portfWeights=zeros(1, nAssets); for i=1:nAssets % clear rounding errors if w(i)<0.0001 w(i)=0; end % save results to the workfile portfWeights(1,i)=w(i); end Risk=zeros(1,2); Risk(1,1)=w(nAssets+1); %Remember that w(31)= portfolio VaR Risk(1,2)=fval;
0 Kommentare
Antworten (1)
Johan Löfberg
am 12 Mai 2015
CVar from data is linear programming representable, so trying to to solve it as a non-smooth nonlinear program using a nonlinear solver is not a good idea. Just google cvar linear program and you will find a lot of material on how to solve these models.
0 Kommentare
Siehe auch
Kategorien
Mehr zu Portfolio Optimization and Asset Allocation 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!