我即将开展一项事件研究,需要计算事件发生前最后30天的平均回报。即如果date = eventdate则接受最后30次返回,总结并取平均值。
Date Symbol Eventdate Return
1/1/2016 AAPL 1/1/2016 0.026
此数据会触发前30天的回报平均值。 30也应该可以修改为具有不同的基准期(例如最后60到-10天。
有好方法吗?我的do循环技能是不够的并且lag30(返回)直到lag1(返回)绝对不是一个选项。
谢谢!
PS:如果有人在GARCH(1,1)事件研究版本上有信息,我也非常感激。
答案 0 :(得分:0)
您可以创建一个临时变量数组来托管您以前的返回。
data input_data;
format event_date other_date date.;
do i = 1 to 100;
event_date = today();
other_date = event_date - i + 1;
ret_amount = ranuni(123)*5;
output;
end;
drop i;
run;
proc sort data=input_data;
by other_date;
run;
%let max = 30;
data averages_returns;
set input_data;
array prev_return_array {0:&max} prev_0-prev_&max;
if _n_ = 1 then do;
do i = 0 to &max;
prev_return_array(i) = 0;
end;
end;
do i = &max to 1 by - 1;
prev_return_array(i) = prev_return_array(i - 1);
end;
prev_return_array(0) = ret_amount;
if event_date = other_date then do;
sum_return = sum(0,of prev_0-prev_&max);
output;
end;
retain prev_0-prev_&max;
drop prev_0-prev_&max i;
run;
答案 1 :(得分:0)
Seba的回答有效。
IF 你有连续的数据(每行单次观察),这是使用proc扩展的另一种方法。它计算每行超过30天的移动总和。如果需要特定日期的总和,只需选择行并检查结果即可。
在处理庞大的数据集时,它可能会很有用。你也可以做一些技巧来将数据扩展到连续数据,但这超出了问题的范围。
proc sort data=begin_data; by dateVariable; run;
proc expand data=begin_data out=out_data;
convert Var_to_sum =s um_30d / METHOD = none TRANSFORMOUT = (MovSum 30);
run;