全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1885 7
2013-08-27
已知(1)市净率每季度更新一次;
       (2)市净率的每月更新公式=(本月末股票总市值/上季末股票总市值)*市净率;季末股票总市值为该季度最后一个月的月末股票总市值; (即上季末股票总市值为上一季度结束月份的股票的总市值)
       (3)下列数据中,stkcd为股票代码,pb为市净率,msmvttl为月末股票总市值;
       (4)如数据集所示,12月1月2月为第一个季度3月4月5月为第二个季度6月7月8月为第三个季度9月10月11月为第四个季度;
data a;
input stkcd date msmvttl pb;
cards;
1 199312 6000 2
1 199401 6300 2
1 199402 6200 2
1 199403 6000 3
1 199404 6400 3
1 199405 6700 3
1 199406 7000 5
1 199407 6500 5
1 199408 6800 5
1 199409 7100 2
1 199410 6750 2
1 199411 6000 2
1 199412 6000 2
1 199501 6300 2
1 199502 6200 2
1 199503 6000 3
1 199504 6400 3
1 199505 6700 3
1 199506 7000 5
1 199507 6500 5
1 199508 6800 5
1 199509 7100 2
1 199510 6750 2
1 199511 6000 2
3 199312 6000 2
3 199401 6300 2
3 199402 6200 2
3 199403 6000 3
3 199404 6400 3
3 199405 6700 3
3 199406 7000 5
3 199407 6500 5
3 199408 6800 5
3 199409 7100 2
3 199410 6750 2
3 199411 6000 2
3 199412 6000 2
3 199501 6300 2
3 199502 6200 2
3 199503 6000 3
3 199504 6400 3
3 199505 6700 3
3 199506 7000 5
3 199507 6500 5
3 199508 6800 5
3 199509 7100 2
3 199510 6750 2
3 199511 6000 2
;
run;
二维码

扫码加我 拉你入群

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

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

全部回复
2013-8-28 15:34:09
data b;                                                                                                                                 
set a;                                                                                                                                 
x=substr(left(date),5,2);                                                                                                               
if x in (12,01,02) then y=1;                                                                                                            
if x in (03,04,05) then y=2;                                                                                                            
if x in (06,07,08) then y=3;                                                                                                            
if x in (09,10,11) then y=4;                                                                                                            
year=substr(left(date),1,4);                                                                                                            
if x =12 then year=year+1;                                                                                                              
jidu=trim(left(stkcd))||trim(left(year))||trim(left(y));                                                                                
run;                                                                                                                                    
proc transpose data=b out=c prefix=V;                                                                                                   
    var msmvttl;                                                                                                                        
    by jidu;                                                                                                                           
run;                                                                                                                                    
proc transpose data=b out=c1 prefix=p;                                                                                                  
    var pb;                                                                                                                             
    by jidu;                                                                                                                           
run;                                                                                                                                    
data d;                                                                                                                                 
merge c c1;                                                                                                                             
by jidu;                                                                                                                                
summsm = sum(of v1-v3);                                                                                                                 
sumpb = sum(of p1-p3);                                                                                                                  
lagmsm=lag(summsm);                                                                                                                     
lagsumpb=lag(sumpb);                                                                                                                    
keep jidu summsm sumpb lagmsm lagsumpb;                                                                                                
run;                                                                                                                                    
                                                                                                                                       
                                                                                                                                       
                                                                                                                                       
                                                                                                                                       
data e;                                                                                                                                 
set d;                                                                                                                                 
z =dif(substr(jidu,1,1));                                                                                                               
if z^=0  then lagmsm=. ;                                                                                                               
if z^=0  then  lagsumpb=. ;                                                                                                            
run;                                                                                                                                    
                                                                                                                                       
                                                                                                                                       
data fin;                                                                                                                              
merge b e;                                                                                                                              
by jidu;                                                                                                                                
keep stkcd date msmvttl pb lagmsm lagsumpb;                                                                                             
run;                                                                                                                                    
data fa;                                                                                                                                
set fin;                                                                                                                                
gengxin =  (msmvttl/lagmsm)*lagsumpb;                                                                                                   
run;     

二维码

扫码加我 拉你入群

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

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

2013-8-28 15:35:27
data fin;                                                                                                                              
merge b e;                                                                                                                              
by jidu;                                                                                                                                
keep stkcd date msmvttl pb lagmsm lagsumpb;                                                                                             
run;                                                                                                                                    
data fa;                                                                                                                                
set fin;                                                                                                                                
gengxin =  (msmvttl/lagmsm)*lagsumpb;                                                                                                   
run;     
二维码

扫码加我 拉你入群

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

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

2013-8-30 15:36:31
akakak123 发表于 2013-8-28 15:34
data b;                                                                                              ...
大神,感谢你的编程,我程序的数据有20多万个观测,而且参数也比这个多得多,不知道你能不能把你的想法回复我一下,你编得程序有的地方我不是很懂,万分感谢
二维码

扫码加我 拉你入群

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

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

2013-8-30 16:13:53
初学SAS方法比较笨。。。。。
data b
把月份按季度归类 把stkcd变成stkcd年季度的格式
data d
算出每个月的值,在用lag返回上个月的值
data e
由于是返回上一个值,需要把下一个stkcd的第一条记录设为空

最后就把上个月的值合并到这个月后面就算出来了
二维码

扫码加我 拉你入群

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

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

2013-8-30 16:54:01
第一jidu=trim(left(stkcd))||trim(left(year))||trim(left(y)); ?
第二if z^=0  then lagmsm=. ; 中 z^=0 是什么意思?这一步是什么意思?
第三z =dif(substr(jidu,1,1));?
这三步是什么意思啊,有点儿疑惑
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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