Events SAS:汽车最近30天的平均值

Events SAS:汽车最近30天的平均值,events,sas,Events,Sas,我即将进行一项事件研究,需要计算事件发生前30天的平均回报率。也就是说,如果date=eventdate,则取最后30份回报,求和并平均 Date Symbol Eventdate Return 1/1/2016 AAPL 1/1/2016 0.026 该数据将触发前30天收益的平均值。30个基准期也应可修改为不同的基准期(例如,最后60至10天) 有什么好办法吗?我的do loop技能还不够,lag1(返回)之前的lag30(返回)绝对不是一个选项 谢谢 PS:如果有人有关于GARCH(1,

我即将进行一项事件研究,需要计算事件发生前30天的平均回报率。也就是说,如果date=eventdate,则取最后30份回报,求和并平均

Date Symbol Eventdate Return
1/1/2016 AAPL 1/1/2016 0.026
该数据将触发前30天收益的平均值。30个基准期也应可修改为不同的基准期(例如,最后60至10天)

有什么好办法吗?我的do loop技能还不够,lag1(返回)之前的lag30(返回)绝对不是一个选项

谢谢


PS:如果有人有关于GARCH(1,1)事件研究版本的信息,我也会非常感激。

你可以创建一个临时变量数组来保存你以前的回报

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;
塞巴的答案有效

如果您有连续的数据(每行一次观察),这里有一种使用proc expand的替代方法。它计算每行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;

很好,只需将其除以&max即可获得平均值。谢谢!!