SAS前瞻移动标准偏差

时间:2015-03-03 08:07:48

标签: sas

您知道如何计算每个季度未来四个季度的标准差吗?谢谢:))

我的尝试如下: date1是一年中该季度的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;

2 个答案:

答案 0 :(得分: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;

您应该能够根据数据进行调整。

答案 1 :(得分: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