您知道如何计算每个季度未来四个季度的标准差吗?谢谢:))
我的尝试如下: 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;
答案 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