2017-03-08 114 views
0

我即將開展事件研究,需要計算事件發生前最近30天的平均回報。即如果日期=事件日期,然後採取最後30回報,總結和平均他們。SAS:CAR最近30天的平均值

Date Symbol Eventdate Return 
1/1/2016 AAPL 1/1/2016 0.026 

該數據將觸發前30天的平均返回。 30也應該是可以修改的,以便有不同的基準期(例如最後60到10天)。

有沒有好的方法?我的循環技能是不夠的,lag30(返回),直到lag1(返回)是。絕對不是一個選擇

感謝

!PS:如果任何人有一個GARCH的相關信息(1,1)事件研究的版本,我會也非常感謝

回答

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; 
+0

完美,只需將其除以&max即可獲得平均值。謝謝!! – MaBo88

0

Seba的答案有效。

IF你有連續的數據(單行觀察),這裏是使用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;