2015-03-03 49 views
1

嗨有谁知道如何计算每季度接下来四个季度的标准差?谢谢:)SAS前瞻性移动标准差

我尝试低于: 日期1是SAS在今年迄今为止,该季度

Proc sql ; create table th.totalroll as 
Select distinct permco, date1 , 
(select std(adjret) from th.returns1 where qtr between 
    intnx('quarter',qtr(date),0) and intnx('quarter', qtr(date),+3)) as  
    TOTALroll From th.returns1 group by permco ,date1; 
    QUIT; 
+1

你有SAS/ETS许可?如果是的话,PROC EXPAND可以为你计算 – Longfish 2015-03-03 09:24:40

回答

0

很难告诉你是多么接近,因为我不能完全肯定你的数据看起来但是这里假设您每个季度都有多个日期。此变量

data have; 
    format date date9.; 
    do m = 1 to 128; 
    date = intnx('month','01JAN2008'd,m-1); 
    amount = round(ranuni(date)*10); 
    output; 
    end; 
    drop m; 
run; 

使用PROC SQL,创建quarter变量(你可能已经有这个变量?)和组:创建样本数据。使用having条款将结果限制为每个季度的第一个日期。

proc sql; 
create table want as 
select 
    yyq(year(t1.date),qtr(t1.date)) as quarter format=yyq., 
    (select std(t2.amount) 
    from have t2 
    where t2.date >= yyq(year(t1.date),qtr(t1.date)) 
    and t2.date < intnx('quarter',yyq(year(t1.date),qtr(t1.date)),4)) as stddev 
from 
    have t1 
group by 
    calculated quarter 
having 
    t1.date = min(t1.date) 
; 
quit; 

您应该可以调整它以适用于您的数据。

0

如果数据集已在季度中,则可以使用proc expand。所以像这样:

proc expand data=th.returns1 
      out=th.totalroll 
      from=quarter 
      to=quarter; 
    by permco date1;   
    id date; 
    convert adjret=TOTALroll/transformout=(MOVSTD 4); 
run; 

不要忘了先排序你的数据。而MOVSTD会为您提供向后移动的标准偏差。如果您想要向前移动STD,您可能需要将输出流转回4个季度。

为PROC转换操作扩大: http://support.sas.com/documentation/cdl/en/etsug/60372/HTML/default/viewer.htm#etsug_expand_sect026.htm