8396 11

[有偿编程] 急!!!capm模型检验对β进行分组 [推广有奖]

  • 5关注
  • 2粉丝

博士生

1%

还不是VIP/贵宾

-

威望
0
论坛币
76 个
通用积分
2.0000
学术水平
0 点
热心指数
0 点
信用等级
3 点
经验
14785 点
帖子
63
精华
0
在线时间
354 小时
注册时间
2013-9-13
最后登录
2021-2-20

楼主
少年时代balala 发表于 2015-1-24 23:14:23 |AI写论文
100论坛币
fe.zip (9.53 KB) 本附件包括:
  • Chap3-2-1 BJS.csv
  • Chap3-2-1 date.csv
妹纸新手~~在做capm检验时遭遇困难,求大神指导~~
我的数据是从2002年1月——2007年6月,rolling的长度为36个月(eg.2002年1月——20014年12月回归得到的β作为2005年1月的β)
我现在要用rolling得到的30个β作为分组标准,对公司进行分组。
eg.我rolling得到的β最小值为0.2,最大值为2.6,那么我将β等分为5组:0.2~0.7,0.7~1.2,1.2~1.7,1.7~2.1,2.1~2.6.然后把每个公司2005年1月——2007年6月的β值(其实也是rolling得到的)丢入对应的分组中,那么每一个月都有5个组合对应于β的五组。每个组合的每一个月中的公司数目都可能不一样。
!!因为我之后需要用其他的数据rolling得到作为分组标准的β,所以希望大神用分步的做法,让作为分组标准的β是可以替换的。
我之前在书上看到的方法如下,但是太粗暴了,是对公、司、数、进行等分的,而不是将β等分!!
程序和数据都在附件中,感激不尽~~

libname CAPM 'f:\fe';


/*   input close price*/



/*导入原始数据——收益率*/


datacapm.riraw;                    


infile 'f:\fe\Chap3-2-1 BJS.csv' delimiter =','MISSOVER DSD lrecl=5000;


input date r1-r25 rf rm;   


run;



data capm.rida;


infile 'f:\fe\Chap3-2-1 date.csv' delimiter =','MISSOVER DSD lrecl=5000;


input date date1;   


run;



/*从capm.riraw中读取dateri rf rm code,其中code取1-25,用来提取r1-r25分别放入不同的数据集中*/


%macro mac;


%do i=1 %to 25;


  data capm.ri&i.;


  set capm.riraw;


  code=&i.;


  ri=r&i.;


  keep date ri rf rm code;


run;


%End;


%MEND mac;


%mac;



/*3 set 50dataset*/



/*把这25个数据集中的数据全部读入capm.ri中*/


data capm.ri;


set capm.ri1 capm.ri2 capm.ri3 capm.ri4capm.ri5 capm.ri6 capm.ri7 capm.ri8 capm.ri9 capm.ri10


capm.ri11capm.ri12 capm.ri13 capm.ri14 capm.ri15 capm.ri16 capm.ri17 capm.ri18 capm.ri19capm.ri20


capm.ri21capm.ri22 capm.ri23 capm.ri24 capm.ri25;



run;



proc sort data=capm.ri; by date; run;


proc sort data=capm.rida; by date;run;



/*merge,并且求出风险溢价*/


/*capm.rida中的date1被合并进入capm.riraw1中,date1的作用目前未知*/


data capm.riraw1;


merge capm.ri capm.rida; by date;


rif=ri-rf;rmf=rm-rf;


run;



/*按code排序(也就是先按公司ri排序),再按date排序*/


proc sort data=capm.riraw1; by code;run;



/*rolling的分组,每组时间间隔为3年,36个月*/


%macro mac;


%do i=1 %to 30;


datacapm.t&i.;


setcapm.riraw1;


ifdate1>=&i. and date1<=35+&i.;


rif=ri-rf;rmf=rm-rf;


run;


%End;


%MEND mac;


%mac;




%macro mac;


%do i=1 %to 30;


datacapm.t&i.;


setcapm.riraw1;


ifdate1>=&i. and date1<=35+&i.;


rif=ri-rf;rmf=rm-rf;


run;



/*分别对Ti中的数据按照code进行回归,并把结果记入beta_i数据集中,一共rolling30次,每个公司股票得到30的beta值*/


proc regdata=capm.t&i. noprint;


outest=capm.beta_&i.; /*输出结果为capm.beta&i*/


by code;


model rif=rmf;


run;/*25 obs*/


/*例如,对T1中的code=1的数据进行回归,得到的结果记入beta_1中第一行,即code=1的结果


其中intercept是截距项α,rmf是斜率β*/



proc rankdata=capm.beta_&i.


out=capm.beta&i. groups=5;/*分为5组,注意!!这里的分组是把公司数目进行等分,而不是对β进行等分*/


  ranks p;/*排名记为p,即β的大小赋给了p,“就是变量rmf的秩”*/


  var rmf;/*按照rmf的大小进行排序,即按照β大小排序*/


run;



%End;


%MEND mac;


%mac;



/*令date1=&i.+36,保留codedate1和p(beta的排名)*/


%macro mac;


%do i=1 %to 30;


datacapm.beta&i.;


setcapm.beta&i.;


date1=&i.+36;/*把前面rolling得到的beta值赋给了36个月之后的那个月*/


keep codedate1 p;


run;


%End;


%MEND mac;


%mac;







/*把所有capm.beta中的数据集中到capm.cop中*/


data capm.cop;


set capm.beta1;


run;


%macro mac;


%do i=1 %to 30;


data capm.cop;


merge capm.copcapm.beta&i.;


by code date1;


run;


%End;


%MEND mac;


%mac;



/*复制capm.cop中date1在37-66之间的数据,以及capm.riraw1中date1在37-66的数据*/


data capm.cop1;


set capm.cop;


if date1>=37and date1<=66;


run;


data capm.riraw2;


set capm.riraw1;


if date1>=37and date1<=66;


run;



/*排序,两次排序的结果应该是先按照date1排序,再按照code排序*/


proc sort data=capm.riraw2;


by code;run;


proc sort data=capm.riraw2;


by date1;run;


proc sort data=capm.cop1;


by code;run;


proc sort data=capm.cop1;


by date1;run;




/*merge*/


data capm.cop2;


merge capm.cop1 capm.riraw2;


by date1 code;


keep code date1 ri rm rf p;


run;



/*sort by pdate1*/


proc sort data=capm.cop2;


by date1;run;


proc sort data=capm.cop2;


by p;run;





proc univariate data=capm.cop2/*指明到底对那一个资料文件进行分析*/


noprint;/*noprint 就不在输出窗口打印,可以节省时间*/


var ri rm rf;/*列举需要进行描述性统计分析的数值变量名称*/


by p date1;/*依据此指令所列举的变量将观测进行分组*/


/*对每个组,也就是对每个p和date,对rirf 和 rm求平均值,此时求的是算术平均。如果加权平均,则要加一行:weight size*/


output out=capm.rip/*存储要输出的关键统计的表名*/


mean=meanri mean=meanrmmean=meanrf;/*分别给rirf rm的均值命名*/


run;


data capm.rip1;


set capm.rip;


meanrif=meanri-meanrf;


meanrmf=meanrm-meanrf;


run;




proc sort data=capm.rip1 ;


by p;run;


proc reg data=capm.rip1


outest=capm.beta;


model meanrif=meanrmf;


by p;


run;


/*风险与收益的检验*/


proc univariate data=capm.rip1;


var meanri meanrmf;


by p;


output out=capm.rip2


mean=meanrip mean=meanrmf;


run;


data capm.beta0;


merge capm.beta capm.rip2;


by p;


run;


proc reg data=capm.beta0;


model meanrip=meanrmf;


run;








最佳答案

jingju11 查看完整内容

You need to create an informat for each run. JingJu
关键词:CAPM模型 模型检验 CAPM APM cap capm模型 程序 beta等分

沙发
jingju11 发表于 2015-1-24 23:14:24
少年时代balala 发表于 2015-1-29 22:26
我还有一个问题,我想要的是把回归得到的 beta_i 数据集中的rmf的系数(beta)5等分,分组的标准并不是0. ...
You need to create an informat for each run. JingJu
  1. %let grp=5;
  2. data ctrl;
  3.   retain fmtname 'GrpFmt' type 'i' maxb minb;
  4.   set capm.beta_&i(keep=rmf) end=Eof;
  5.   maxb=max(maxb,rmf); minb=min(minb,rmf);
  6.   if Eof then do label =0 to &grp-1;
  7.     start =minb+(label+0)*((maxb-minb)/&grp);
  8.     end   =minb+(label+1)*((maxb-minb)/&grp);
  9.     sexcl ='Y';
  10.     hlo   =' ';
  11.     if label=0      then  hlo='L';
  12.     if label=&grp-1 then  hlo='H';
  13.     output;
  14.   end;
  15.   drop maxb minb rmf;
  16. run;
  17. proc format library=work cntlin=ctrl; run;
复制代码

藤椅
jingju11 发表于 2015-1-26 06:09:25
因为我之后需要用其他的数据rolling得到作为分组标准的β,所以希望大神用分步的做法,让作为分组标准的β是可以替换的。
你可以简单定义一个输入格式即可.比如:
  1. proc format;
  2. invalue grpfmt
  3. low-0.7   =0
  4. 0.7<-1.2  =1
  5. 1.2<-1.7  =2
  6. 1.7<-2.1  =3
  7. 2.1<-high =4
  8. ;
  9. run;

  10. 然后简单替换 rank过程为数据步定义语句:
  11.   p =input(rmf,grpfmt.);
复制代码
京剧

板凳
jingju11 发表于 2015-1-26 06:13:30
另外我对Capital Asset Pricing Model的理解比较浅显。你以上的过程试图证明这一模型的什么结论呢?京剧

报纸
少年时代balala 发表于 2015-1-27 19:45:05
jingju11 发表于 2015-1-26 06:13
另外我对Capital Asset Pricing Model的理解比较浅显。你以上的过程试图证明这一模型的什么结论呢?京剧
谢谢啦~我先试一下,是把这个程序放入循环语句中对吧?有什么问题,再请教你啦~~我我觉得这个过程主要是把25个公司分成5组,回归到得到5个beta,然后把beta带入到capm模型中,检验beta的显著性,检验capm模型是否有效。你认为呢?

地板
少年时代balala 发表于 2015-1-29 22:24:26
jingju11 发表于 2015-1-26 06:09
你可以简单定义一个输入格式即可.比如:京剧
我还有一个问题,我想要的是把回归得到的 beta_i 数据集中的rmf的系数(beta)5等分,分组的标准并不是0.7,1.2这些具体的数字,请问怎么把求分位数的函数嵌套进来呢?因为我一共要重复30次,所以只能通过函数来解决。谢谢啦!!

7
少年时代balala 发表于 2015-1-29 22:26:06
jingju11 发表于 2015-1-26 06:09
你可以简单定义一个输入格式即可.比如:京剧
我还有一个问题,我想要的是把回归得到的 beta_i 数据集中的rmf的系数(beta)5等分,分组的标准并不是0.7,1.2这些具体的数字,请问怎么把求分位数的函数嵌套进来呢?因为我一共要重复30次,所以只能通过函数来解决。谢谢啦!!

8
少年时代balala 发表于 2015-1-29 22:45:20
jingju11 发表于 2015-1-26 06:09
你可以简单定义一个输入格式即可.比如:京剧
我试着跑了一下,但是p=input(rmf,grpfmt.)这一句报错,你看我这样写问题在哪呢?感谢~~
%macro mac;
%do i=1 %to 30;
data capm.t&i.;
set capm.riraw1;
if date1>=&i. and date1<=35+&i.;
rif=ri-rf;rmf=rm-rf;
run;

proc reg data=capm.t&i.
outest=capm.beta_&i.;
by code;
model rif=rmf;
run;/*25 obs*/
proc format;
invalue grpfmt
low-0.4=0
0.4<-0.7=1
0.8<-1.1=2
1.2<-1.5=3
1.6<-high=4;
Run;       
proc rank data=capm.beta_&i.
out=capm.beta&i. groups=5;
  ranks p;
p=input(rmf,grpfmt.);
  
var rmf;
run;

%End;
%MEND mac;
%mac;

9
jingju11 发表于 2015-1-30 00:48:10
少年时代balala 发表于 2015-1-29 22:45
我试着跑了一下,但是p=input(rmf,grpfmt.)这一句报错,你看我这样写问题在哪呢?感谢~~
%macro mac;
...
hi,
You will use the data step to replace the rank procedure.
JingJu
  1. data capm.beta&i.;
  2.    set capm.beta_&i.;
  3.    p=input(rmf,grpfmt.);
  4. run;
复制代码

10
少年时代balala 发表于 2015-2-2 17:00:51
jingju11 发表于 2015-1-24 23:14
You need to create an informat for each run. JingJu
太感谢啦!!已经成功解决我的问题了呢~~下次有问题还能请教你吗?

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-3 20:55