22 Mining SEC filings

# i always begin by loading the disco engine if it isn't already loaded
library(discoveryengine)

The SEC is another one of the external data sources that Prospect Analysis regularly screens. Specifically, we utilize SEC Form 3/4/5 filings made by our constituents. These filings are required of “Corporate insiders – meaning a company’s officers and directors, and any beneficial owners of more than ten percent of a class of the company’s equity securities,” and are made whenever an individual first attains that status as a required filer, and then again every time the person buys or sells shares or derivatives in the company. The matched data is used in our predictive models as well as by the Prospect Discovery team, but it can also be valuable to be able to work with the data directly. (Note also that you can use the screening chunk in discoappend – not demonstrated here – in order to see summaries of all matched external data including SEC filings).

22.1 Basics

There is one SEC widget, called sec_filed. This name keeps up the Disco Engine’s convention of using a specific prefix to identify widgets that query matched external data (see also: FEC widgets and California campaign widgets). The most generic way to use the widget is without any arguments:

sec_filer = sec_filed()
display(sec_filer)
## # A tibble: 2,367 x 1
##    entity_id
##        <dbl>
##  1      2723
##  2      2937
##  3      3386
##  4      6194
##  5      6349
##  6      7011
##  7      7251
##  8      7270
##  9      7751
## 10      8002
## # … with 2,357 more rows

The widget also includes the familiar from and to daterange options, so that you can search for people who made filings during a specific time period. For instance, my clients in Engineering might be interested in knowing who has made a recent filing, since these SEC filings can indicate a sudden influx of cash:

engineering_prospect = in_unit_portfolio(engineering)
recent_filer = sec_filed(from = 20180101, to = 20180630)
prospect_who_filed = engineering_prospect %and% recent_filer
display(prospect_who_filed)
## # A tibble: 31 x 1
##    entity_id
##        <dbl>
##  1     14765
##  2     17517
##  3     17544
##  4     19406
##  5     25464
##  6     31155
##  7    122677
##  8    227268
##  9    283796
## 10    301895
## # … with 21 more rows

22.2 Looking for companies

We use the Central Index Key (CIK) to uniquely identify SEC filers and the public companies for whom they work. Looking up a CIK in the Discovery Engine uses the familiar lookup function built in to widgets:

sec_filed(?google, ?facebook, ?apple)
## Regular codes and synonyms:
##       synonym    code
##    google_inc 1288776
##  facebook_inc 1326801
##     apple_inc  320193
##     apple_inc  320193

These IDs can then be used in the sec_filed widget:

display(sec_filed(1288776, 1326801, 320193))
## # A tibble: 23 x 1
##    entity_id
##        <dbl>
##  1     22653
##  2     26031
##  3     26542
##  4    423075
##  5    423745
##  6    453623
##  7    611664
##  8    625613
##  9    666498
## 10    769804
## # … with 13 more rows

22.3 Specific roles

The SEC filings include checkboxes for the filer to indicate which class of required filers (director, officer, ten percent owner, or other) she belongs to, and the sec_filed widget has flags so that you can specifically search for people with these roles. For instance, if in my previous example I wanted to look only for Directors at those companies, I can set director = TRUE:

big_three_director = sec_filed(1288776, 1326801, 320193, director = TRUE)
display(big_three_director)
## # A tibble: 16 x 1
##    entity_id
##        <dbl>
##  1     22653
##  2     26031
##  3     26542
##  4    423075
##  5    423745
##  6    611664
##  7    625613
##  8    666498
##  9    769804
## 10    826016
## 11    863210
## 12    902313
## 13    921697
## 14    931282
## 15   3003117
## 16   3090604

By default, all filings are included regardless of role.

Filers who check “officer” or “other” among their roles also have a free text entry space to more precisely describe their role with the company, and the sec_filed includes an option to search the text of these fields. So, for example, to find people at one of the Big Three companies who’ve described themselves as “Chairman”:

sec_filed(1288776, 1326801, 320193, title_text = "chairman")

One practical use of the title_text argument is to identify filers who were serving on an interim basis at the time of filing:

display( sec_filed(title_text = "interim") )
## # A tibble: 28 x 1
##    entity_id
##        <dbl>
##  1     15763
##  2     31278
##  3    232051
##  4    258787
##  5    268785
##  6    291703
##  7    330239
##  8    333051
##  9    348585
## 10    382348
## # … with 18 more rows