27%macro irmst_fft_convolution(
48 proc means mean data=&libname..&ds_in. noprint;
49 var PD_Sector_1-PD_Sector_§ors_cnt.
50 PD_Volatility_Sector_1-PD_Volatility_Sector_§ors_cnt.;
51 output out=&libname..&ds_in._mean(drop=_type_ _freq_ )
52 mean=PD_Mean_Sector_1-PD_Mean_Sector_§ors_cnt. PD_Volatility_Mean_Sector_1-PD_Volatility_Mean_Sector_§ors_cnt.;
62 set &libname..&ds_in._mean(obs=1);
65 %
do i_sector=1 %to §ors_cnt.;
89 MIX_GAMMA_DIST_STD_&i_sector.=PD_Volatility_Mean_Sector_&i_sector./PD_Mean_Sector_&i_sector.;
95 CALL SYMPUTX(
"MIX_GAMMA_DIST_SCALE_BETA_&i_sector.", (MIX_GAMMA_DIST_STD_&i_sector.)**2 ,
"L");
96 CALL SYMPUTX(
"MIX_GAMMA_DIST_SHAPE_ALPHA_&i_sector.", (MIX_GAMMA_DIST_STD_&i_sector.)**(-2),
"L");
108 proc means sum data=&libname..&ds_in. noprint;
109 var NORMLZD_EXPCTD_LOSS_Sector_1-NORMLZD_EXPCTD_LOSS_Sector_§ors_cnt.;
110 class Discretized_Exposure ;
111 output out=&libname..&ds_in._sum(where=(Discretized_Exposure NE .) drop=_type_ _freq_ ) sum=normlzd_expctd_loss_sum_1-normlzd_expctd_loss_sum_§ors_cnt.;
116 do j_band=0 to %eval(&exposureHistogram_cellCnt.-1);
124 create table &libname..&ds_in._extended as
125 select main_tbl.*, zero_padding.j_band
126 from &libname..&ds_in._sum(where=(Discretized_Exposure NE .)) as main_tbl full join zero_padding
127 on zero_padding.j_band=main_tbl.Discretized_Exposure;
132 data &libname..&ds_in._extended;
133 set &libname..&ds_in._extended end=last;
135 retain %
do i_sector=1 %to §ors_cnt.;
136 cum_default_number_&i_sector. 0
146 %
do i_sector=1 %to §ors_cnt.;
147 if (normlzd_expctd_loss_sum_&i_sector. NE .) and (j_band NE 0) then
do;
148 expctd_default_number_&i_sector. =normlzd_expctd_loss_sum_&i_sector./j_band;
151 expctd_default_number_&i_sector.=0;
153 cum_default_number_&i_sector. =cum_default_number_&i_sector.+expctd_default_number_&i_sector.;
157 %
do i_sector=1 %to §ors_cnt.;
158 CALL SYMPUTX(
"total_default_number_&i_sector.", cum_default_number_&i_sector. ,
"L");
165 data &libname..&ds_in._extended;
166 set &libname..&ds_in._extended;
167 %
do i_sector=1 %to §ors_cnt.;
168 severity_density_&i_sector.=expctd_default_number_&i_sector./&&total_default_number_&i_sector..;
175 use &libname..&ds_in._extended;
178 %
do i_sector=1 %to §ors_cnt.;
179 expctd_default_number_&i_sector.
180 severity_density_&i_sector.
193 start cplxPower(Z, q);
195 THETA = j(nrow(Z),1);
197 R[,1] =sqrt(Z[,1]##2+Z[,2]##2);
198 THETA[,1] =ATAN2(Z[,2], Z[,1]);
201 C[,1] = (R[,1]##q)#cos(THETA[,1]#q);
202 C[,2] = (R[,1]##q)#sin(THETA[,1]#q);
212 start cplxMult(A, B);
214 C[,1] = A[,1]#B[,1] - A[,2]#B[,2];
215 C[,2] = A[,1]#B[,2] + A[,2]#B[,1];
225 %
do i_sector=1 %to §ors_cnt.;
227 fft_&i_sector. =fft(severity_density_&i_sector.);
230 temp =unit-(&&total_default_number_&i_sector..#&&MIX_GAMMA_DIST_SCALE_BETA_&i_sector..)#(fft_&i_sector.-unit);
233 characteristic_fuction_fft_&i_sector. =cplxPower(temp, -&&MIX_GAMMA_DIST_SHAPE_ALPHA_&i_sector..);
237 %
if §ors_cnt.=1 %then %
do;
239 compoundDistribution =ifft(characteristic_fuction_fft_1)/&exposureHistogram_cellCnt.;
241 %
else %
if §ors_cnt.>1 %then %
do;
246 characteristic_fuction_fft_prod = repeat(unit,floor(&exposureHistogram_cellCnt./2+1),1);
247 %
do i_sector=1 %to §ors_cnt.;
248 characteristic_fuction_fft_prod =cplxMult(characteristic_fuction_fft_prod,characteristic_fuction_fft_&i_sector.);
252 compoundDistribution =ifft(characteristic_fuction_fft_prod)/&exposureHistogram_cellCnt.;
262 compoundDistribution_cumsum =cusum(compoundDistribution);
264 compoundDistribution_tailIndex =compoundDistribution_cumsum>(&ValueAtRisk_Level.);
266 compoundDistribution_tail =compoundDistribution#compoundDistribution_tailIndex;
268 CompoundLoss =(0:%eval(&exposureHistogram_cellCnt.-1))*&exposureHistogram_width.;
270 VAR =CompoundLoss[loc(compoundDistribution_cumsum>(&ValueAtRisk_Level.))[1]];
271 ExpectedCompoundLoss =CompoundLoss*compoundDistribution;
272 EconomicCapital =VAR-ExpectedCompoundLoss;
274 %
if §ors_cnt.>1 %then %
do;
275 %
do i_sector=1 %to §ors_cnt.;
276 compoundDistribution_&i_sector. =ifft(characteristic_fuction_fft_&i_sector.)/&exposureHistogram_cellCnt.;
277 compoundDistribution_cumsum_&i_sector. =cusum(compoundDistribution_&i_sector.);
279 compoundDistribution_tailIndex_&i_sector. =compoundDistribution_cumsum_&i_sector.>(&ValueAtRisk_Level.);
281 compoundDistribution_tail_&i_sector. =compoundDistribution_&i_sector.#compoundDistribution_tailIndex_&i_sector.;
282 VAR_&i_sector. =CompoundLoss[loc(compoundDistribution_cumsum_&i_sector.>(&ValueAtRisk_Level.))[1]];
283 ExpectedCompoundLoss_&i_sector. =CompoundLoss*compoundDistribution_&i_sector.;
284 EconomicCapital_&i_sector. =VAR_&i_sector. - ExpectedCompoundLoss_&i_sector. ;
288 create &libname..&ds_out. var {
290 compoundDistribution_tail
294 compoundDistribution_cumsum
296 %
if §ors_cnt.>1 %then %
do;
297 %
do i_sector=1 %to §ors_cnt.;
298 compoundDistribution_tailIndex_&i_sector.
300 ExpectedCompoundLoss_&i_sector.
301 EconomicCapital_&i_sector.
302 compoundDistribution_cumsum_&i_sector.
303 compoundDistribution_&i_sector.
308 close &libname..&ds_out.;
314%mend irmst_fft_convolution;