Hello,
I wrote the following code that determines the weights maximizing a ratio. These weights should be positive given the constraint on variables:
var W{Assets_BY} >= 0 <= 0.1;
but many of them are actually negative (admittedly small, with order E-7). However, when I rescale them so that their sum is equal to 1, they are no longer negligible with the smaller value being equal to -0.135.
%let byvar = grp;
proc optmodel printlevel=0;
set OBS;
num grp {OBS};
set <string> Assets;
set <num,str> GROUPS_ASSETS;
number MVC{GROUPS_ASSETS, Assets};
read data Work.MVC into Assets=[Name];
read data Work.MVC into OBS=[_N_] grp;
read data Work.MVC nomiss into GROUPS_ASSETS=[k=grp i=Name] {j in Assets} <MVC[k,i,j]=col(j)>;
set BYSET = setof {i in OBS} &byvar.[i];
num by;
set OBS_BY = {i in OBS: &byvar.[i] = by};
set Assets_BY = setof {o in OBS_BY, <(grp[o]),a> in GROUPS_ASSETS} a;
var W{Assets_BY} >= 0 <= 0.1;
impvar Denom = sqrt(sum{i in Assets_BY, j in Assets_BY}W[i]*MVC[by,i,j]*W[j]);
maximize DR = log(sum{i in Assets_BY}W[i]*sqrt(MVC[by,i,i]) / Denom);
num W_sol {GROUPS_ASSETS};
do by = BYSET;
put by=;
solve;
for {i in Assets_BY} W_sol[by,i] = W[i].sol;
end;
create data Work.Weights_MD from [&byvar i] W=W_sol;
quit;
Thank you for any advice to obtain weights that respect the lower and upper bounds,
Best,
PS: if necessary, I will provide a small working example