全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1778 3
2013-09-01
悬赏 100 个论坛币 已解决
已知(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;

最佳答案

hkhl237 查看完整内容

试了一下,供参考: proc sort data=a;by stkcd date;run; data b; set a; by stkcd; retain jm; if first.stkcd then jm=0; if substr(put(date,best6.),5,2) in ("02","05","08","11") then jm=msmvttl; jm1=lag(jm); if jm=0 then jm1=0; if jm1^=0 then gx=(msmvttl/jm1)*pb; run;
二维码

扫码加我 拉你入群

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

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

全部回复
2013-9-1 09:48:51
试了一下,供参考:

proc sort data=a;by stkcd date;run;

data b;
        set a;
        by stkcd;
        retain jm;
        if first.stkcd then jm=0;
        if substr(put(date,best6.),5,2) in ("02","05","08","11") then jm=msmvttl;
        jm1=lag(jm);
        if jm=0 then jm1=0;
        if jm1^=0 then gx=(msmvttl/jm1)*pb;
run;
二维码

扫码加我 拉你入群

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

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

2013-9-2 16:12:00
复制代码
二维码

扫码加我 拉你入群

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

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

2013-9-3 05:13:44
为了这100金币,折腾了一下午,总算是把程序调试出来了。楼上的两个帖子的CODE完全不行,没那么简单。加了两个附件: 名字都是STOCK, 一个是SAS源程序(把后缀名改为.sas就可以运行),一个是运行结果(excel 文件)。半天时间的劳动,希望楼主信守承诺。我还指望着用这金币买书呢。如果有任何问题,站内联系。谢谢。以下是程序:



****author: thinman66*****************;
****date:   9/3/2013******************;
****purpose: earning 100 currencies on bbs.pingu.org******************;

data stock;
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;

data stock;
set stock;
year=input(substr(date, 1, 4), ??best.);
month=input(substr(date, 5, 2), ??best.);
if month in (1, 2, 3) then quarter=1;
else if month in (4,5,6) then quarter=2;
else if month in (7,8,9) then quarter=3;
else if month in (10,11,12) then quarter=4;
run;

data stock;
set stock;
if month=3 then endmv1=msmvttl;
else if month=6 then endmv2=msmvttl;
else if month=9 then endmv3=msmvttl;
else if (month=11 or month=12) then endmv4=msmvttl;
run;

proc sort data=stock ;
by stkcd year month;
run;
data yr93;
set stock;
if year=1993 ;
run;

data yr94;
set stock;
if year=1994 ;
run;

data yr95;
set stock;
if year=1995 ;
run;



Data yr94( Drop = _: ) ;
Set yr94 ( Rename = ( endmv1 = _endmv1 endmv2 = _endmv2   endmv3 = _endmv3 endmv4 = _endmv4  ) ) ;
Retain endmv1 endmv2 endmv3 endmv4 ;

If not missing( _endmv1   ) then endmv1   = _endmv1 ;
If not missing( _endmv2 ) then endmv2 = _endmv2;
If not missing( _endmv3   ) then endmv3   = _endmv3;
If not missing( _endmv4 ) then endmv4 = _endmv4;

run ;

Data yr95( Drop = _: ) ;
Set yr95 ( Rename = ( endmv1 = _endmv1 endmv2 = _endmv2   endmv3 = _endmv3 endmv4 = _endmv4  ) ) ;
Retain endmv1 endmv2 endmv3 endmv4 ;

If not missing( _endmv1   ) then endmv1   = _endmv1 ;
If not missing( _endmv2 ) then endmv2 = _endmv2;
If not missing( _endmv3   ) then endmv3   = _endmv3;
If not missing( _endmv4 ) then endmv4 = _endmv4;

run ;

proc sort data=yr94;
by         descending endmv1  descending endmv2 descending endmv3 descending endmv4 ;
run;
proc sort data=yr95;
by         descending endmv1  descending endmv2 descending endmv3 descending endmv4 ;
run;

Data yr94( Drop = _: ) ;
Set yr94 ( Rename = ( endmv1 = _endmv1 endmv2 = _endmv2   endmv3 = _endmv3 endmv4 = _endmv4  ) ) ;
Retain endmv1 endmv2 endmv3 endmv4 ;

If not missing( _endmv1   ) then endmv1   = _endmv1 ;
If not missing( _endmv2 ) then endmv2 = _endmv2;
If not missing( _endmv3   ) then endmv3   = _endmv3;
If not missing( _endmv4 ) then endmv4 = _endmv4;

run ;

Data yr95( Drop = _: ) ;
Set yr95 ( Rename = ( endmv1 = _endmv1 endmv2 = _endmv2   endmv3 = _endmv3 endmv4 = _endmv4  ) ) ;
Retain endmv1 endmv2 endmv3 endmv4 ;

If not missing( _endmv1   ) then endmv1   = _endmv1 ;
If not missing( _endmv2 ) then endmv2 = _endmv2;
If not missing( _endmv3   ) then endmv3   = _endmv3;
If not missing( _endmv4 ) then endmv4 = _endmv4;

run ;



data combine;
set yr93 yr94 yr95;
run;

data combine;
set combine;
if quarter=4 then lastq=endmv3;
else if quarter=3 the lastq=endmv2;
else if quarter=2 the lastq=endmv1;
run;


data combine (drop=endmv1-endmv4);
set combine;
if (year=1994 and quarter=1) or (year=1995 and quarter=1) then lastq=endmv4;
***sjlv is         市净率        ***********************;

sjlv=( msmvttl/lastq)*pb;
run;

附件列表

stock.txt

大小:3.8 KB

 马上下载

stock.xls

大小:25.5 KB

 马上下载

二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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