如何计算每年的观测值暴露程度

时间:2019-06-03 13:24:23

标签: sas

大家好,

我今天遇到一个无法解决的问题,因为我不知道从哪里开始。

我想计算最近x年来每个特定年份和YearXmonth的Portofolio的总暴露量。

例如,如果合同在2018年1月1日开始并在2018年11月15日结束,则该合同在2018年暴露了11个月或11/12年或318天。在2018年1月,该合同暴露了1个月,1/12年或31天,...

2019年,合同完全没有暴露。

这是我所拥有的信息:

data have;
length ID Status $ 40;
input Id  Status $ Date_of_effect Date_Status ;

informat Date_of_effect Date_Status date9.;
format Date_of_effect Date_Status date9.;
infile datalines missover;
datalines;
1 Ongoing 05jul2015 05jul2015
1 Transformation 23Oct2014 05jul2015 
2 Death 07jan2017 02dec2018 
3 Finished 13feb2005 13feb2015
4 NoEffect 06nov2016 06nov2016
5 Cancellation 08MAR2014 19dec2018
6 Pending 21oct2018 21oct2018
;

run;

ID是合同编号

状态是合同的当前状态

Date_of_effect是合同生效并开始公开的日期。

Date_Status是状态更改的日期。

对于状态为“无影响”,“进行中”或“待处理”的合同,date_of_effect等于Status_date。对于进行中和待处理的合同,我需要计算当天的风险敞口。因此,我认为我需要对那些合同应用不同的规则。对于其他状态,合同已在Date_of_effect和Date_Status之间公开。

我想创建3个差值表,其中第一个表总结了以月和年表示的每年的总曝光量。

data Want_1;

input Year  Sum_Exposition_in_year Sum_Exposition_in_months Sum_Exposition_in_days;

infile datalines missover;
datalines;
2014
2015
2016
2017
2018
2019
;

run;

第二张表基本相同,除了我引入了额外的细分:

data Want_2;

input Year month Sum_Exposition_in_year Sum_Exposition_in_months Sum_Exposition_in_days;

infile datalines missover;
datalines;
2014 1
2014 2
2014 3
2014 4
2014 5
2014 6
2014 7
2014 8
2014 9
2014 10
2014 11
2014 12
2015 1
2015 2
2015 3
2015 4
2015 5
2015 6
2015 7
2015 8
2015 9
2015 10
2015 11
2015 12
... ...
;

run;

最后,我想计算以天和月表示的几年合约的风险敞口。

data Want_3;
length ID Status $ 40;
input Id  Status $ Date_of_effect Date_Status Expo_days_2015 Expo_days_2016 Expo_days_2017 Expo_days_2018 Expo_days_2019 Expo_month_2015 Expo_month_2016 Expo_month_2017 Expo_month_2018 Expo_month_2019 ;

informat Date_of_effect Date_Status date9.;
format Date_of_effect Date_Status date9.;
infile datalines missover;
datalines;
1 Ongoing 05jul2015 05jul2015 179 365 365 365 153 6 12 12 12 6 
1 Transformation 23Oct2014 05jul2015 
2 Death 07jan2017 02dec2018 
3 Finished 13feb2005 13feb2015
4 NoEffect 06nov2016 06nov2016
5 Cancellation 08MAR2014 19dec2018
6 Pending 21oct2018 21oct2018
;

run;

如果我不够清楚,我深表歉意。不要犹豫,问我更多细节。

谢谢。

1 个答案:

答案 0 :(得分:0)

我几乎达到了我想要的目标,但是在宏语句中创建宏变量时遇到了困难。

感谢您评论了我的帖子。我喜欢自己学习,以提高我在sas方面的知识。 :)

%let a=2015;
%let b=2019;


data Want_0 (drop=i) ;
set have;

array Expo_d_ (&a.:&b.) Expo_d_&a.-Expo_d_&b.;
array Expo_m_ (&a.:&b.) Expo_m_&a.-Expo_m_&b.;
if Status = "Ongoing" or Status="Pending" then
Date_Status=today();

do i=&a. to &b.;

Expo_d_(i) = max(0,min(mdy(01,01,i+1),Date_Status)-max(Date_of_effect,mdy(1,1,i)));
Expo_m_(i) = max(0,round((min(mdy(01,01,i+1),Date_Status)-max(Date_of_effect,mdy(1,1,i)))/(365.25/12),1));
end;
run;



%macro Do_stock;

proc sql noprint;

%do i=&a. %to &b.;
select sum(Expo_d_&i.) into: Expo_d_&i.
from work.Want_0;

select sum(Expo_m_&i.) into: Expo_m_&i.
from work.Want_0;
%end;                                                       

quit;
run;

%do i=&a. %to &b.;

%put Expo_d_&i.;
%put Expo_m_&i.;

%end;
%mend;
%Do_stock;

data Want_1 ( drop=i);
do i = &a. to &b.;

year= i;

Expo_day=&Expo_d_&i.;
Expo_month=&Expo_m_&i.;
end;

run;