<?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 3 in Mathematical Optimization, Discrete-Event Simulation, and OR</title>
    <link>https://communities.sas.com/t5/Mathematical-Optimization/minimising-Value-At-Risk-thread-3/m-p/965526#M4322</link>
    <description>&lt;P&gt;back to this subject I am now beyond the READ DATA issues, I guess. However, when I run the code I got two data errors as in the files attached and a semantic error from the solver. I tried both options, using the smallest function and the percentile. The result is the same. Also, the expand does not show the objective function, but shows the constraints just fine. The main difficulty, I guess, is that when optimising I do not need the commodities anymore (COMMS), just the date.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Any help? Thanks, Marcio.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;this is the code:&lt;/P&gt;&lt;P&gt;DATA max_limits;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;input ativo $ val_max;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;datalines;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;Nickel 5.5&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;Tin 2.2&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;%let max_metals=6.0;&lt;/P&gt;&lt;P&gt;/* The following are not used yet since we are validating the model with only two metal commodities */&lt;/P&gt;&lt;P&gt;%let max_agri=12;&lt;/P&gt;&lt;P&gt;%let max_total=20;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;PROC OPTMODEL;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;/* Read historic and constraints table from WORKLIB */&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;/* LIM_METALS contains the max values by asset/period&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;and the max of total assets by type (in this case METALS) per period */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;set &amp;lt;str&amp;gt; PERIODS = /_1M _3M _6M _9M _1Y _2Y _3Y/;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;set &amp;lt;str&amp;gt; COMMS;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;set &amp;lt;num&amp;gt; DATES;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;set &amp;lt;num,str&amp;gt; DATES_COMMS;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;num lim_metals {COMMS, PERIODS};&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;num hist_data {DATES_COMMS, PERIODS};&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;num val_max{COMMS};&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &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;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;print lim_metals;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;read data max_limits INTO COMMS=[ativo] val_max;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;print val_max;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;read data WORK.HIST_VAR_4 INTO DATES_COMMS=[date ativo] {p in PERIODS} &amp;lt;hist_data[date,ativo,p]=col(p)&amp;gt;;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;print hist_data;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;/* Variables to optimise and constraints */&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;/* The goal is to minimise the value at risk by calculating the amount allocated to each asset (Nickel and Tin) for each period. */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;var amount{COMMS, PERIODS} &amp;gt;= 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;/* Corrected IMPVAR definitions */&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;impvar amount_data {date in DATES, comm in COMMS, p in PERIODS} = amount[comm, p] * hist_data[date, comm, p];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;impvar amount_date_comm_period {date in DATES} = sum{comm in COMMS, p in PERIODS} amount_data[date, comm, p];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;impvar total_comm {comm in COMMS} = sum{period in PERIODS} amount[comm, period];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;/* Constraints */&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;con lim_comm {comm in COMMS}: total_comm[comm] &amp;lt;= val_max[comm];&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;con lim_total: sum{comm in COMMS} total_comm[comm] &amp;lt;= &amp;amp;max_metals;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;expand;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;/* Objective Function */&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;/* For 99% VaR (6th smallest value in the sample of 520 obs) */&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;/* min value_at_risk = pctl(.99, of amount_date_comm_period[*]);*/&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;min value_at_risk1= smallest(6, of amount_date_comm_period[*]);&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;solve with nlp / algorithm=as ms;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;print amount;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;print value_at_risk1;&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Thu, 01 May 2025 16:00:44 GMT</pubDate>
    <dc:creator>feresm</dc:creator>
    <dc:date>2025-05-01T16:00:44Z</dc:date>
    <item>
      <title>minimising Value At Risk - thread 3</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/minimising-Value-At-Risk-thread-3/m-p/965526#M4322</link>
      <description>&lt;P&gt;back to this subject I am now beyond the READ DATA issues, I guess. However, when I run the code I got two data errors as in the files attached and a semantic error from the solver. I tried both options, using the smallest function and the percentile. The result is the same. Also, the expand does not show the objective function, but shows the constraints just fine. The main difficulty, I guess, is that when optimising I do not need the commodities anymore (COMMS), just the date.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Any help? Thanks, Marcio.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;this is the code:&lt;/P&gt;&lt;P&gt;DATA max_limits;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;input ativo $ val_max;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;datalines;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;Nickel 5.5&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;Tin 2.2&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;%let max_metals=6.0;&lt;/P&gt;&lt;P&gt;/* The following are not used yet since we are validating the model with only two metal commodities */&lt;/P&gt;&lt;P&gt;%let max_agri=12;&lt;/P&gt;&lt;P&gt;%let max_total=20;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;PROC OPTMODEL;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;/* Read historic and constraints table from WORKLIB */&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;/* LIM_METALS contains the max values by asset/period&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;and the max of total assets by type (in this case METALS) per period */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;set &amp;lt;str&amp;gt; PERIODS = /_1M _3M _6M _9M _1Y _2Y _3Y/;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;set &amp;lt;str&amp;gt; COMMS;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;set &amp;lt;num&amp;gt; DATES;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;set &amp;lt;num,str&amp;gt; DATES_COMMS;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;num lim_metals {COMMS, PERIODS};&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;num hist_data {DATES_COMMS, PERIODS};&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;num val_max{COMMS};&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &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;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;print lim_metals;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;read data max_limits INTO COMMS=[ativo] val_max;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;print val_max;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;read data WORK.HIST_VAR_4 INTO DATES_COMMS=[date ativo] {p in PERIODS} &amp;lt;hist_data[date,ativo,p]=col(p)&amp;gt;;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;print hist_data;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;/* Variables to optimise and constraints */&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;/* The goal is to minimise the value at risk by calculating the amount allocated to each asset (Nickel and Tin) for each period. */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;var amount{COMMS, PERIODS} &amp;gt;= 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;/* Corrected IMPVAR definitions */&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;impvar amount_data {date in DATES, comm in COMMS, p in PERIODS} = amount[comm, p] * hist_data[date, comm, p];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;impvar amount_date_comm_period {date in DATES} = sum{comm in COMMS, p in PERIODS} amount_data[date, comm, p];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;impvar total_comm {comm in COMMS} = sum{period in PERIODS} amount[comm, period];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;/* Constraints */&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;con lim_comm {comm in COMMS}: total_comm[comm] &amp;lt;= val_max[comm];&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;con lim_total: sum{comm in COMMS} total_comm[comm] &amp;lt;= &amp;amp;max_metals;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;expand;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;/* Objective Function */&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;/* For 99% VaR (6th smallest value in the sample of 520 obs) */&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;/* min value_at_risk = pctl(.99, of amount_date_comm_period[*]);*/&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;min value_at_risk1= smallest(6, of amount_date_comm_period[*]);&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;solve with nlp / algorithm=as ms;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;print amount;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;&amp;nbsp; &lt;/SPAN&gt;print value_at_risk1;&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 01 May 2025 16:00:44 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/minimising-Value-At-Risk-thread-3/m-p/965526#M4322</guid>
      <dc:creator>feresm</dc:creator>
      <dc:date>2025-05-01T16:00:44Z</dc:date>
    </item>
    <item>
      <title>Re: minimising Value At Risk - thread 3</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/minimising-Value-At-Risk-thread-3/m-p/965578#M4323</link>
      <description>Why not post it at OR forum and calling &lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/1636"&gt;@RobPratt&lt;/a&gt;  ,since you are using PROC OPTMODEL.</description>
      <pubDate>Fri, 02 May 2025 05:59:50 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/minimising-Value-At-Risk-thread-3/m-p/965578#M4323</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2025-05-02T05:59:50Z</dc:date>
    </item>
    <item>
      <title>Re: minimising Value At Risk - thread 3</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/minimising-Value-At-Risk-thread-3/m-p/965625#M4324</link>
      <description>&lt;P&gt;You have declared the DATES set but not populated it.&amp;nbsp; Adding the following statement (after you have populated DATES_COMMS) avoids the error:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;DATES = setof {&amp;lt;d,c&amp;gt; in DATES_COMMS} d;
&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Fri, 02 May 2025 20:30:54 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/minimising-Value-At-Risk-thread-3/m-p/965625#M4324</guid>
      <dc:creator>RobPratt</dc:creator>
      <dc:date>2025-05-02T20:30:54Z</dc:date>
    </item>
    <item>
      <title>Re: minimising Value At Risk - thread 3</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/minimising-Value-At-Risk-thread-3/m-p/965709#M4325</link>
      <description>Cannot thank you enough!</description>
      <pubDate>Sun, 04 May 2025 21:41:01 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/minimising-Value-At-Risk-thread-3/m-p/965709#M4325</guid>
      <dc:creator>feresm</dc:creator>
      <dc:date>2025-05-04T21:41:01Z</dc:date>
    </item>
  </channel>
</rss>

