data aa;
input stkcd $ trdmnt $ ret m_ret;
cards;
000002 199001 0.12 0.1
000002 199002 0.18 0.2
000002 199003 0.09 0.15
000002 199004 0.14 0.11
000002 199005 -0.21 -0.18
000002 199006 0.14 0.17
000002 199007 0.1 0.11
000002 199008 0.08 0.09
000002 199009 0.05 0.03
000002 199010 -0.12 -0.16
000002 199011 0.02 0.01
000002 199012 0.06 0.09
000002 199101 0.1 0.11
000002 199102 0.12 0.1
000002 199103 0.15 0.13
000004 199001 0.12 0.1
000004 199002 0.18 0.2
000004 199003 0.09 0.15
000004 199004 0.14 0.15
000004 199005 -0.21 -0.18
000004 199006 0.14 0.17
000004 199007 0.18 0.11
000004 199008 0.08 0.09
000004 199009 0.05 0.03
000004 199010 -0.12 -0.16
000004 199011 0.02 0.01
000004 199012 0.06 0.09
000004 199101 0.1 0.11
000004 199102 0.12 0.1
000004 199103 0.15 0.13
;
run;
/*首先给每个月份按时间顺序加上个序列的值,比如开始日期是199001,那让这一行的i=1*/
proc sort data=aa;
by trdmnt;
run;
data aa1;
set aa end=f;
if _n_=1 then i=1;
if _n_>1 and trdmnt>lag(trdmnt) then i+1;
if f then call symput("nn",i);
run;
proc sort data=aa1;
by stkcd trdmnt;
run;
data result;
input stkcd $ enddate $ beta std;
cards;
run;
%macro corvar;
%do j=4 %to &nn;
data mid;
set aa1;
if i<=&j and i>%eval(&j-4);
if i=&j then call symput("enddate",trdmnt);
run;
proc reg data=mid outest=eee1;
by stkcd;
model ret = m_ret;
run;
proc sql;
create table eee2 as select
stkcd
,std(ret) as std
from mid
group by stkcd;
quit;
data eee3;
merge eee1 eee2;
by stkcd;
rename m_ret=beta;
enddate="&enddate";
keep stkcd enddate m_ret std;
run;
proc append base=result data=eee3;
run;
%end;
%mend;
%corvar;
把我这个里面的4改成20就是你要的20个月份一起算啦,另波动率不知道是不是20个月的std如果不是的话,要得到相应正确的应该也不难。我的SAS也没有特别好,可能程序不是最简短的。。希望对你有所帮助