SAS前瞻性移动标准差

SAS前瞻性移动标准差,sas,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',

大家好,有人知道如何计算每个季度接下来四个季度的标准差吗?谢谢:

我的尝试如下: 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;

很难说你离得有多近,因为我不能完全确定你的数据是什么样子的,但这里有一个例子,假设你每个季度都有一个以上的日期。创建示例数据:

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创建四分之一变量您可能已经有了这个变量?并按此变量分组。使用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;

您应该能够对其进行调整,以适用于您的数据。

如果您的数据集已在季度中,则可以使用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,您可能需要将输出流向后移动四分之一

proc expand的转换操作:

您是否拥有SAS/ETS许可证?如果是这样,那么PROC EXPAND可以为您计算这个值