验证动量效应,通过对2012年2月80支股票收益率进行排序,收益率从小到大分成10组,收益率最小的8只股票的组合为loser,最大的8只股票为winner,计算每月winner和loser组合收益率。现在means数据集中已得2012年3月winner和loser组合收益率,希望输出3月winner和loser收益率(即means数据集中最后一行及第一行数据),以及winner-loser组合收益率差值(即最后一行减第一行)。不知道该如何通过first.var和last.var,以及last.var-first.var输出想要的结果。
源数据txt文件见附件,代码如下:
libname home "C:\Users\SONY\Desktop\sas\vk30igy3\data\";
DATA TRD_Mnth (Label="月个股回报率文件");
Infile 'C:\Users\SONY\Desktop\sas\vk30igy3\data\TRD_Mnth.txt' encoding="utf-8" delimiter = '09'x Missover Dsd lrecl=32767 firstobs=2;
Format Stkcd $6.;
Format Trdmnt $10.;
Format Mretwd 10.6;
Informat Stkcd $6.;
Informat Trdmnt $10.;
Informat Mretwd 10.6;
Label Stkcd="证券代码";
Label Trdmnt="交易月份";
Label Mretwd="考虑现金红利再投资的月个股回报率";
Input Stkcd $ Trdmnt $ Mretwd ;
Run;
data home.trd_mnth;
set trd_mnth;
run;
data t1;
set home.trd_mnth;
year=substr(Trdmnt,1,4)*1;/*乘1是为了将字符型转换成数值型*/
month=substr(Trdmnt,6,2)*1;
ymonth=year*100+month;
run;
proc sort data=t1(where=(ymonth=201202)) out=t2; by descending Mretwd; run;
/*分成10组*/
proc rank data=t2 out=t3 groups=10;
ranks portfolio;
var Mretwd;
run;
data t3;
set t3;
portfolio=portfolio+1;
run;
/*将分组数据合并到原始数据中*/
proc sql;
create table t4 as
select a.stkcd,a.year,a.month,a.ymonth,a.Mretwd,b.portfolio
from t1 as a left join t3 as b
on a.stkcd=b.stkcd
order by b.portfolio,a.ymonth;
quit;
proc sort data=t4(where=(ymonth=201203)); by portfolio ymonth;run;
/*计算每月资产组合的收益*/
proc means data=t4 noprint;
by portfolio ymonth;
var Mretwd;
output out=means mean=;
run;
谢谢大家