全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1972 6
2016-04-12
悬赏 15 个论坛币 已解决
我在写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;



求大神讲一下,怎么才能在累加时,也是按每只股票来,下一个股票的第一个数据,不累加上一个股票的最后一个数据。

最佳答案

teqel 查看完整内容

两个问题: 1. sort 应该以天基础: proc sort data=t1 out=t2; by stkcd Trdmnt; run; 2. 少一句: RETAIN Mretwd_sum 0; if first.stkcd then Mretwd_sum =0;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2016-4-12 01:48:42
两个问题:
1. sort 应该以天基础:
proc sort data=t1 out=t2;               
by stkcd Trdmnt;                                                                                                                                                         
run;

2. 少一句:
RETAIN Mretwd_sum 0;  
if first.stkcd then Mretwd_sum =0;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-4-12 01:49:40
希望的出来的结果和下面一样:
proc expand data=t3 out=t4_2  method=none;                                                                                                                                                                                                                     
by stkcd;                                                                                                                                                                                                                                                      
convert   Mretwd=ma60 / transformout = (moveave 60 trimleft 59);                                                                                                                                                                                                
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-4-12 13:25:36
谢谢大神!!!!!完美解决啊!!!!我之前以为在by stkcd下面都会执行 RETAIN Mretwd_sum 0;
原来还要加一个if first.stkcd then Mretwd_sum =0; 谢啦!!!!!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-4-12 13:26:33
teqel 发表于 2016-4-12 01:48
两个问题:
1. sort 应该以天基础:
proc sort data=t1 out=t2;
谢谢大神!!!!!完美解决啊!!!!我之前以为在by stkcd下面都会执行 RETAIN Mretwd_sum 0;
原来还要加一个if first.stkcd then Mretwd_sum =0; 谢啦!!!!!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-4-12 13:33:34
teqel 发表于 2016-4-12 01:48
两个问题:
1. sort 应该以天基础:
proc sort data=t1 out=t2;
您好~我按 year month排和按 Trdmnt(交易日期 比如200601)来排是一样的啊~这里应该没有出错~
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群