FactSet Ownership - Aggregated Insider Transactions

The datasets described herein are proprietary to FactSet Research Systems, Inc. ("FactSet") and may not be copied or distributed. The datasets made available to Quantopian by FactSet are not exhaustive of FactSet's data, products, software, and/or services.

Copyright © 2019 FactSet Research Systems Inc. All rights reserved.

Overview

FactSet Ownership - Aggregated Insider Transactions is a United States specific dataset that summarizes insider transactions of publicly traded companies reported to the U.S Securities and Exchange Commission (SEC). Insider transactions are trades executed by corporate insiders. In this dataset, insider transactions for each publicly traded US company are summarized into daily fields. By leveraging insider transactions data, you can analyze a firm’s insider transaction activity.

Properties

  • Coverage: U.S.
  • Data Frequency: Daily
  • Update Frequency: Daily (updated overnight after each trading day)
  • Timespan: 2004 to present.
  • Point-In-Time Start: November 2018
  • Holdout: 2 years

Methodology

Source

FactSet Ownership - Aggregated Insider Transactions data is sourced directly from SEC filings – Specifically Forms 3, 3/A, 4, 4/A, 5 and 5/A. FactSet collects each record exactly how the form was filed by the insider to the SEC.

Definition of an insider

An insider at a company is an individual who is a senior officer at that company or a person who owns more than 10% of the voting shares of that company.

Forms 3, 4, 5

  • Form 3 is filed when an insider initiates their filing at a company.
  • Form 4 is filed when an insider changes their ownership in a company.
  • Form 5 is filed for any transactions that should have been reported earlier on Form 4 or for transactions that are eligible for deferred reporting.

Note

See the SEC's page for further information on the contents of each form type. Form 3, Form 4, and Form 5 are available for download from the SEC's website.

Point-In-Time

Starting in November 2018, FactSet Ownership – Aggregated Insider Transactions data is collected and surfaced in a point-in-time fashion on Quantopian. This corresponds to when Quantopian started downloading and storing the data on a nightly basis. Timestamps for historical data prior to November 2018 are approximated by adding 24 hours to each record's SEC filing date.

Aggregation

FactSet collects original individual transaction data from the SEC. This data on individual transactions is then aggregated into daily, weekly, monthly, and quarterly metrics that summarize the trading behavior of a firm's insiders. To perform the aggregation, Quantopian groups the individual transactions on two dimensions:

Note

Individual insider transactions are sourced from FactSet, then aggregated together by Quantopian to produce FactSet Ownership – Aggregated Insider Transactions. In the case of FactSet Estimates – Consensus, FactSet performs the aggregation.

Derivative and non-derivative transactions

Most insider transactions handle non-derivative shares; that is, direct shares of the company. Insiders, however, can also acquire or dispose of company ownership through derivative securities. Some examples of a derivative security are a restricted stock unit or an option involving the company. FactSet Ownership – Aggregated Insider Transactions groups derivative and non-derivative insider transactions separately so that they can be analyzed separately.

Trailing calendar days

FactSet Ownership – Aggregated Insider Transactions aggregates insider transactions by trailing calendar days. This is in contrast to trading days which are used in most other Quantopian datasets. Calendar days are any day (including weekends and holidays), while trading days are only days the market is open.

To highlight the behavior of calendar days in this dataset, consider the case where we run a Pipeline on a Monday and aggregate insider transactions from the trailing calendar day (by perfoming a slice with days_aggregated set to 1). Since the lookback is in calendar days, Pipeline will only consider insider transactions from the previous calendar day, which is Sunday in this case. Even though Friday was the previous trading day, Friday's data is ignored, as it is not the previous calendar day.

If we were to run this Pipeline on the next day (Tuesday), we would see insider transactions from Monday, as that is the previous calendar day.

Usage

Ownership – Aggregated Insider Transactions data is part of the quantopian.pipeline.data.factset.ownership module. Aggregated data is accessible via two pipeline DataSetFamilys called Form3AggregatedTrades and Form4and5AggregatedTrades that can be sliced along two dimensions: derivative_holdings and days_aggregated. The result of slicing Form3AggregatedTrades and Form4and5AggregatedTrades is a pipeline DataSet.

Import

# Form 3 transactions
from quantopian.pipeline.data.factset.ownership import Form3AggregatedTrades

# Form 4 and Form 5 transactions
from quantopian.pipeline.data.factset.ownership import Form4and5AggregatedTrades

Example

This example constructs and runs a pipeline that outputs the fraction of insiders buying and fraction of insiders selling each stock over the past 90 calendar days, including initial ownership from Form 3. The pipeline outputs these fractions in the frac_insiders_buying and frac_insiders_selling columns.

from quantopian.pipeline import Pipeline
from quantopian.pipeline.data.factset.ownership import Form3AggregatedTrades
from quantopian.pipeline.data.factset.ownership import Form4and5AggregatedTrades
from quantopian.pipeline.domain import US_EQUITIES
from quantopian.research import run_pipeline

# Slice the Form3AggregatedTrades DataSetFamily and Form4and5AggregatedTrades
# DataSetFamily into DataSets. Here, insider_txns_form3_90d is a DataSet
# containing insider transaction data for Form 3 over the past 90 calendar
# days, and insider_txns_form4and5_90d is a DataSet containing insider
# transaction data for Forms 4 and 5 over the past 90 calendar days. We only
# include non-derivative ownership (derivative_holdings is False).
insider_txns_form3_90d = Form3AggregatedTrades.slice(False, 90)
insider_txns_form4and5_90d = Form4and5AggregatedTrades.slice(False, 90)

# From each DataSet, extract the number of unique buyers and unique sellers.
# We do not need to include unique sellers using Form 3, because Form 3 is
# an initial ownership filing, and so there are no sellers using Form 3.
unique_filers_form3_90d = insider_txns_form3_90d.num_unique_filers.latest
unique_buyers_form4and5_90d = insider_txns_form4and5_90d.num_unique_buyers.latest
unique_sellers_form4and5_90d = insider_txns_form4and5_90d.num_unique_sellers.latest

# Sum the unique buyers from each form together.
unique_buyers_90d = unique_filers_form3_90d + unique_buyers_form4and5_90d
unique_sellers_90d = unique_sellers_form4and5_90d

# Compute the fractions of insiders buying and selling.
frac_insiders_buying_90d = unique_buyers_90d / (unique_buyers_90d + unique_sellers_90d)
frac_insiders_selling_90d = unique_sellers_90d / (unique_buyers_90d + unique_sellers_90d)

# Add columns for the fractions to the result.
pipe = Pipeline(
    columns={
        'frac_insiders_buying_90d': frac_insiders_buying_90d,
        'frac_insiders_selling_90d': frac_insiders_selling_90d
    },
    domain=US_EQUITIES,
    screen=frac_insiders_buying_90d.notnull(),
)

# Run the pipeline over a one year period and print the result.
df = run_pipeline(pipe, '2016-01-01', '2017-01-01')
df.head()

Pipeline DatasetFamilies & Columns

Dataset

Form3AggregatedTrades and Form4and5AggregatedTrades - pipeline DataSetFamilys that provide access to insider transactions data. In order to use either DataSetFamily in a pipeline, they must first be sliced to generate regular pipeline DataSets.

  • Form3AggregatedTrades - a DataSetFamily containing aggregated data for SEC Form 3 filings. Form 3 is filed when an insider initiates their holding.
  • Form4and5AggregatedTrades - a DataSetFamily containing aggregated data for SEC Form 4 and 5 filings. Form 4 is filed when an insider changes their holding, and Form 5 is filed when an insider need to report any transactions that should have been reported earlier on a Form 4, or were eligible for deferred reporting.

Slices

Form3AggregatedTrades and Form4and5AggregatedTrades can be sliced along two dimensions: derivative_holdings and days_aggregated. The result of slicing these is a pipeline DataSet. Note that slicing along both dimensions is required in order to create a dataset.

  • derivative_holdings - Slicing along this dimension selects for non-derivative or derivative holdings. Non-derivative shares are shares of the company's own stock, and derivative shares are shares of a derivative (e.g. ETF) that holds the asset. This can be False for non-derivative shares or True for derivative shares.
  • days_aggregated - Trailing number of calendar days for which we aggregate data over. If days_aggregated is 7, for example, then all transactions from the trailing 7 calendar days are taken into account. This can be 1, 7, 30, or 90. See the Aggregation section for details on the difference between calendar and trading days.

Note

Amendments can be filed for forms 3, 4, and 5 in the event that incorrect information was originally provided. When this occurred prior to the point-in-time start date of November 2018, the original entry is revised in-place in the data, and therefore the data is not point-in-time. After November 2018, amendments are processed in a point-in-time manner; the amendment is accounted for based on the lookback date.

Slicing a DataSetFamily creates a DataSet with fields accessible as BoundColumn attributes. The fields accessible in a DataSet sliced from PeriodicConsensus are listed below.

Form3AggregatedTrades Fields

Each slice of Form3AggregatedTrades creates a pipeline DataSet with 3 fields (accessible as BoundColumn attributes):

  • num_unique_filers (dtype float64) - The number of unique insiders buying shares within the given days aggregated. This field is not forward-filled.
  • asof_date (dtype datetime64) - The latest reported transaction date in the aggregation window.
  • timestamp (dtype datetime64) - The datetime when Quantopian learned about the data point from FactSet. For data prior to November 2018, the timestamp is equal to the latest form filing date in the aggregation window + 24 hours.

Form4and5AggregatedTrades Fields

Each slice of Form4and5AggregatedTrades creates a pipeline DataSet with 4 fields (accessible as BoundColumn attributes):

  • num_unique_buyers (dtype float64) - The number of unique insiders buying shares within the given days aggregated. This field is not forward-filled.
  • num_unique_sellers (dtype float64) - The number of unique insiders selling shares within the given days aggregated. For Form 3, number_unique_sellers is always zero as Form 3 is an initial ownership filing. This field is not forward-filled.
  • asof_date (dtype datetime64) - The latest reported transaction date in the aggregation window.
  • timestamp (dtype datetime64) - The datetime when Quantopian learned about the data point from FactSet. For data prior to November 2018, the timestamp is equal to the latest form filing date in the aggregation window + 24 hours.