Code covered by the BSD License

Fully Flexible Views and Stress-testing

Attilio Meucci (view profile)

02 Sep 2008 (Updated )

Full generalization of Black-Litterman and related techniques via entropy pooling

LongShortMeanCVaRFrontier(PnL,Probs,Butterflies,Options)
```function [Exp,SDev,CVaR,Composition] = LongShortMeanCVaRFrontier(PnL,Probs,Butterflies,Options)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% set up constraints
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[J,N]=size(PnL);
P_0s=[];
D_s=[];
for n=1:N
P_0s=[P_0s Butterflies(n).P_0];
D_s=[D_s Butterflies(n).Delta];
end

Constr.Aeq=P_0s;
Constr.beq=Options.Budget;
if Options.DeltaNeutral
Constr.Aeq=[Constr.Aeq
D_s];
Constr.beq=[Constr.beq
0];
end
Constr.Aleq=[diag(P_0s)
-diag(P_0s)];
Constr.bleq=[Options.Limit*ones(N,1)
Options.Limit*ones(N,1)];

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% determine expectation of minimum-variance portfolio
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Exps=PnL'*Probs;
Scnd_Mom=PnL'*(PnL.*(Probs*ones(1,N))); Scnd_Mom=(Scnd_Mom+Scnd_Mom')/2;
Covs=Scnd_Mom-Exps*Exps';

MinSDev_Exp=MinSDev_Units'*Exps;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% determine expectation of maximum-expectation portfolio
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MaxExp_Units = linprog(-Exps,Constr.Aleq,Constr.bleq,Constr.Aeq,Constr.beq);
MaxExp_Exp=MaxExp_Units'*Exps;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% slice efficient frontier in NumPortf equally thick horizontal sections
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Grid=[Options.FrontierSpan(1) : (Options.FrontierSpan(end)-Options.FrontierSpan(1))/(Options.NumPortf-1) : Options.FrontierSpan(end)];
TargetExp=MinSDev_Exp + Grid*(MaxExp_Exp-MinSDev_Exp);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% compute composition, expectation, s.dev. and CVaR of the efficient frontier
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Composition=[];
Exp=[];
SDev=[];
CVaR=[];
for i=1:Options.NumPortf

% determine least risky portfolio for given expectation
AEq=[Constr.Aeq
Exps'];
bEq=[Constr.beq
TargetExp(i)];

% store results
Composition=[Composition
Units'];

Exp=[Exp
Units'*Exps];
SDev=[SDev
sqrt(Units'*Covs*Units)];
CVaR=[CVaR
ComputeCVaR(Units,PnL,Options.Quant)];
end```