1. The document contains SAS code to analyze equity fund return data around buy and sell transactions.
2. The code reads fund holdings and return data, merges the data, and calculates excess returns relative to market indexes.
3. Statistical tests and averages are calculated to compare returns for periods before and after hypothesized buy and sell signals.
1. event.sas
options compress=yes linesize=o128 nocenter i
libname datalib r /home!usro4!mikeclre/datalib' i
libname dataout '(home/usr04(mikeclrejprogramsfeventtime I;
filename funds '/home!usr04!mikeclre!data/UsableEquityFundWithLatestNames. txt';
filename rtn '!home!usr04:!mikeclre!data!NewestEquityFundTotalReturnsWithCusipAfter1989. txt' ;
/***** '* ** *. '* '* '* *** .*** ** ••• '* ** "" *** ***
.. Combine all years I data of a security into one
.. record.
*" ••••••••••••• * •• *. * *. '* ••• * ** •••••••••••••• /
macro mergeyrs(setnam, arrvar, keepvars);
data &setnarn;
set &setnarnj
by iCdi_rtn CUSiPi
keep &keepvars &arrvar.l-&arrvar.lOB;
array &arrvar (108); /* 1989 - 1997 "I
retain &arrvar.1-&arrvar.10B;
if lfirst.eusip) then
do;
do i=l to lOB;
&arrvar(i)
end;
end;
if (yy <: 89 or yy > 97) then
do;
file "gstat. year .log" ;
put "ERROR: YEAR OUT OF RANGE ... " ICDI/YY:~ iedi_rtn "I" yy;
abort;
end;
idx = (yy - 89) • 12 + mm;
&arrvar (idx) : pretmkt i
if (last. eusip) then
dOj
output;
end;
-mend mergeyrs;
I··· *•••••••••••• *••• *••• *****.. ** ** *****... *••••• *•••••••
• Read funds data .
• *•••••••••••••••••• *••••••••••••••••••••••••••• **••••• I
data sec i
infile funds dlm:' 09 I x dsd;
input ellS ip $;
proc sort data=sec;
by cllsip;
I·····
• Make sure that the ells ips are unique .
*.* ••••••• *••••••••••••
••••••• *•••••••••••••••• '* ••• *.**** ••••••••• *••••••••••• I
data sec;
set sec;
by cusip;
Page 1
2. event.sas
if (first. cusip) ;
proc sort data=datalib.cleantrd out=trades( keep yy rom cllsip prine bs) .
by cusip;
1* '" '" '" '" '" "' ... '" "'.., **** ** **** '" '" ***.., *** '" "' •• ****** "'..,.., ...... '" '" '" '" "' ... **..,..,
* Keep only trades of the securities that are in the
* FundNameLi st.
******** * ......... "' .... *. ********** '" ** **** *****..,..,..,.., ** ............... *. *** I
data trades;
merge trades (in=intrades) sec (in",insec) i
by CUSiPi
if (intrades and insec) i
if ((bs = llB" and prine < 0) or (bS = liS" and prine> 0» then
do;
file "gstat. cusip .log" i
put "wrong PRINe sign for cusip: II CUSiPi
delete;
end;
run;
/* * '" **11'*********** '" '" * ** ... *'" *..,.., ******** * * * * * * ,*11'****'" **..,..,.., *
'" Read return data and generate a dataset with
'" each record containing the monthly data of the
'" current month's return.
** * * ** *** ••• ***** ** * * * * * * * * * ....... **** ** *** * ... * ...... ** ..... ,. * * . . ** /
data rtn;
infile rtn dlm::::'09'x dsd;
length cusip $ 8 yy 4 j
drop first i cc ccyy;
retain first 1;
if (first:::: 1) then
do;
first:::: 0;
input;
delete;
end;
else
do;
input cusip $ iCdi_rtn $ ccyy @j
cc :::: int (ccyy/100) ;
iyy -= ccyy - cc"'100;
do i=l to 12;
input pret @j
if (pret :::: -95 or pret -99) then pret
if (pret A:::: . ) then
do;
rrun = i;
yy = iyy;
output;
end;
end;
input;
end;
run;
/************. *........ ******* * *... ** ••••• *** ** ****** ****,.,. * *...
... Read Historical Market Return Data. Merge with
... Mutual Fund Return Data and calculate excess return
Page 2
3. event.sas
.. for each fund.
+~ ****'* .. I< **. ++ + + ++ + + + + + ........ ***.***. * * 1< ...... * .. * + ** ... ** ****** I
proc sort data = rtn;
by yy rom;
data brad; set datalib.brad(keep = yy rom mrp rfl; run;
proc sort data = brad; by yy mm; run;
data rtn; merge rtn(in=inrtn) brad (in=inbradl i by yy rom; if inrtn;
pretmkt = pret - rf - mrp;
drop pret rf mrp;
run;
proc sort data = rtn i
by iCdi_rtn cusip yy mrnj
/******* ** ••••• * *11'******* ***** •••• *** ** **** *** * * * 1r***** *
* Combine all years returns data of a security into one
I
... record.
***** ** .... ****YTY*.***** **11'11'************""" ** .. ** ...... ** ...... /
mergeyrs (rtn, ret, iCdi_rtn cusipl
/******* *** •• _**'* .. * *********** ....
.. Merge each trade date with four years of returns data.
*. *.'*** .. *** .. **. *** ** * * .. 1<
****************.***************** ••• ***************** *1
proc sort data trades; by cusip; run;
proc sort data = rtn ; by cusip; run;
data trades; merge trades {in=intrades 1 rtn' in=inrtnl; by cusip; if intrades; if inrtn;
array pret (49) ;
array ret (lOB);
1* array avgret (49); *1;
idx = (yy-B9)*12 + mm;
do i=l to 49;
pret(i) = .;
if (idx 25+i 1) and (idx - 25+i <= lOB) then do;
pret (i) = ret(idx-25+i);
end;
end;
aprinc= abs (prine); 1* Need nonnegative weights * I;
1* drop retl-retlDB idx i princ cusip iCdi_rtn yy rom; * I;
drop retl-retlOB idx i princ;
1* * * * *** **** ****** **********••• ** ******** * *** **•• *******
* Create SAS dataset for T-Test Calculations
**** *** ** ***.*.** ••••••••• ****.* •••••••• ***** ** ****** ** I
proc sort data = trades; by bs; run ..
proc ttest data =tradesj
class bs;
var pretl-pret49;
title "Event Time Analysis: Average Returns T-Tests for Significant Difference Between BuY and Sell Transactions" ..
run;
proc means da ta = trades t prt nopri nt ;
output out = outl t=tl- t49 prt=prtl-prt49 i
by bs;
var pretl-pret49;
Page 3
4. event.sas
run;
proc transpose data", outl out'" OUt2i var tl-t49; run;
proc transpose data'" outl out", outl; var prtl-prt49; run;
data out; merge outl (""here "" (_NAME not in (Il_TYPE_ll. II _FREQ_")) rename (coIl bp co12 spJ I
out2 (where = {_NAME not in ("_TYPE_", "_FREQ_"}) rename (coIl bt co12 stll;
t=_N_ 25; label bp = "Buy P-Values"
sp = "Sell P-Values"
bt "Buy T-Statistics lI
st "Sell T-Statistics"
t = 1!Time"; drop NAME ;
run;
proc print label noobs data = out;
format bt 10.4 bp 10.4 st 10.4 sp 10.4;
var t bt bp st SPi
title I1Event Time Analysis: Average Returns T-Tests for Significant Difference from Zero";
run;
/* ** *** •••• * ** * .
.. Calculate weighted and unweighted averages of returns
'* for 24 months prior to and following bUy or sell
* * *'*'** * * * * * * *'*'**'*'*'*'*'*'*'*'* '*'*'*'*'*'*'**'** •• *•••••••••• * ** * '**. '* I
proc means data = trades noprint;
output out = out1 mean = pret1-pret49;
by bs;
var pretl-pret49 i
title ~Event Time Analysis: Average Unweighted Returns for 24 months before and after Trade Date";
run;
proc means data = trades noprint;
output out = out2 mean = pret1-pret49 j
by bs;
weight aprinc;
var pret1-pret49j
title "Event Time Analysis: Average Returns Weighted by Trade principle 24 months before and after Trade Date";
run;
1* * * * ** •• *. * * *•• * *•• * ••• '* * * *••• * ** *••••• '* ••••• *'*'** * * * * * *
• Format and Output Resul ts
•••••• *•• *'**'* ••••••••••• '* ••• '* *•• * *. '*.'* * * * * * * * * *'*'*'** * * * * I
proc transpose data = out1 out = out1; run;
proc transpose data = out2 out = out2; run;
data out; merge outl {where = (NAME not in (" TYPB "," FRBQ ")) rename = (coIl ubuy col2 ... usell})
out2{where = (-NAME- not in ("-Typg-u,"-FRBQ-")) rename = (coIl wbuy col2 = wsell)) i
t= N - 25; label - ubuy - = lIunwe'ig hted Buy Trades"
- - usell = IIUnweighted Sell Trades"
wbuy = IIWeighted Buy Trades"
wsell =. "Weighted Sell Trades"
t =: "Time" i drop _NAME_;
file 1tevent .data" i
put t 4.0 +1 ubuy 11. 8 +1 usell 11.8 +1 wbuy 11. 8 +1 wsell 11. 8 i
run;
proc print label noobs data = out;
fonnat ubuy 11.8 use11 11.8 wbuy 11.8 wsell 11.8;
var t ubuy usell wbuy wsell i
title "Event Time Analysis: Average Excess Returns for 24 months before and after Trade Date";
run;
endsasj
Page 4