143%macro irmst_riskagg_hicopula( ds_in_configuration_table =
144 , ds_in_copula_table =
145 , ds_in_marginal_table =
146 , ds_in_corr_tables =
147 , working_libname = work
151 , high_agg_level_var =
152 , low_agg_level_var =
153 , ds_out_risk_analysis_table =
172 create table &working_libname..bygroup_lookup as
173 select distinct reporting_dt, scenario_id, risk_measure
174 from &ds_in_configuration_table.;
178 data &working_libname..bygroup_lookup;
179 set &working_libname..bygroup_lookup;
185 select count(index), index into :bygroup_cnt, :bygroup_list separated by
" "
186 from &working_libname..bygroup_lookup;
189 proc sort data=&ds_in_configuration_table. out=&working_libname..enhanced_configuration_table;
190 by reporting_dt scenario_id group;
194 data &working_libname..enhanced_configuration_table;
195 set &working_libname..enhanced_configuration_table;
197 declare hash h(dataset:
"&working_libname..bygroup_lookup");
198 h.definekey(
"reporting_dt",
"scenario_id",
"risk_measure");
199 h.definedata(
"index");
208 proc sort data=&ds_in_copula_table. out=&working_libname..enhanced_copula_table;
209 by reporting_dt scenario_id NAME;
213 data &working_libname..enhanced_copula_table;
214 set &working_libname..enhanced_copula_table;
216 declare hash h(dataset:
"&working_libname..bygroup_lookup");
217 h.definekey(
"reporting_dt",
"scenario_id",
"risk_measure");
218 h.definedata(
"index");
227 data &working_libname..enhanced_copula_table;
228 set &working_libname..enhanced_copula_table end=last;
229 length temp_corr_matrix_list $1000.;
230 retain temp_corr_matrix_index;
231 retain temp_corr_matrix_list
"";
233 if first.index then temp_corr_matrix_index=0;
234 if upcase(parameter)=
"COV" or upcase(parameter)=
"CORR" then
do;
237 cvalue=cat(
"&working_libname..",cvalue);
238 temp_corr_matrix_list=catx(
" ",temp_corr_matrix_list,cvalue);
240 temp_corr_matrix_index+1;
241 cvalue=catx(
"_",
"&working_libname..temp_corr_mat",temp_corr_matrix_index);
244 call symputx(
"corr_matrix_list",temp_corr_matrix_list);
245 call symputx(
"corr_matrix_cnt",temp_corr_matrix_index);
251 %let parsed_corr_matrix_cnt=%sysfunc(countw(&ds_in_corr_tables.,
' '));
252 %
do i_corr_matrix=1 %to &corr_matrix_cnt.;
253 %let temp_corr_matrix=%scan(&corr_matrix_list., &i_corr_matrix., %str( ));
254 %let corr_matrix = %sysfunc(prxchange(s/\w+\.
256 %
do j_parsed_corr_matrix=1 %to &parsed_corr_matrix_cnt.;
257 %let temp_parsed_corr_matrix=%scan(&ds_in_corr_tables., &j_parsed_corr_matrix., %str( ));
258 %let parsed_corr_matrix = %sysfunc(prxchange(s/\w+\.
259 %
if %upcase(&corr_matrix.)=%upcase(&parsed_corr_matrix.) %then %
do;
263 %
if match_found=0 %then %
do;
264 %put ERROR: The correlation matrix &corr_matrix. has not been loaded.;
272 %
do i_corr_matrix=1 %to &corr_matrix_cnt.;
273 data &working_libname..enhanced_temp_corr_mat_&i_corr_matrix.;
274 set %scan(&corr_matrix_list.,&i_corr_matrix.,%str( ));
276 declare hash h(dataset:
"&working_libname..bygroup_lookup");
277 h.definekey(
"reporting_dt",
"scenario_id",
"risk_measure");
278 h.definedata(
"index");
290 data &working_libname..enhanced_marginal_table;
291 set &ds_in_marginal_table.;
293 declare hash h(dataset:
"&working_libname..bygroup_lookup");
294 h.definekey(
"reporting_dt",
"scenario_id",
"risk_measure");
295 h.definedata(
"index");
308 %let valid_bygroup_list=&bygroup_list.;
309 %let valid_bygroup_cnt=&bygroup_cnt.;
318 %
do valid_bygroup_i=1 %to &valid_bygroup_cnt.;
319 %let valid_bygroup_index=%scan(&valid_bygroup_list., &valid_bygroup_i., %str( ));
320 %
do i_corr_matrix=1 %to &corr_matrix_cnt.;
321 data &working_libname..temp_corr_mat_&i_corr_matrix.;
322 set &working_libname..enhanced_temp_corr_mat_&i_corr_matrix.(where=(index=&valid_bygroup_index.));
326 data &working_libname..temp_configuration;
327 set &working_libname..enhanced_configuration_table(where=(index=&valid_bygroup_index.));
330 data &working_libname..temp_copula;
331 set &working_libname..enhanced_copula_table(where=(index=&valid_bygroup_index.));
334 data &working_libname..temp_marginal;
335 set &working_libname..enhanced_marginal_table(where=(index=&valid_bygroup_index.));
338 vars = (PL comptype=PL)
339 ccv = (&high_agg_level_var. &low_agg_level_var.)
340 config_data = &working_libname..temp_configuration
341 copula_spec = &working_libname..temp_copula
342 marginal_spec = &working_libname..temp_marginal
346 out_simdata = &working_libname..simdata_&valid_bygroup_index.
347 out_statdata = &working_libname..statdata_&valid_bygroup_index.
355 data &ds_out_risk_analysis_table.;
356 %
do valid_bygroup_i=1 %to &valid_bygroup_cnt.;
357 %let valid_bygroup_index=%scan(&valid_bygroup_list., &valid_bygroup_i., %str( ));
358 set &working_libname..statdata_&valid_bygroup_index.(rename=(var=ValueAtRisk mean=EXPECTEDLOSS));
359 index=&valid_bygroup_index.;
363 ValueAtRisk=-ValueAtRisk;
364 if EXPECTEDLOSS <0 then ECONOMIC_CAPITAL=ValueAtRisk;
365 else ECONOMIC_CAPITAL=ValueAtRisk-EXPECTEDLOSS ;
366 if ECONOMIC_CAPITAL<0 then ECONOMIC_CAPITAL=0;
367 VALUEATRISK_ALPHA=&in_alpha.;
370 keep &high_agg_level_var. &low_agg_level_var. VALUEATRISK_ALPHA ValueAtRisk EXPECTEDLOSS ECONOMIC_CAPITAL index;
376 data &ds_out_risk_analysis_table.;
377 set &ds_out_risk_analysis_table. &working_libname..enhanced_configuration_table(obs=0 keep=scenario_id reporting_dt);
379 declare hash h(dataset:
"&working_libname..bygroup_lookup");
380 h.definekey(
"index");
381 h.definedata(
"scenario_id",
"reporting_dt");
386 drop rc name NValue table_id project_id load_id processed_dttm index;