SAS:CAR的最后30天平均值

时间:2017-03-08 03:46:13

标签: events sas

我即将开展一项事件研究,需要计算事件发生前最后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)事件研究版本上有信息,我也非常感激。

2 个答案:

答案 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;