Hi, I am using the following code to minimize the variance of the following optimization problem;
min VAR(R.f - SUM[w_i * R.s_i]) = min VAR(F - w*S)
s.t. SUM(w_i) = 1; w_i > 0
where:
R.f Fund returns
R.s Style returns
w_i Style weights
I am using the following code for this. This code works perfectly fine, but I want to run this using a by variable (by permno). When I add permno to my data, it tends to calculate treat it as a dependent variable but rather I want to use it as a by variable only.
Any suggestions on how to modify this and run my optimization using by variables?
proc corr data=return1 (drop=date)
out=corrout(where=(_type_ ne 'CORR')) cov noprint;
run;
data stats(drop=_name_);
set corrout;
if _type_ = 'COV' then delete;
run;
proc transpose data=stats out=stats;
id _type_;
run;
proc optmodel;
/* declare parameters and read data */
set <str> ASSETS;
str target = 'f';
set BENCH = ASSETS diff {target};
num cov {ASSETS, ASSETS};
read data stats into ASSETS=[_name_];
read data corrout(where=(_type_='COV')) into [_name_]
{i in ASSETS} <cov[_name_,i]=col(i)>;
/* let w1, w2, w3, w4 be the amount invested in each asset */
var x{1..4} >= 0;
/* declare optimization model */
var W {BENCH} >= 0 <= 1;
/* Var(X - Y) = Var(X) + Var(Y) - 2 Cov(X,Y) */
min Variance =
sum {i in BENCH, j in BENCH} cov[i,j] * W[i] * W[j]
+ cov[target,target]
- 2 * sum {i in BENCH} cov[i,target] * W[i];
/* subject to the following constraints */
con weights: sum {i in BENCH} W[i] = 1;
/* call solver and print optimal solution */
solve;
print W;
quit;