Do insiders trade right after earnings?

Study #4 · transactions 2026-07-01 → 2026-09-30 · every number below regenerates from one script on a free key

Most public companies restrict when insiders may trade: a typical insider-trading policy opens a trading window shortly after results are disclosed and closes it as the next quarter end approaches. The policies themselves are private — but both halves of the timing are public filings. The earnings disclosure is an 8-K declaring item 2.02 (Results of Operations and Financial Condition), and the trades are Form 4 transaction legs carrying their own as-filed dates. This page joins the two on issuer CIK and asks one question: when an insider bought or sold on the open market, how many days had passed since their company's most recent earnings 8-K?

The baseline matters: most 2.02 filers file roughly quarterly (measured below: median 91 days between consecutive 2.02s), so if trade dates were indifferent to the earnings calendar, legs would spread roughly evenly across that gap — any 11-day span would hold about 12% of them. The measured distribution is the story.

Method. Trades: all 39,800 ownership filings with filed_date from 2026-07-01 through 2026-10-09 via GET /v1/insider-trades, fetched one filed-date at a time (a fixed window returns the same population forever). Original Form 4s only: 688 4/A amendments are excluded as re-filings, and 838 Forms 3/5 are excluded by name — their coverage began mid-window (live-forward since 2026-09-23), and Form 3 reports no transactions anyway. Analyzed legs are open-market purchases (code P) and sales (code S) on non-derivative securities with a parseable transaction_date inside the window. Earnings calendar: all 39,048 events from GET /v1/events, 2026-03-01 through 2026-09-30; original 8-Ks declaring item 2.02 (9,254 filings across 3,961 issuers) become each issuer's disclosure dates; 869 8-K/A re-filings excluded. Each leg is measured against the most recent 2.02 on or before its transaction date; a leg with none in the prior 120 days is counted separately, never silently dropped.

29,493
open-market legs analyzed
23.9%
within 10 days of the last earnings 8-K
12.1%
the flat-timing baseline
91d
median gap between 2.02s

Days since the issuer's last earnings 8-K

All 24,983 legs matched to a prior 2.02 within 120 days (84.7% of analyzed legs; the rest are the no-recent-2.02 group below). Shares are of matched legs. Under date-indifferent timing the first eight rows — single days — would each hold roughly 1.1%.

days since 2.02legsshare
0 (same day)3041.2%
16502.6%
26672.7%
33771.5%
44371.7%
56262.5%
68733.5%
77953.2%
8-101,2324.9%
11-142,1668.7%
15-212,70810.8%
22-302,88511.5%
31-453,92615.7%
46-603,08312.3%
61-904,04316.2%
91-1202110.8%

Mean offset 32.6 days. 5,961 legs (23.9%) fall within 10 days of the disclosure, versus the ≈12.1% an 11-day span would hold under flat timing across the median 91-day gap.

Purchases and sales, separately

The same distribution split by transaction code — open-market purchases (P) and sales (S). Shares are of each side's own matched legs.

days since 2.02P legsP shareS legsS share
0 (same day)180.6%2861.3%
1622.2%5882.7%
21013.5%5662.6%
3632.2%3141.4%
4712.5%3661.7%
51053.7%5212.4%
6993.4%7743.5%
71144.0%6813.1%
8-101505.2%1,0824.9%
11-142609.0%1,9068.6%
15-2130610.6%2,40210.9%
22-3034211.9%2,54311.5%
31-4552818.4%3,39815.4%
46-6038013.2%2,70312.2%
61-902619.1%3,78217.1%
91-120150.5%1960.9%

Within 10 days of the disclosure: purchases 783 (27.2%), sales 5,178 (23.4%). 1,934 P legs and 2,576 S legs had no 2.02 in the prior 120 days.

The no-recent-2.02 group

4,510 legs (15.3% of analyzed) had no item-2.02 8-K from their issuer in the 120 days before the trade, across 621 issuers. That group is structural, not noise: issuers that do not file 8-Ks at all (foreign private issuers report on 6-K; some trusts and funds have Section 16 insiders but no 8-K stream) plus companies that disclose results without declaring item 2.02 in the window. They are reported as their own row rather than folded into either distribution.

Population

29,493 analyzed legs come from 12,558 filings across 2,786 issuers (2,182 issuers contribute matched legs). Of 87,127 transaction legs on original Form 4s in the fetch window: 21,531 derivative-table legs, 32,897 legs with codes other than P/S (grants, exercises, withholding, gifts…), 94 with no parseable date, 3,112 dated outside the window, and 0 with no issuer CIK — all counted, none silently dropped. The P/S-non-derivative scope matches the site's ticker-page summaries: it measures open-market activity without double-counting the grant-and-sell or exercise-and-sell event chains.

The 2.02 gap figures grounding the baseline: 5,280 consecutive same-issuer 2.02 pairs in the events window; p25 62d · median 91d · p75 91d. The ~91-day quarterly rhythm is measured here, not assumed.

Is the population complete?

A timing study over an incomplete population is quietly wrong on both axes — a missing Form 4 understates trading, a missing 2.02 8-K inflates every offset measured against the previous quarter's disclosure — so the script cross-checks BOTH fetches, day by day, against SEC EDGAR's own daily master indexes (distinct accessions bucketed by each row's own Date Filed column across every index in the sweep, the same mechanics as studies #1–#3).

Form 4 side (forms 4 and 4/A): 71 of 71 index days match exactly; 30 days had no published index (weekends/holidays) and zero filings in the API — consistent.

8-K side (forms 8-K and 8-K/A): 143 of 149 index days match exactly; 65 days had no published index (weekends/holidays) and zero filings in the API — consistent.

dateAPIEDGAR index
2026-03-23202203
2026-03-25207208
2026-03-31348349
2026-05-08326327
2026-05-13336337
2026-05-18292293

Every mismatched day above was chased to a named accession before publication, per the standard studies #1–#3 set, and none is a coverage hole. Five of the six are date-attribution disagreements inside EDGAR's own records: the daily index's Date Filed column names one day while the filing's own header (FILED AS OF DATE) names an earlier one — verified by re-fetching each header — and the API serves dates exactly as filed, so those filings are in the population under their header dates. The sixth (0000932696-26-000016, an 8-K/A) is a filing the index lists but EDGAR's archive no longer serves — its document folder returns 404, so it can enter no one's dataset. No ingestion gaps were found; nothing needed repair.

Doing this with the API

Everything above is two list endpoints and a local join: GET /v1/insider-trades with a fixed since=/until= window for the legs, and GET /v1/events for the 2.02 calendar — the item= filter serves the earnings stream directly, and webhook subscriptions take the same items filter for real-time use. The insider trading API page and the 8-K API page walk the filters; query patterns covers windows and paging.

Reproduce this

The whole study is one standard-library Python script that runs on the free tier (the default windows are ~700 requests; at the free tier's 10 req/min expect about seventy minutes). The --verify-coverage flag hits EDGAR directly and needs a contact identity in the User-Agent, per SEC fair-access policy — set your own.

# free key, no card: https://filingpulse.io/signup.html
export FILINGPULSE_API_KEY=fp_...
export EDGAR_CONTACT=you@example.com

curl -O https://filingpulse.io/examples/insider_trades_after_earnings_study.py
python insider_trades_after_earnings_study.py \
    --txn-since 2026-07-01 --txn-until 2026-09-30 \
    --filed-through 2026-10-09 --events-since 2026-03-01 \
    --out results.json --verify-coverage

The committed results this page renders from: form4_earnings_timing_2026q3.json. All four date bounds are fixed, so the population never changes under you — that is what makes the study reproducible rather than a screenshot.

Limitations

Sources