楼主: 赵天静
2046 6

一个小问题~求帮忙~ [推广有奖]

  • 0关注
  • 0粉丝

大专生

28%

还不是VIP/贵宾

-

威望
0
论坛币
417 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
398 点
帖子
33
精华
0
在线时间
45 小时
注册时间
2015-12-3
最后登录
2018-8-2

楼主
赵天静 学生认证  发表于 2016-4-12 01:48:41 |AI写论文
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;
关键词:求帮忙 小问题 libname SUBSTR expand 平均数 程序

沙发
teqel 发表于 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)来排是一样的啊~这里应该没有出错~

7
teqel 发表于 2016-4-14 00:58:06
赵天静 发表于 2016-4-12 13:33
您好~我按 year month排和按 Trdmnt(交易日期 比如200601)来排是一样的啊~这里应该没有出错~
You are right.

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-22 16:09