我在写60日移动平均的程序,没有用proc expand。
在第一个股票000001中,先生成一列sum来计算最近的60个求和(前60个就直接累加,后60个累加后减去lag60),再用sum/60来得到平均数(把前59个设为“.”了)。
但是问题是:紧接着第二个股票000007的数据中。sum前60个时,第一个sum本来应该是只加000007的第一个数据,但是它竟然累加了第一只股票000001的最后一个sum。请问怎么解决?
附上我的程序,前面的是数据处理,问题出在写的宏里面。
libname home "D:\skyztj\大三下\xuzhiSAS\TRD_Mnth\";
data t1;
set home.trd_mnth;
year=substr(Trdmnt,1,4)*1; 把时间转换成数值型
month=substr(Trdmnt,6,2)*1;
if year>2000;
run;
proc sort data=t1 out=t2;
by stkcd year month; 排序:股票代码 年 月
run;
data t3(keep=stkcd Mretwd year month count num);
set t2;
by stkcd;
if first.stkcd then count=1; 每个股票内部的观察数标签
else count+1;
if first.stkcd then num+1; 每个股票所有行有相同的标签,从1到2223,共2223只股票
run;
%macro ma;
data t4_1;
set t3;
by stkcd;
RETAIN Mretwd_sum 0;
last60=lag60(Mretwd);
if count gt 60 then Mretwd_sum=sum(Mretwd_sum,Mretwd,-last60); 算60日移动平均,这就出问题了
else Mretwd_sum=sum(Mretwd_sum,Mretwd);
if count ge 60 then mov_aver=Mretwd_sum/60;
else mov_aver=.;
run;
%mend;
求大神讲一下,怎么才能在累加时,也是按每只股票来,下一个股票的第一个数据,不累加上一个股票的最后一个数据。