optimal allocation of two assets by minimizing shortfall probability using fmincon

1 view (last 30 days)
I want to determine the optimal allocation of two assets (here "x") such that shortfall probability is minimized.
Shofrtfall probability is derived by applying condition that (if B<b) then sum all incidences and divide by total trials for each "t" and then finally sum the probability of all "t". The value of shortfall probability is 50.55.
When I run fmincon, I get fval=50.55 and the same initial guess of the two weights of two assets.
Following is my code.
%Defined constants inlcude m_e,v_e, m_b,v_b,rho, L,trials,b
x1 = 0.5; %weights of assets
x2 =0.5;
t =1:35; % columns
T = 35; % Total time
x = [eq_share, bd_share]; % total
%simulations
RNx1=normrnd(); % n x m normalized random numbers for first asset
RNx2=normrnd(); % n x m normalized random numbers for second asset
Returnx1= exp(m_e + v_e*(RNx1)); % return on first asset
Returnx2 = exp(m_b+(rho*v_b*RNx1+((1-rho^2)^0.5)*v_b*RNx2)); % return on second asset
Returnportfolio = x1*Returnx1+(x2)*Returnx2; % portfolio returns
W = max(L*Returnportfolio,0); % Matrix of wealth
B = min(b,L*Returnportfolio); % Realized Benefit
p= B<b
S=(cumsum(B<b, 2) == 1) .* (B<b)
shortfallprobability =sum(S)./trials
%% Optimal allocation
options = optimoptions('fmincon','Display','iter','Algorithm','sqp');
opts.Algorithm = 'sqp';
f = @(x) shortfallprobability
[n,fval] = fmincon(f,[0.5 0.5],[],[],[],[],[],[],[],options)
When I run the program, I get
function_handle with value:
@(x) sum((sum((cumsum(B<b,2)==1).*(B<b))./sim))
Iter Func-count Fval Feasibility Step Length Norm of First-order
step optimality
0 3 5.055392e-01 0.000e+00 1.000e+00 0.000e+00 0.000e+00
Initial point is a local minimum that satisfies the constraints.
Optimization completed because at the initial point, the objective function is non-decreasing
in feasible directions to within the value of the optimality tolerance, and
constraints are satisfied to within the value of the constraint tolerance.
<stopping criteria details>
n =
0.5 0.5
fval =
0.505539191954337
Can you please check the code and my mistake. I am sorry to bother as I have already spent much time on it but could not figure out.
Is my fmincon setup ok?
can I use fmincon for this problem?
Am I definining objective function wrongly?

Answers (1)

Alan Weiss
Alan Weiss on 31 Jul 2020
Edited: Alan Weiss on 31 Jul 2020
The problem is the you have not defined your objective function as a separate file that the optimization calls. You need to write a file something like this:
function f = shortfallprobability(x,RNx1,RNx2,m_e,m_b)
Returnx1= exp(m_e + v_e*(RNx1)); % return on first asset
Returnx2 = exp(m_b+(rho*v_b*RNx1+((1-rho^2)^0.5)*v_b*RNx2)); % return on second asset
Returnportfolio = x1*Returnx1+(x2)*Returnx2; % portfolio returns
W = max(L*Returnportfolio,0); % Matrix of wealth
B = min(b,L*Returnportfolio); % Realized Benefit
p = B<b
S = (cumsum(B<b, 2) == 1) .* (B<b)
f = sum(S)./trials
end
Take the corresponding lines out of your code. Then call the solver like this:
f = @(x)shortfallprobability(x,RNx1,RNx2,m_e,m_b);
[n,fval] = fmincon(f,[0.5 0.5],[],[],[],[],[],[],[],options)
Alan Weiss
MATLAB mathematical toolbox documentation
  1 Comment
susman
susman on 5 Aug 2020
Thank you for the suggestion. I am trying to do that but still getting the error that my initial function or varaible is unkown. I try to firgure it out and will tell you when the code will work.

Sign in to comment.

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!