Dear all,
I'm working on a regression with rolling beta.
My regression starts from 2004/01/31 to 2017/12/31.
Based on 60 monthly returns, estimated betas for each of the two stocks at the end of each year for the recent 10 years.
For example, 2004/01/31 to 2008/12/31, 2005/01/31 to 2009/12/31, 2006/01/31 to 2010/12/31, ...., 2013/01/31 to 2017/12/31
It is to obtain period beta for stock A and B by 10 periods.
Here are my expected results:
beta (A) beta (B)
period 1 (2004/01/31 ~ 2008/12/31) x.xx x.xx
period 2 (2005/01/31 ~ 2009/12/31) x.xx x.xx
: : :
period10 (2013/01/31 ~ 2017/12/31) x.xx x.xx
SAS code in my textbook is following.
How should I fix it?
data aaa ;
set beta.beta ;
keep cusip date ret sprtrn ;
format date yymmdd6. ;
rename cusip=firm ret=r sprtrn=rm ;
run ;
proc sort data=aaa ;
by firm date ;
run ;
data begin (keep=firm bgndate) end (keep=firm enddate) ;
set aaa ;
by firm ;
if first.firm then do ;
bgndate=date ;
format bgndate yymmdd6. ;
output begin ;
end ;
if last.firm then do ;
enddate=date ;
format enddate yymmdd6. ;
output end ;
end ;
run ;
data length ;
merge begin end ;
by firm ;
* delete firms with too few return days ;
if bgndate > mdy (01,31,13) then delete ;
if enddate < mdy (12,31,08) then delete ;
keep firm ;
run ;
data gooddata ;
merge aaa length (in=a) ;
by firm ;
if a ;
n + 1 ;
if first.firm then n=1 ;
run ;
%macro estim ;
%do x = 50 %to 66 ;
data temp ;
set gooddata ;
if &x - 49 <= n <= &x ;
per = &x ;
proc reg data = temp outest = results ;
model r = rm ;
by firm per ;
quit ;
proc append base = betas1 data = results ;
%end ;
%mend estim ;
%estim ;
run ;
Here is example data(data=aaa).
Date firm r rm
040129 45920010 0.01234 0.00134
040227 45920010 0.00123 -0.00145
: : : :
171227 45920010 0.12398 0.00258
040129 59491810 0.01234 0.00134
040227 59491810 0.00123 -0.00145
: : : :
171227 59491810 0.12398 0.00258
SAS code in my textbook is following.
How should I fix it?
What is wrong with it? Please be specific.
1) Make a dataset (Key_Table) like :
id start end
1 2004/01/31 2008/12/31
1 2005/01/31 2009/12/31
1 2013/01/31 2017/12/31
2) Make a macro .
%macro estim (id=,start=,end=);
proc reg data =have(where=(id=&id and date between &start and &end)) outest = results ;
model r = rm ;
by firm per ;
quit ;
proc append base = betas1 data = results ;
%end ;
%mend estim ;
3) CALL EXECUTE() to go through.
data _null_;
set Key_Table;
call execute(cats('%estim (id=',id,',start=',start,',end=',end,')'));
run;
Don't miss out on SAS Innovate - Register now for the FREE Livestream!
Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.