SAS Optimization, and SAS Simulation Studio

turn on suggestions

Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.

Showing results for

Find a Community

Topic Options

- RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page

- Mark as New
- Bookmark
- Subscribe
- RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

06-20-2013 01:47 PM

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;

- Mark as New
- Bookmark
- Subscribe
- RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

Posted in reply to opti_miser

07-04-2013 12:49 PM

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