I'm trying to run the optimization pasted below in optmodel. The program is running, whereas earlier I was getting an out of memory message. However, it is very slow. I tried to do what I could to make the code more efficient. Any other ideas?
On average, i=3,000. t=465 and k=3. One problem may be that I need to use 465 constraints, but I have to have these constraints in place. I can run a similar program in Proc IML in a fraction of the time, but Proc Optmodel is so flexible that I really need to migrate as much of my coding as possible. Thank you for whatever ideas you can offer.t
proc optmodel PRINTLEVEL=0;
*create a numerical index based on permno and date, read in below;
set <num,num> STOCKS_DATES;
*create another numerical index just based on dates;
set DATES = setof {<i,t> in STOCKS_DATES} t;
*create another numerical index just based on permnos;
set STOCKS {t in DATES} = slice(<*,t>, STOCKS_DATES);
*create a numerical index based on the characteristics upon which portfolio weights are based;
set CHARACTERISTICS = {'alpha', 'beta', 'stdfirm'};
*name variables that will be read in from the data set;
num char {STOCKS_DATES, CHARACTERISTICS};
num ret {STOCKS_DATES};
*read in the sas data set, specifying that each column in the char matrix is a different characteristic, k;
read data foriml into STOCKS_DATES=[permno obs]
{k in CHARACTERISTICS} <char[permno,obs,k]=col(k)>
ret;
var Theta {CHARACTERISTICS} init 0;
impvar portmean = (1/card(DATES)) * (sum {t in DATES} (sum {i in STOCKS
impvar portvar = (1/card(DATES)) * (sum {t in DATES}(((sum {i in STOCKS
impvar sumneg_w {t in DATES} = sum {i in STOCKS
con short50 {t in DATES}: sumneg_w
max Objective1 = portmean - (&y/2) * portvar;
Problem Prob1 Include Theta short50 Objective1;
USE PROBLEM Prob1;
solve with NLP OBJ Objective1 / ms;
You might try making portmean an explicit variable instead, to reduce the density of the expression for portvar. Replace the impvar portmean statement with:
var portmean;
con portmean_con:
portmean = (1/card(DATES)) * (sum {t in DATES} (sum {i in STOCKS
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.
Learn how to run multiple linear regression models with and without interactions, presented by SAS user Alex Chaplin.
Find more tutorials on the SAS Users YouTube channel.