首页 > 解决方案 > 如何计算每年的观测值

问题描述

大家好,

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

我想计算过去 x 年每个特定年份和每个 YearXmonth 的投资组合的总敞口。

例如,如果合约从 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 是更改状态的日期。

对于状态为“Noeffect”、“Ongoing”或“Pending”的合同,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;

如果我不够清楚,我很抱歉。不要犹豫,问我更多细节。

先感谢您。

标签: sas

解决方案


我几乎实现了我想要的,但是在宏语句中创建宏变量时我被卡住了。

感谢您对我的帖子发表评论。我更喜欢自学以提高我在 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;

推荐阅读