Python function: getInsiderTradesData()
| Specification | Value |
|---|
| Delivery Frequency | continuous, daily |
| Data Frequency | event-driven |
| Reporting Lag | 87% within 5 min of SEC acceptance; full coverage within 24h |
| Coverage | 5,300+ U.S. equities, 97,000+ insiders, SEC Forms 3/4/5 |
| History | Since 2009-01-02 |
| Availability | Free |
Product Overview
Overview
Corporate Insider Transactions provides structured, near real-time data on insider buying and selling activity derived from SEC Forms 3, 4, and 5 (including amendments 3/A, 4/A, 5/A). The dataset captures non-derivative transactions — direct open-market purchases and dispositions — filed by corporate officers, directors, and beneficial owners (10%+ holders) of U.S. public companies.
The dataset contains 3.5M+ transactions spanning 5,300+ tickers and 97,000+ unique insiders, with history back to January 2009.
Data Pipeline & Latency
Scalar Field ingests insider filings through two complementary paths:
- Real-time stream: A persistent connection to SEC EDGAR receives filing notifications within seconds of acceptance. Structured transaction data is fetched by accession number and written to the database. If the data is not yet available, the system retries automatically until it arrives.
- Daily reconciliation: A batch job runs each morning, performing an incremental pull by ticker to catch any filings missed by the real-time stream or delayed in SEC indexing.
Ingestion Latency (last 7 days)
The gap between when the SEC accepts a filing (filed_at) and when it appears in Scalar Field (ts_recv):
| Lag | % of filings |
|---|
| < 1 minute | 73% |
| 1–5 minutes | 14% |
| 5–60 minutes | 9% |
| 1–24 hours | 4% |
| > 24 hours | 0% |
87% of filings are ingested within 5 minutes of SEC acceptance. The remaining ~13% are typically filings where the SEC API indexes the structured data with a short delay; these are caught by automatic retries or, in rare cases, the daily batch reconciliation.
Timestamp Semantics: ts_recv vs filed_at vs transactionDate
This distinction is critical for backtesting and signal construction:
| Timestamp | Meaning | Use Case |
|---|
ts_recv | When Scalar Field’s pipeline first ingested the record (UTC → New York time). This is the point-in-time timestamp — the earliest moment this data was available in the system. | Point-in-time backtesting. Use this as your event timestamp to avoid look-ahead bias. |
filed_at | When the SEC filing was officially accepted by EDGAR (UTC → New York time). | Regulatory timing analysis. Measures the insider’s filing delay relative to the transaction. |
transactionDate | The actual date the insider executed the trade. | Event studies. The true economic event date — but note this is only known after the filing lands. |
Insider Filing Delay (transaction date → SEC filing, last 7 days)
How long after the actual trade do insiders file with the SEC:
| Delay | % of filings |
|---|
| Same day | 4% |
| 1 day | 19% |
| 2 days | 44% |
| 3–5 days | 29% |
| > 5 days | 5% |
Insiders are required to file Form 4 within 2 business days of the transaction. In practice, ~67% comply within 2 days, while ~33% file later. This means that even with a perfect real-time feed, there is an inherent information delay between when an insider trades and when the market can observe it.
Coverage
- Universe: 5,300+ U.S.-listed equities with SEC insider filings (NYSE, NASDAQ, AMEX, OTC issuers).
- Insiders: 97,000+ unique filing insiders.
- Filing types: Forms 3 (initial statement of beneficial ownership), 4 (changes in ownership), and 5 (annual summary), plus their amendments (3/A, 4/A, 5/A).
- Transaction filter: Only non-derivative transactions with acquired/disposed codes —
Buy (A) and Sell (D). Derivative transactions (option exercises, conversions) are excluded.
- History: January 2009 to present, with continuous daily updates.
- Volume: ~1,500 transactions/day on average; ~270K/year in recent years.
Annual Volume
| Year | Transactions |
|---|
| 2009 | 134,566 |
| 2010 | 156,020 |
| 2011 | 152,509 |
| 2012 | 165,646 |
| 2013 | 170,764 |
| 2014 | 171,229 |
| 2015 | 171,205 |
| 2016 | 171,877 |
| 2017 | 181,639 |
| 2018 | 197,736 |
| 2019 | 205,018 |
| 2020 | 234,433 |
| 2021 | 294,368 |
| 2022 | 241,628 |
| 2023 | 245,931 |
| 2024 | 274,757 |
| 2025 | 271,592 |
Buy/Sell Split
Across the full dataset: 49% Buy / 51% Sell, roughly balanced.
Querying the Data
Basic Usage
from scalarlib import getInsiderTradesData
# All AAPL insider trades in 2024
df = getInsiderTradesData('AAPL', '2024-01-01', '2024-12-31')
# Multiple tickers
df = getInsiderTradesData(['AAPL', 'MSFT', 'NVDA'], '2024-01-01', '2024-12-31')
# All tickers (universe-wide scan)
df = getInsiderTradesData(None, '2024-06-01', '2024-06-30')
Filtering by Insider
# Filter by insider name (fuzzy, order-independent, case-insensitive)
df = getInsiderTradesData('AAPL', '2020-01-01', '2024-12-31', insider_name='Tim Cook')
# Filter by role (supports abbreviations: CEO, CFO, COO, CTO, director, VP, etc.)
df = getInsiderTradesData(None, '2024-01-01', '2024-12-31', insider_role='CEO')
Parameters
| Parameter | Type | Required | Description |
|---|
tickers | str, list, or None | No | Stock symbol(s). None returns all tickers. |
start | str | Yes | Start date (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS). |
end | str | Yes | End date (same format; date-only is inclusive). |
insider_name | str | No | Filter by insider name. Fuzzy, order-independent, case-insensitive. "Tim Cook" matches "Cook Timothy D". |
insider_role | str | No | Filter by insider role/position. Supports known abbreviations (see below). |
Column Definitions
Insider Trades Schema
| Column | Type | Description |
|---|
ts_recv | datetime | Point-in-time timestamp: when Scalar Field ingested the record (New York time). Use this for backtesting to avoid look-ahead bias. |
filed_at | datetime | SEC filing acceptance timestamp (New York time). When the Form 3/4/5 was officially filed with EDGAR. |
symbol | string | Ticker symbol of the issuer (e.g., AAPL, MSFT). |
transactionAmount | float | Number of shares transacted. |
transactionPrice | float | Price per share at which the transaction was executed (USD). |
transactionType | string | SEC transaction code (S = open-market sale, P = open-market purchase, A = grant/award, M = exercise/conversion, F = tax withholding, etc.). |
side | string | Direction: Buy (acquired) or Sell (disposed). |
transactionDate | date | Calendar date the insider executed the trade. |
name | string | Full name of the insider as reported in the SEC filing. |
typeOfOwner | string | Relationship to issuer (e.g., “Chief Executive Officer”, “Director”, “10% Owner”). |
postTransactionAmount | float | Shares held by the insider after the transaction. |
securityTitle | string | Description of the security (e.g., “Common Stock”). |
issuerName | string | Legal name of the issuing company. |
accessionNo | string | SEC EDGAR accession number — unique filing identifier. Construct the EDGAR URL as https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&accession={accessionNo}. |
Transaction Type Codes
| Code | Meaning | Count |
|---|
| S | Open-market or private sale | 1,070K |
| A | Grant, award, or other acquisition | 724K |
| F | Payment of exercise price or tax liability (withholding) | 547K |
| M | Exercise or conversion of derivative security | 546K |
| P | Open-market or private purchase | 296K |
| J | Other acquisition or disposition | 114K |
| G | Gift | 105K |
| D | Disposition to the issuer | 55K |
| C | Conversion of derivative security | 49K |
Filtering Reference
Insider Role Filter
The insider_role parameter supports these abbreviations and their expansions:
| Abbreviation | Matches |
|---|
CEO | Chief Executive Officer |
CFO | Chief Financial Officer |
COO | Chief Operating Officer |
CTO | Chief Technology Officer |
CIO | Chief Information Officer |
President | President |
Director | Director |
VP / SVP / EVP | Vice President / Senior VP / Executive VP |
Chairman | Chairman, Chair |
General Counsel | General Counsel, GC |
Controller | Controller |
Treasurer | Treasurer |
Secretary | Secretary, Corp Sec |
10% Owner | 10% Owner, Beneficial Owner |
Unrecognized role strings are matched as literal substrings against the typeOfOwner field.
Insider Name Filter
The insider_name parameter performs fuzzy, order-independent, case-insensitive matching. Special characters (apostrophes, hyphens, periods, commas) are stripped before comparison. For example, "Tim Cook" matches "Cook Timothy D", and "O'Brien" matches "Obrien".