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
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
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
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

Event

  • 1.
    event.sas options compress=yes linesize=o128nocenter 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 eachfund. +~ ****'* .. 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