Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Sort serial acquirers in quint. based on their average acq. performance over their last available 3-year event window of serial acquisitions

    Hello,

    I am working on an event study to analyse acquisition performance of serial acquirers.

    I am analysing M&A activity between 1990 and 2011 in US market. In my dataset, each row equals an acquisition observation. For each acquisition observation, I have return (CAR) and calendar information, and around other 20-30 variables specific to the acquirer, target and transaction, including the respective firms' identifiers. As I am interested in studying acquisition activity of most aggressive acquirers, I limited my research to deals announced by only serial acquirers and created a subsample containing the most extreme serial acquirers (called frequent acquirers) (dummy: frequent)

    I defined serial acquirers those firms that announced >1 acquisitions in any 3-year event window, between 1990 and 2011 and frequent acquirers those who announced >4, consistently with previous literature. I used -asrol- for this issue. Deals completed by firms not belonging to these two categories were dropped.

    Therefore, in my full sample, every acquirer is (at least) a serial acquirer (i.e. it exhibits at least one 3-year event window in which it completed at least 2 acquisitions) but only some are also frequent acquirers.

    In the 21-year period, serial acquirers may exhibit just one 3-year event window of serial acquisitions or they could exhibit multiple ones, depending on the number and proximity of deals they announced.

    Problem: first, using deal announcement dates, I need to (1) find the most recent 3year event window of serial acquisitions for every acquirer (i.e. the most recent 3-year event window in which the acquirer concluded at least two deals) and then (2) I need to sort acquirers in quintiles based on their average acquisition performance (average car) in their most recent 3-year event window. Eventually, I need to repeat the same procedure for the subsample of frequent acquirers.

    Please notice that frequent acquirers need to be ranked according to two different rankings as they are both "simple" serial acquirers (thus to be ranked with the rest of the full sample) and frequent acquirers.

    Below a snippet of my dataset. Data are sorted by acquirer (ncusip) and acquisition announcement date (DateAnnounced).

    Many thanks for your help.


    Code:
    * Example generated by -dataex-. For more info, type help dataex
    clear
    input str6 ncusip int DateAnnounced float(frequent car)
    "000752" 12876 .     .08924098
    "000752" 13818 .     .06256314
    "000752" 14140 .       .302151
    "00077R" 13132 1     .12526032
    "00077R" 13185 1 -.00016230275
    "00077R" 14003 1    -.11267864
    "00077R" 14122 1      .1143486
    "00077R" 14174 1    .034760732
    "000872" 12354 .      .2367528
    "000872" 12425 .    -.06231568
    "000872" 12486 .     -.1448541
    "00087B" 13543 .     .15679727
    "00087B" 13653 .   -.031344533
    "000886" 11042 .   -.007266809
    "000886" 11141 .     .04205509
    "000886" 11421 .   -.018000174
    "000886" 13181 .   -.017275183
    "000886" 13247 .      .1245339
    "000886" 14389 .     .07862046
    "000886" 14663 .    .010172108
    "000886" 14873 .    -.09046644
    "000886" 15011 .   -.070110634
    "000886" 16155 .      .0383034
    "000886" 16638 .     .01705847
    "000886" 17461 .    -.00518387
    "00089C" 13810 .     -.1577245
    "00089C" 13955 .   -.072992705
    "000955" 15256 .    -.11440317
    end
    format %td DateAnnounced
    Last edited by Lorenzo Cardinale; 26 Mar 2022, 08:19.

  • #2
    Code:
    replace frequent = 0 if missing(frequent)
    
    //  IDENTIFY LAST WINDOW
    local 3years = 365*3
    rangestat (count) n_acq_3_yr = DateAnnounced, by(ncusip) interval(DateAnnounced, ///
        -`3years', 0)
    by ncusip (DateAnnounced), sort: egen last_window_ends = max(cond(n_acq_3_yr > 1, ///
        DateAnnounced, .))
    gen byte in_last_window = inrange(last_window_ends - DateAnnounced, 0, `3years')
    
    //  ASSIGN FIRMS TO QUINTILES BASED ON MEAN CAR IN LAST WINDOW
    by ncusip: egen performance = mean(cond(in_last_window, car, .))
    frame put ncusip frequent performance, into(working)
    frame working {
        duplicates drop
        xtile performance_group = performance, nq(5)
    }
    frlink m:1 ncusip, frame(working)
    frget performance_group, from(working)
    
    //  ASSIGN FREQUENT FIRMS TO QUINTILES BASED ON MEAN CAR IN LAST WINDOW
    frame working {
        drop performance_group
        keep if frequent
        xtile frequent_performance_group = performance, nq(5)
    }
    frget frequent_performance_group, from(working)
    Notes:
    1. Coding a logical variable, like frequent, with 1 and missing is a bad idea in Stata. At best it requires more complicated and cluttered code to work properly. At worst it traps people into making serious errors that only get recognized down the road when they have done more damage. Always code logical variables in Stata as 1/0. If there are observations where the value of the variable is actually not determined, then a missing value can be appropriate for that. But don't use missing value for "No," because Stata automatically treats missing value (or anything other than 0) as "Yes."

    2. In your example data, there is only one firm designated as frequent, so it is not possible to calculate quintiles among the frequent firm. Presumably you won't face this difficulty in the full data set.

    3. The above code uses frames, so it requires version 16 or later.

    Thank you for using -dataex- on your very first post.

    Comment


    • #3
      I forgot to mention in the previous post that -rangestat- is by Robert Picard, Nick Cox, and Roberto Ferrer. It is available from SSC.

      Comment


      • #4
        Thank you very much Clyde, your solution works great!

        Comment

        Working...
        X