Good evening everyone,
I am trying to calculate 3-day-window (Day -1,Day 0, Day +1) market-adjusted buy-and-hold return with CRSP data.
I checked several posts which had a similar topic to mine but still can't figure out how to do it.
My data are as below:
TICKER | DATE | RET | VWRETX |
AAAP | 2007/05/01 | 0.033 | -0.0173 |
AAAP | 2007/05/02 | 0.021 | 0.00147 |
AAAP | 2007/05/03 | -0.01 | 0.00165 |
AAAP | 2007/05/04 | 0.016 | 0.03 |
AAAP | 2007/05/05 | 0.023 | 0.045 |
AAAP | 2007/05/06 | -0.005 | 0.004 |
AAPL | 2007/05/01 | -0.056 | 0.0014 |
AAPL | 2007/05/02 | 0.029 | -0.007 |
AAPL | 2007/05/03 | 0.1 | -0.00016 |
AAPL | 2007/05/04 | 0.001 | 0.045 |
AAPL | 2007/05/05 | -0.0821 | 0.0018 |
AAPL | 2007/05/06 | 0.005 | 0.065 |
RET = stock return, and VWRETX = market return.
And the formula is: { [(1+RET) of day -1]*[(1+RET) of day 0]*[(1+RET) of day +1]
- { [1+VWRETX) of day -1]*[1+VWRETX) of day 0]*[1+VWRETX) of day +1] }
Also, I want to set each day as day 0 so that I can get buy-and-hold return for each day (somewhat similar to moving average).
How can I do that? Any advice or comment will be highly appreciated.
Thank you!
One of many ways to do this. Merging data views:
data have;
input TICKER $ DATE:yymmdd. RET VWRETX;
format date yymmdd10.;
datalines;
AAAP 2007/05/01 0.033 -0.0173
AAAP 2007/05/02 0.021 0.00147
AAAP 2007/05/03 -0.01 0.00165
AAAP 2007/05/04 0.016 0.03
AAAP 2007/05/05 0.023 0.045
AAAP 2007/05/06 -0.005 0.004
AAPL 2007/05/01 -0.056 0.0014
AAPL 2007/05/02 0.029 -0.007
AAPL 2007/05/03 0.1 -0.00016
AAPL 2007/05/04 0.001 0.045
AAPL 2007/05/05 -0.0821 0.0018
AAPL 2007/05/06 0.005 0.065
;
data t_1 / view=t_1;
set have;
date = intnx("day", date, +1);
rename ret=ret_1 vwretx=vwretx_1;
run;
data t1 / view=t1;
set have;
date = intnx("day", date, -1);
rename ret=ret1 vwretx=vwretx1;
run;
data want;
merge t_1 have(in=ok) t1;
by ticker date;
if ok;
if n(of ret:) = 3 then
ma_ret = (ret_1+1)*(ret+1)*(ret1+1) -
(vwretx_1+1)*(vwretx+1)*(vwretx1+1);
keep ticker date ret vwretx ma_ret;
run;
proc print data=want noobs; run;
TICKER DATE RET VWRETX ma_ret AAAP 2007-05-01 0.0330 -0.01730 . AAAP 2007-05-02 0.0210 0.00147 0.05838 AAAP 2007-05-03 -0.0100 0.00165 -0.00625 AAAP 2007-05-04 0.0160 0.03000 -0.04915 AAAP 2007-05-05 0.0230 0.04500 -0.04648 AAAP 2007-05-06 -0.0050 0.00400 . AAPL 2007-05-01 -0.0560 0.00140 . AAPL 2007-05-02 0.0290 -0.00700 0.07428 AAPL 2007-05-03 0.1000 -0.00016 0.09551 AAPL 2007-05-04 0.0010 0.04500 -0.03601 AAPL 2007-05-05 -0.0821 0.00180 -0.19152 AAPL 2007-05-06 0.0050 0.06500 .
One of many ways to do this. Merging data views:
data have;
input TICKER $ DATE:yymmdd. RET VWRETX;
format date yymmdd10.;
datalines;
AAAP 2007/05/01 0.033 -0.0173
AAAP 2007/05/02 0.021 0.00147
AAAP 2007/05/03 -0.01 0.00165
AAAP 2007/05/04 0.016 0.03
AAAP 2007/05/05 0.023 0.045
AAAP 2007/05/06 -0.005 0.004
AAPL 2007/05/01 -0.056 0.0014
AAPL 2007/05/02 0.029 -0.007
AAPL 2007/05/03 0.1 -0.00016
AAPL 2007/05/04 0.001 0.045
AAPL 2007/05/05 -0.0821 0.0018
AAPL 2007/05/06 0.005 0.065
;
data t_1 / view=t_1;
set have;
date = intnx("day", date, +1);
rename ret=ret_1 vwretx=vwretx_1;
run;
data t1 / view=t1;
set have;
date = intnx("day", date, -1);
rename ret=ret1 vwretx=vwretx1;
run;
data want;
merge t_1 have(in=ok) t1;
by ticker date;
if ok;
if n(of ret:) = 3 then
ma_ret = (ret_1+1)*(ret+1)*(ret1+1) -
(vwretx_1+1)*(vwretx+1)*(vwretx1+1);
keep ticker date ret vwretx ma_ret;
run;
proc print data=want noobs; run;
TICKER DATE RET VWRETX ma_ret AAAP 2007-05-01 0.0330 -0.01730 . AAAP 2007-05-02 0.0210 0.00147 0.05838 AAAP 2007-05-03 -0.0100 0.00165 -0.00625 AAAP 2007-05-04 0.0160 0.03000 -0.04915 AAAP 2007-05-05 0.0230 0.04500 -0.04648 AAAP 2007-05-06 -0.0050 0.00400 . AAPL 2007-05-01 -0.0560 0.00140 . AAPL 2007-05-02 0.0290 -0.00700 0.07428 AAPL 2007-05-03 0.1000 -0.00016 0.09551 AAPL 2007-05-04 0.0010 0.04500 -0.03601 AAPL 2007-05-05 -0.0821 0.00180 -0.19152 AAPL 2007-05-06 0.0050 0.06500 .
data have;
input TICKER $ DATE :yymmdd. RET VWRETX;
format date yymmdd10.;
datalines;
AAAP 2007/05/01 0.033 -0.0173
AAAP 2007/05/02 0.021 0.00147
AAAP 2007/05/03 -0.01 0.00165
AAAP 2007/05/04 0.016 0.03
AAAP 2007/05/05 0.023 0.045
AAAP 2007/05/06 -0.005 0.004
AAPL 2007/05/01 -0.056 0.0014
AAPL 2007/05/02 0.029 -0.007
AAPL 2007/05/03 0.1 -0.00016
AAPL 2007/05/04 0.001 0.045
AAPL 2007/05/05 -0.0821 0.0018
AAPL 2007/05/06 0.005 0.065
;
data want;
if _N_=1 then do;
declare hash h(dataset:'have');
h.definekey('ticker', 'date');
h.definedata('ret', 'vwretx');
h.definedone();
end;
set have;
ret0=ret; vwretx0=vwretx;
rc=h.find(key:ticker, key:date-1);
ret_1=ifn(rc=0, ret, .);
vwretx_1=ifn(rc=0, vwretx, .);
rc=h.find(key:ticker, key:date+1);
ret1=ifn(rc=0, ret, .);
vwretx1=ifn(rc=0, vwretx, .);
ma_ret = (ret_1+1)*(ret0+1)*(ret1+1) -
(vwretx_1+1)*(vwretx0+1)*(vwretx1+1);
keep ticker date ret vwretx ma_ret;
format ma_ret 8.5;
run;
Result:
ticker date ret vwretx ma_ret AAAP 2007-05-01 0.021 0.00147 . AAAP 2007-05-02 -0.01 0.00165 0.05838 AAAP 2007-05-03 0.016 0.03 -0.00625 AAAP 2007-05-04 0.023 0.045 -0.04915 AAAP 2007-05-05 -0.005 0.004 -0.04648 AAAP 2007-05-06 0.023 0.045 . AAPL 2007-05-01 0.029 -0.007 . AAPL 2007-05-02 0.1 -0.00016 0.07428 AAPL 2007-05-03 0.001 0.045 0.09551 AAPL 2007-05-04 -0.0821 0.0018 -0.03601 AAPL 2007-05-05 0.005 0.065 -0.19152 AAPL 2007-05-06 -0.0821 0.0018 .
Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!
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.
Ready to level-up your skills? Choose your own adventure.