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- 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 sample data(data=aaa).
data firm r rm
040130 45920010 0.070673 0.017276
040227 45920010 -0.025899 0.012209
040331 45920010 -0.048290 -0.016359
: : : :
171229 45920010 -0.003572 0.009832
Show us some example data?
Being a sometimes lazy programmer I might be tempted to add 10 variable to you data, one for each period such that period1=1 when date is in the given interval and 0 otherwise.
Something like:
data aaa ; set beta.beta ; keep cusip date ret sprtrn ; format date yymmdd6. ; rename cusip=firm ret=r sprtrn=rm ; period1 = (2004 le year(date) le 2008 ); period2 = (2005 le year(date) le 2009 ); /* continue the obvious pattern*/ run ;
Then your regression could look like:
proc reg data = temp outest = results ;
where period1=1;
model r = rm ;
by firm ;
quit ;
which would lend itself to a do 1 to 10 macro loop with : where period&i = 1;
I would also be tempted not to prefilter the "too few return days" but capture the n actually used by the model by adding:
ods output Nobs = ObsUsed;
to the Proc reg (and accumulating that as well)
You might want to add a label to the model statement such as:
Period&i: model ....
to have some additional information about which regression things are coming from as that label will be in the OUTEST or other model related output sets.
I have to say this bit of code is not obvious as to purpose
%do x = 50 %to 66 ; data temp ; set gooddata ; if &x - 49 <= n <= &x ; per = &x ;
lots of magic numbers.
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.