Fmincon with Nested Optimization

I have to maximize the sharpe ratio, but my weights are given by an equation. I am not knowing how to connect that with fmincon
function [y] = w2(a) %function for weight
global avrcc avrco avroc avroo avrrvp avrtvl rcc rco roc roo tvl rvp i j n
y = a(1)*(rcc(i-1,j)-avrcc(i-1))./n...
+ a(2)*(roo(i,j)-avroo(i))./n...
+ a(3)*(roc(i-1,j)-avroc(i-1))./n ...
+ a(4)*(rco(i,j)-avrco(i))./n...
+ a(5)*(tvl(i-1,j)/avrtvl(i-1,j))*(rcc(i-1,j)-avrcc(i-1))./n...
+ a(6)*(tvl(i-1,j)/avrtvl(i-1, j))*(roo(i,j)-avroo(i))./n...
+ a(7)*(tvl(i-1,j)/avrtvl(i-1,j))*(roc(i,j)-avroc(i-1))./n...
+ a(8)*(tvl(i-1,j)/avrtvl(i-1,j))*(rco(i,j)-avrco(i))./n...
+ a(9)*(rvp(i-1,j)/avrrvp(i-1,j))*(rcc(i-1,j)-avrcc(i-1))./n...
+ a(10)*(rvp(i-1,j)/avrrvp(i-1,j))*(roo(i,j)-avroo(i))./n...
+ a(11)*(rvp(i-1,j)/avrrvp(i-1,j))*(roc(i-1,j)-avroc(i-1))./n...
+ a(12)*(rvp(i-1,j)/avrrvp(i-1,j))*(rco(i,j)-avrco(i))./n;
end
My function for sharpe ratio is as follows
function [y] = msharper(mu,Q,rf)
y = mu-rf/sqrt(w2(a)'*Q*w2(a));
end
I do not know how to apply fmincon such a way that I find the values of a vector.

2 Comments

It is not clear which variable you are optimizing over? Is it a ? If so then it should be an input to msharper()
Thank you for your response Walter, I am need to find values of a(1) through a(12). Such that that long equation is what I must plug-in for my weights in the second function.

Sign in to comment.

 Accepted Answer

Matt J
Matt J on 12 Sep 2018
Edited: Matt J on 12 Sep 2018
My approach would be to modify the functions as follows, taking into account Walter's remarks and also getting rid of the global variables,
function [y] = w2(a, avrcc, avrco, avroc, avroo, avrrvp,...
avrtvl, rcc, rco, roc, roo, tvl, rvp, i, j, n)
y = a(1)*(rcc(i-1,j)-avrcc(i-1))./n...
+ a(2)*(roo(i,j)-avroo(i))./n...
+ a(3)*(roc(i-1,j)-avroc(i-1))./n ...
+ a(4)*(rco(i,j)-avrco(i))./n...
+ a(5)*(tvl(i-1,j)/avrtvl(i-1,j))*(rcc(i-1,j)-avrcc(i-1))./n...
+ a(6)*(tvl(i-1,j)/avrtvl(i-1, j))*(roo(i,j)-avroo(i))./n...
+ a(7)*(tvl(i-1,j)/avrtvl(i-1,j))*(roc(i,j)-avroc(i-1))./n...
+ a(8)*(tvl(i-1,j)/avrtvl(i-1,j))*(rco(i,j)-avrco(i))./n...
+ a(9)*(rvp(i-1,j)/avrrvp(i-1,j))*(rcc(i-1,j)-avrcc(i-1))./n...
+ a(10)*(rvp(i-1,j)/avrrvp(i-1,j))*(roo(i,j)-avroo(i))./n...
+ a(11)*(rvp(i-1,j)/avrrvp(i-1,j))*(roc(i-1,j)-avroc(i-1))./n...
+ a(12)*(rvp(i-1,j)/avrrvp(i-1,j))*(rco(i,j)-avrco(i))./n;
end
function [y] = msharper(a, mu,Q,rf,weightfun)
y = mu-rf/sqrt(weightfun(a)'*Q*weightfun(a));
end
and then in the main workspace,
weightfun=@(a) w2(a, avrcc, avrco, avroc, avroo, avrrvp,...
avrtvl, rcc, rco, roc, roo, tvl, rvp, i, j, n);
a_opt = fmincon @(a) msharper(a, mu,Q,rf,weightfun), __________ );

1 Comment

Made a few mods, but the idea of eliminating the global variables helped for sure! Thank you

Sign in to comment.

More Answers (0)

Asked:

on 12 Sep 2018

Commented:

on 13 Sep 2018

Community Treasure Hunt

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

Start Hunting!