iangow/activist_director

Examine reasons for dropping activist directors

Closed this issue · 5 comments

@sapyung

I suspect that most cases with activist directors belong in our sample. I think it would be useful to investigate to work out which criteria cause the cases below to be excluded from activism_sample. Perhaps we should tweak the criteria to include these.

library(DBI)
library(dplyr, warn.conflicts = FALSE)

pg <- dbConnect(RPostgres::Postgres(), bigint = "integer")

rs <- dbExecute(pg, "SET search_path TO activist_director, public")

activist_directors <- tbl(pg, "activist_directors")
activism_events <- tbl(pg, "activism_events")

sharkwatch <- tbl(pg, sql("SELECT * FROM factset.sharkwatch"))
dissidents <- tbl(pg, sql("SELECT * FROM factset.dissidents"))
    
sw_all <-
    sharkwatch %>%
    inner_join(dissidents)
#> Joining, by = "campaign_id"

campaign_ids <-
    activism_events %>%
    select(campaign_ids) %>%
    mutate(campaign_id = unnest(campaign_ids)) 

missing_ads <-
    activist_directors %>%
    anti_join(campaign_ids, by="campaign_id") %>%
    inner_join(sw_all, by="campaign_id")

missing_ads %>% select(1:5)
#> # Source:   lazy query [?? x 5]
#> # Database: postgres [igow@iangow.me:5432/crsp]
#>    campaign_id first_name last_name appointment_date permno
#>          <int> <chr>      <chr>     <date>            <int>
#>  1  1073545271 Brian      Kahn      2014-05-20        10517
#>  2  1073545271 Matthew    Avril     2014-07-09        10517
#>  3   874133648 Adam       Mizel     2009-03-19        89889
#>  4   474991507 Robert     Davis     2013-01-29        90643
#>  5  1073546346 Jeffrey    Smith     2015-11-12        89217
#>  6  1073545702 John       Schneider 2014-12-03        85272
#>  7   821236602 Nicholas   Swenson   2012-06-05        11368
#>  8  1073544876 Nicholas   Swenson   2012-06-05        11368
#>  9  1073544876 William    Foudray   2013-06-12        11368
#> 10  1073544876 Seth       Barkett   2013-06-12        11368
#> # ... with more rows

missing_ads %>% count()
#> # Source:   lazy query [?? x 1]
#> # Database: postgres [igow@iangow.me:5432/crsp]
#>       n
#>   <int>
#> 1   869

missing_ads %>%
     count(dissident, holder_type) %>%
     arrange(desc(n))
#> # Source:     lazy query [?? x 3]
#> # Database:   postgres [igow@iangow.me:5432/crsp]
#> # Groups:     dissident
#> # Ordered by: desc(n)
#>    dissident                                   holder_type               n
#>    <chr>                                       <chr>                 <int>
#>  1 Steel Partners, L.L.C.                      Hedge Fund Company       33
#>  2 Lloyd I. Miller, III                        Individual               14
#>  3 Shareholder Advocates for Value Enhancement Named Stockholder Gr…    13
#>  4 Vintage Capital Management LLC              Other Stake Holders      11
#>  5 The Singer Children's Management Trust      Other Stake Holders       9
#>  6 Leap Tide Capital Management LLC            Hedge Fund Company        8
#>  7 Wynnefield Capital Management LLC           Hedge Fund Company        8
#>  8 ValueAct Capital Management LP              Hedge Fund Company        8
#>  9 AMG Investments LLC                         Other Stake Holders       7
#> 10 Relational Investors LLC                    Investment Adviser        7
#> # ... with more rows
 
dissidents %>% 
     filter(dissident=="Lloyd I. Miller, III") %>%
     select(campaign_id) %>%
     inner_join(dissidents) %>% 
     group_by(campaign_id) %>% 
     summarize(dissidents = sql("array_agg(dissident ORDER BY dissident)")) %>%
     count(dissidents) %>% arrange(desc(n))
#> Joining, by = "campaign_id"
#> # Source:     lazy query [?? x 2]
#> # Database:   postgres [igow@iangow.me:5432/crsp]
#> # Ordered by: desc(n)
#>   dissidents                                                             n
#>   <S3: pq__text>                                                     <int>
#> 1 "{\"Lloyd I. Miller, III\"}"                                          34
#> 2 "{\"Lloyd I. Miller, III\",\"The Singer Children's Management Tru…     4
#> 3 "{\"Dialectic Capital Management LP\",\"Lloyd I. Miller, III\",\"…     2
#> 4 "{\"David S. Oros\",\"Lloyd I. Miller, III\",\"Sherman Capital Gr…     2
#> 5 "{\"Dr. Gerard Soula\",\"Dr. Raymond E. McKee\",\"Lloyd I. Miller…     1
#> 6 "{\"Lloyd I. Miller, III\",\"Riley Investment Management LLC\"}"       1
#> 7 "{\"Lloyd I. Miller, III\",\"The Singer Children''s Management Tr…     1
#> 8 "{\"Celeritek Shareholder Protective Committee\",\"Kenneth Potash…     1

dissidents %>% 
     filter(dissident=="Lloyd I. Miller, III") %>% distinct(campaign_id) %>%
     inner_join(activist_directors) %>%
     select(campaign_id, last_name, first_name, appointment_date, independent) %>%
     arrange(appointment_date) %>% print(n = Inf) 
#> Joining, by = "campaign_id"
#> # Source:     lazy query [?? x 5]
#> # Database:   postgres [igow@iangow.me:5432/crsp]
#> # Ordered by: appointment_date
#>    campaign_id last_name    first_name appointment_date independent
#>          <int> <chr>        <chr>      <date>           <lgl>      
#>  1   334725505 Miller       Lloyd      2006-10-25       FALSE      
#>  2   612559302 Miller       Lloyd      2007-04-25       FALSE      
#>  3   612559302 Miller       Lloyd      2007-04-25       FALSE      
#>  4  1067206660 Miller       Lloyd      2008-03-06       FALSE      
#>  5   550820727 Donahue      Todd       2008-09-12       TRUE       
#>  6   550820727 Hughes       Joel       2008-12-08       TRUE       
#>  7   550820727 Hughes       Joel       2008-12-08       TRUE       
#>  8   386011014 Howe         Alan       2010-08-23       TRUE       
#>  9  1009091226 Pons         Robert     2011-10-17       TRUE       
#> 10   941956423 Pons         Robert     2012-07-23       TRUE       
#> 11   941956423 Singh        Dilip      2012-07-23       TRUE       
#> 12  1015748210 Gallenberger Mark       2013-01-31       TRUE       
#> 13  1015748210 Howe         Alan       2013-01-31       TRUE       
#> 14  1073546425 Brodsky      Michael    2015-11-05       TRUE

Created on 2018-10-22 by the reprex package (v0.2.0).

Not clear why Joel Hughes is duplicated in the table above. Is this common?

We lost a variable "holder_type" in factset.sharkwatch

We only have 1,951 activism_events in activist_director.activism_events. I am not sure what happened. I think the changes in filter would have caused this very recently.

We lost a variable "holder_type" in factset.sharkwatch

dissident_data <-
dissidents %>%
group_by(campaign_id) %>%
summarize(hedge_fund = bool_or(holder_type %in% c("Hedge Fund Company", "Investment Adviser")),
sharkwatch50 = bool_or(sharkwatch50 == "Yes"),
holder_types = sql("array_agg(holder_type ORDER BY holder_type)"),
dissidents = sql("array_agg(dissident ORDER BY dissident)"))

The initial filter we used in the beginning would have been different so we collected a bigger set of activist directors. I confirm three main reasons for these activist director being dropped.
(1) eff_announce_date > dlstdt: The company was delisted prior to activism announcement.
(2) eff_announce_date before 2004: The activism events were announced before 2004.
(3) 13D Filer - No Publicly Disclosed Activism.
So I believe the activist director sample is comprehensive and complete.

WITH dropped_cases AS ( 
SELECT DISTINCT a.campaign_id
FROM activist_director.activist_directors AS a 
LEFT JOIN activist_director.activism_sample AS b 
ON a.campaign_id=ANY(b.campaign_ids)
WHERE b.permno IS NULL),

matched_cases AS (
SELECT a.*, b.cusip_9_digit, b.company_name, b.dissident_group, b.country, b.state_of_incorporation, b.factset_industry, b.s13d_filer, b.proxy_fight, c.holder_type, b.announce_date, b.activism_type, date_original_13d_filed, d.permno
FROM dropped_cases AS a 
INNER JOIN factset.sharkwatch AS b 
ON a.campaign_id=b.campaign_id
INNER JOIN factset.dissidents AS c 
ON b.campaign_id=c.campaign_id
LEFT JOIN factset.permnos AS d
ON substr(b.cusip_9_digit,1,8)=d.ncusip
WHERE country='United States'
AND activism_type != '13D Filer - No Publicly Disclosed Activism' --Reason 1
AND least(date_original_13d_filed, announce_date) BETWEEN '2004-01-01' AND '2016-12-31' -- Reason 2
ORDER BY permno, dissident_group),

filtered AS (
SELECT DISTINCT campaign_id, a.permno, company_name, dissident_group, dlstcd, dlstdt, LEAST(announce_date, date_original_13d_filed) AS eff_announce_date
FROM matched_cases AS a 
LEFT JOIN crsp.msedelist AS b 
ON a.permno=b.permno
ORDER BY permno, dissident_group)

SELECT *
FROM filtered 
WHERE eff_announce_date <= dlstdt -- Reason 3