<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic minimising Value at Risk - Thread 2 in Mathematical Optimization, Discrete-Event Simulation, and OR</title>
    <link>https://communities.sas.com/t5/Mathematical-Optimization/minimising-Value-at-Risk-Thread-2/m-p/960733#M4298</link>
    <description>&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/1636"&gt;@RobPratt&lt;/a&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Following the previous thread I made some advance on this project. I wrote a small document explaining the concepts and a small mathematical model to understand what I am trying to accomplish. The point I am stuck now is the following:&lt;/P&gt;&lt;P&gt;1) READ DATA for historical values. I found a way to it, but I am not sure it is correct. Anyway when I define the vector I am trying to optimise, it throws an error. The data has 3 dimensions, date, asset, period and I READ the information putting together Asset/Data (ATIVO_DATE), but in the end I need them separately. I could not find a way to read it that way.&lt;/P&gt;&lt;P&gt;2) I used an implicit variable to calculate the final vector to be minimised. It does not show any error, but when I use expand to check its contents it does not show.&lt;/P&gt;&lt;P&gt;3) I believe these problems are preventing the solver to work.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The code follows and I commented it to help you to understand it more easily. The files I used as well as the document I wrote are attached.&lt;/P&gt;&lt;P&gt;===== Code ====&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* we kept some words in Portuguese as in the original data&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Portuguese vs English&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;ativo = asset&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;data = date&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;DATA max_limits;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;input ativo $ val_max;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;datalines;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Nickel 5.5&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Tin 2.2&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;%let max_metals=6.0;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* the following macro variables are not used yet, since we are validating the model&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;with only two metal commodities*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;%let max_agri=12;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;%let max_total=20;*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;PROC OPTMODEL;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* Read historic and constraints table from WORKLIB */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* LIM_METALS contains the max values by asset/period&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;and the max of total assets by type (in this case METALS)&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;per period */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;set &amp;lt;str&amp;gt; PERIODS=/_1M _3M _6M _9M _1Y _2Y _3Y/;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;set &amp;lt;str&amp;gt; COMMS;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;num lim_metals {COMMS, PERIODS};&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;read data WORK.LIM_METAL into COMMS=[commodity] {j in PERIODS} &amp;lt;lim_metals[commodity, j]=col(j)&amp;gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;print lim_metals;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* tried to do it like this, but it did not work&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;set DATES;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;num hist_data {DATES, COMMS, PERIODS};&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;read data WORK.SANTANDER_HIST into [date ativo] {j in PERIODS} &amp;lt;hist_data[date, j, ativo]=col(j)&amp;gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;print hist_data;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/*this one works, but not how I intended to. The periods were moved as a single column */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;set &amp;lt;num&amp;gt; DATES;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* added the above statement just to test. I do not think it is correct*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;set &amp;lt;str, num&amp;gt; ATIVOS_DATES;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;num hist_asset{ATIVOS_DATES, PERIODS};&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;read data WORK.santander_hist_3 INTO ATIVOS_DATES=[ativo date]&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;{period in PERIODS} &amp;lt;hist_asset[ativo, date, period]=col(period)&amp;gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;print hist_asset;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;num val_max{COMMS};&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;read data max_limits INTO COMMS=[ativo] val_max;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;print val_max;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* variables to optimise and constraints */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;var amount{COMMS, PERIODS} &amp;gt;= 0;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* not quite sure the following IMPVAR statement has worked&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;it does not show on expand and when I call the solver it throws an error.*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;impvar amount_date_comm_period {date in DATES}=sum{comm in COMMS,period in PERIODS} amount[comm,period]*hist_asset[comm,date,period];&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* the followin IMPVAR statemente seems to work fine*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;impvar total_comm {comm in COMMS}=sum{period in PERIODS} amount[comm, period];&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* BEFORE impvars. Kept it for test purposes.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;con lim_comm {comm in COMMS}: sum{period in PERIODS} amount[comm, period]&amp;lt;= val_max[comm];&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Replaced this line with the IMPVAR defined above*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;con lim_comm {comm in COMMS}: total_comm[comm] &amp;lt;= val_max[comm];&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;con lim_total: sum{comm in COMMS} total_comm[comm] &amp;lt;= &amp;amp;max_metals;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;expand;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* Objective Function */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;min value_at_risk= smallest(6, of amount_date_comm_period[*]);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;solve with nlp /algorithm=as ms;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Mon, 03 Mar 2025 15:18:53 GMT</pubDate>
    <dc:creator>feresm</dc:creator>
    <dc:date>2025-03-03T15:18:53Z</dc:date>
    <item>
      <title>minimising Value at Risk - Thread 2</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/minimising-Value-at-Risk-Thread-2/m-p/960733#M4298</link>
      <description>&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/1636"&gt;@RobPratt&lt;/a&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Following the previous thread I made some advance on this project. I wrote a small document explaining the concepts and a small mathematical model to understand what I am trying to accomplish. The point I am stuck now is the following:&lt;/P&gt;&lt;P&gt;1) READ DATA for historical values. I found a way to it, but I am not sure it is correct. Anyway when I define the vector I am trying to optimise, it throws an error. The data has 3 dimensions, date, asset, period and I READ the information putting together Asset/Data (ATIVO_DATE), but in the end I need them separately. I could not find a way to read it that way.&lt;/P&gt;&lt;P&gt;2) I used an implicit variable to calculate the final vector to be minimised. It does not show any error, but when I use expand to check its contents it does not show.&lt;/P&gt;&lt;P&gt;3) I believe these problems are preventing the solver to work.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The code follows and I commented it to help you to understand it more easily. The files I used as well as the document I wrote are attached.&lt;/P&gt;&lt;P&gt;===== Code ====&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* we kept some words in Portuguese as in the original data&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Portuguese vs English&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;ativo = asset&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;data = date&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;DATA max_limits;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;input ativo $ val_max;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;datalines;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Nickel 5.5&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Tin 2.2&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;%let max_metals=6.0;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* the following macro variables are not used yet, since we are validating the model&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;with only two metal commodities*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;%let max_agri=12;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;%let max_total=20;*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;PROC OPTMODEL;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* Read historic and constraints table from WORKLIB */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* LIM_METALS contains the max values by asset/period&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;and the max of total assets by type (in this case METALS)&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;per period */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;set &amp;lt;str&amp;gt; PERIODS=/_1M _3M _6M _9M _1Y _2Y _3Y/;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;set &amp;lt;str&amp;gt; COMMS;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;num lim_metals {COMMS, PERIODS};&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;read data WORK.LIM_METAL into COMMS=[commodity] {j in PERIODS} &amp;lt;lim_metals[commodity, j]=col(j)&amp;gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;print lim_metals;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* tried to do it like this, but it did not work&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;set DATES;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;num hist_data {DATES, COMMS, PERIODS};&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;read data WORK.SANTANDER_HIST into [date ativo] {j in PERIODS} &amp;lt;hist_data[date, j, ativo]=col(j)&amp;gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;print hist_data;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/*this one works, but not how I intended to. The periods were moved as a single column */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;set &amp;lt;num&amp;gt; DATES;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* added the above statement just to test. I do not think it is correct*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;set &amp;lt;str, num&amp;gt; ATIVOS_DATES;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;num hist_asset{ATIVOS_DATES, PERIODS};&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;read data WORK.santander_hist_3 INTO ATIVOS_DATES=[ativo date]&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;{period in PERIODS} &amp;lt;hist_asset[ativo, date, period]=col(period)&amp;gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;print hist_asset;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;num val_max{COMMS};&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;read data max_limits INTO COMMS=[ativo] val_max;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;print val_max;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* variables to optimise and constraints */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;var amount{COMMS, PERIODS} &amp;gt;= 0;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* not quite sure the following IMPVAR statement has worked&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;it does not show on expand and when I call the solver it throws an error.*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;impvar amount_date_comm_period {date in DATES}=sum{comm in COMMS,period in PERIODS} amount[comm,period]*hist_asset[comm,date,period];&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* the followin IMPVAR statemente seems to work fine*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;impvar total_comm {comm in COMMS}=sum{period in PERIODS} amount[comm, period];&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* BEFORE impvars. Kept it for test purposes.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;con lim_comm {comm in COMMS}: sum{period in PERIODS} amount[comm, period]&amp;lt;= val_max[comm];&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Replaced this line with the IMPVAR defined above*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;con lim_comm {comm in COMMS}: total_comm[comm] &amp;lt;= val_max[comm];&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;con lim_total: sum{comm in COMMS} total_comm[comm] &amp;lt;= &amp;amp;max_metals;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;expand;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* Objective Function */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;min value_at_risk= smallest(6, of amount_date_comm_period[*]);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;solve with nlp /algorithm=as ms;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 03 Mar 2025 15:18:53 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/minimising-Value-at-Risk-Thread-2/m-p/960733#M4298</guid>
      <dc:creator>feresm</dc:creator>
      <dc:date>2025-03-03T15:18:53Z</dc:date>
    </item>
    <item>
      <title>Re: minimising Value at Risk - Thread 2</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/minimising-Value-at-Risk-Thread-2/m-p/960799#M4299</link>
      <description>&lt;P&gt;If you want hist_asset to depend on DATES,&amp;nbsp;&lt;SPAN&gt;COMMS, and PERIODS, you must first populate all three index sets before you populate the parameter.&amp;nbsp; You already populated COMMS and PERIODS, so you just need DATES:&lt;/SPAN&gt;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;set DATES;
read data WORK.santander_hist_3 into DATES=[date];
num hist_asset {DATES, COMMS, PERIODS};
read data WORK.santander_hist_3 into [date ativo] {j in PERIODS} &amp;lt;hist_asset[date, ativo, j]=col(j)&amp;gt;;
print hist_asset;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;For the IMPVAR, you have the indices of hist_asset out of order:&lt;/SPAN&gt;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;/*impvar amount_date_comm_period {date in DATES}=sum{comm in COMMS,period in PERIODS} amount[comm,period]*hist_asset[comm,date,period];*/
impvar amount_date_comm_period {date in DATES}=sum{comm in COMMS,period in PERIODS} amount[comm,period]*hist_asset[date,comm,period];
&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Mon, 03 Mar 2025 22:16:33 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/minimising-Value-at-Risk-Thread-2/m-p/960799#M4299</guid>
      <dc:creator>RobPratt</dc:creator>
      <dc:date>2025-03-03T22:16:33Z</dc:date>
    </item>
    <item>
      <title>Re: minimising Value at Risk - Thread 2</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/minimising-Value-at-Risk-Thread-2/m-p/960871#M4300</link>
      <description>&lt;P&gt;Hi Rob, thanks for your time again. It seems that I have a problem with the other of the parameters. Anyway, I did as you said, with a slight modification. The first change sort of worked, and the second did not.&lt;/P&gt;&lt;P&gt;The read data for the Santander_hist_3 worked, but the table was like in the figure I attached. Instead of having several columns for the periods it sort of transposed them for lines. Also , there were warnings of duplicate regarding the dates, which I believe are harmless because the compound keys (date, asset) are unique. I attached a printout together with the lim_metals, which worked ok. I don't mind if this still works to identify the data.&lt;/P&gt;&lt;P&gt;Fot the IMPVAR id did not work, I guess. the expand command does not show it and when I uncomment the solver statement it throws an error (attached it too).&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Any lights on these? Thank you again.&lt;/P&gt;&lt;P&gt;=======here is the code======&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* we kept some words in Portuguese as in the original data&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Portuguese vs English&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;ativo = asset&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;data = date&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;DATA max_limits;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;input ativo $ val_max;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;datalines;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Nickel 5.5&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Tin 2.2&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;%let max_metals=6.0;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* the following are not used yet since we are validating the model&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;with only two metal commodities*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;%let max_agri=12;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;%let max_total=20;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;PROC OPTMODEL;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* Read historic and constraints table from WORKLIB */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* LIM_METALS contains the max values by asset/period&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;and the max of total assets by type (in this case METALS)&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;per period */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;set &amp;lt;str&amp;gt; PERIODS=/_1M _3M _6M _9M _1Y _2Y _3Y/;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;set &amp;lt;str&amp;gt; COMMS;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;num lim_metals {COMMS, PERIODS};&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;read data WORK.LIM_METAL into COMMS=[commodity] {j in PERIODS} &amp;lt;lim_metals[commodity, j]=col(j)&amp;gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;print lim_metals;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* test number 1&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;set DATES;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;read data WORK.santander_hist_3 into DATES=[date];&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;num hist_data {DATES, COMMS, PERIODS};&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;read data WORK.SANTANDER_HIST into [date ativo] {j in PERIODS} &amp;lt;hist_data[date,ativo,j]=col(j)&amp;gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;print hist_data;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/*this one works, but not how I intended to. The periods were moved as a single column&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;set &amp;lt;num&amp;gt; DATES;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;set &amp;lt;str, num&amp;gt; COMMS_DATES;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;num hist_data{COMMS_DATES, PERIODS};&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;read data WORK.santander_hist_3 INTO COMMS_DATES=[ativo date]&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;{period in PERIODS} &amp;lt;hist_data[ativo, date, period]=col(period)&amp;gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;print hist_data;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* test number 3*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;set &amp;lt;num&amp;gt; DATES;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;num hist_data{DATES, COMMS, PERIODS};&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;read data WORK.Santander_hist_3 into DATES=[date];&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;read data WORK.Santander_hist_3 into COMMS=[ativo];&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;read data WORK.SANTANDER_HIST into [date ativo] {j in PERIODS} &amp;lt;hist_data[date,ativo,j]=col(j)&amp;gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;print hist_data;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;num val_max{COMMS};&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;read data max_limits INTO COMMS=[ativo] val_max;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;print val_max;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* variables to optimise and constraints */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;var amount{COMMS, PERIODS} &amp;gt;= 0;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* not quite sure the following IMPVAR statement has worked&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;it does not show on expand and when I call the solver it throws an error.*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;impvar amount_date_comm_period {date in DATES}=sum{comm in COMMS,period in PERIODS} amount[comm,period]*hist_data[date,comm,period];&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* the following IMPVAR statement seems to work fine*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;impvar total_comm {comm in COMMS}=sum{period in PERIODS} amount[comm, period];&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* BEFORE impvars. Kept it for test purposes.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;con lim_comm {comm in COMMS}: sum{period in PERIODS} amount[comm, period]&amp;lt;= val_max[comm];&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;Replaced this line with the IMPVAR defined above*/&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;con lim_comm {comm in COMMS}: total_comm[comm] &amp;lt;= val_max[comm];&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;con lim_total: sum{comm in COMMS} total_comm[comm] &amp;lt;= &amp;amp;max_metals;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;expand;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;/* Objective Function */&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;min value_at_risk= smallest(6, of amount_date_comm_period[*]);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;solve with nlp /algorithm=as ms;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;=======the table remain the same =======&lt;/P&gt;</description>
      <pubDate>Tue, 04 Mar 2025 18:22:30 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/minimising-Value-at-Risk-Thread-2/m-p/960871#M4300</guid>
      <dc:creator>feresm</dc:creator>
      <dc:date>2025-03-04T18:22:30Z</dc:date>
    </item>
    <item>
      <title>Re: minimising Value at Risk - Thread 2</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/minimising-Value-at-Risk-Thread-2/m-p/961707#M4301</link>
      <description>&lt;P&gt;Looks like you just need to read the correct data set:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;/*read data WORK.SANTANDER_HIST into [date ativo] {j in PERIODS} &amp;lt;hist_data[date,ativo,j]=col(j)&amp;gt;;*/
read data WORK.SANTANDER_HIST_3 into [date ativo] {j in PERIODS} &amp;lt;hist_data[date,ativo,j]=col(j)&amp;gt;;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;With this change, the ERROR messages no longer appear.&lt;/P&gt;</description>
      <pubDate>Wed, 12 Mar 2025 18:32:14 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/minimising-Value-at-Risk-Thread-2/m-p/961707#M4301</guid>
      <dc:creator>RobPratt</dc:creator>
      <dc:date>2025-03-12T18:32:14Z</dc:date>
    </item>
  </channel>
</rss>

