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.
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.02 | legs | share | |
|---|---|---|---|
| 0 (same day) | 304 | 1.2% | |
| 1 | 650 | 2.6% | |
| 2 | 667 | 2.7% | |
| 3 | 377 | 1.5% | |
| 4 | 437 | 1.7% | |
| 5 | 626 | 2.5% | |
| 6 | 873 | 3.5% | |
| 7 | 795 | 3.2% | |
| 8-10 | 1,232 | 4.9% | |
| 11-14 | 2,166 | 8.7% | |
| 15-21 | 2,708 | 10.8% | |
| 22-30 | 2,885 | 11.5% | |
| 31-45 | 3,926 | 15.7% | |
| 46-60 | 3,083 | 12.3% | |
| 61-90 | 4,043 | 16.2% | |
| 91-120 | 211 | 0.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.02 | P legs | P share | S legs | S share |
|---|---|---|---|---|
| 0 (same day) | 18 | 0.6% | 286 | 1.3% |
| 1 | 62 | 2.2% | 588 | 2.7% |
| 2 | 101 | 3.5% | 566 | 2.6% |
| 3 | 63 | 2.2% | 314 | 1.4% |
| 4 | 71 | 2.5% | 366 | 1.7% |
| 5 | 105 | 3.7% | 521 | 2.4% |
| 6 | 99 | 3.4% | 774 | 3.5% |
| 7 | 114 | 4.0% | 681 | 3.1% |
| 8-10 | 150 | 5.2% | 1,082 | 4.9% |
| 11-14 | 260 | 9.0% | 1,906 | 8.6% |
| 15-21 | 306 | 10.6% | 2,402 | 10.9% |
| 22-30 | 342 | 11.9% | 2,543 | 11.5% |
| 31-45 | 528 | 18.4% | 3,398 | 15.4% |
| 46-60 | 380 | 13.2% | 2,703 | 12.2% |
| 61-90 | 261 | 9.1% | 3,782 | 17.1% |
| 91-120 | 15 | 0.5% | 196 | 0.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.
| date | API | EDGAR index |
|---|---|---|
| 2026-03-23 | 202 | 203 |
| 2026-03-25 | 207 | 208 |
| 2026-03-31 | 348 | 349 |
| 2026-05-08 | 326 | 327 |
| 2026-05-13 | 336 | 337 |
| 2026-05-18 | 292 | 293 |
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
- Plan trades cannot be split out. Form 4 carries a Rule 10b5-1(c) checkbox, but this dataset does not expose it, so scheduled plan trades — which execute on their own calendar regardless of trading windows — are mixed into every row above. The concentration measured here is therefore a property of the whole open-market stream, not of discretionary trades alone.
- Item 2.02 is the disclosure proxy, not “earnings day”. The offset measures against the 2.02 8-K's filed date. Earnings press releases and the 8-K almost always share a date, but a release accepted after 5:30 p.m. Eastern is deemed filed the next business day (Regulation S-T Rule 13), and this dataset carries dates, not timestamps — so an evening release followed by a next-morning trade can measure as day 0 or day 1. Day-level granularity bounds, it cannot split, that edge.
- Trading windows are company policy, not SEC rule — their bounds vary by issuer and are not public. This page measures the aggregate date pattern; it attributes no intent, infers no policy, and is an observed disclosure-and-trading-timing record, not a compliance determination and not a list of violations.
- Legs filed after 2026-10-09 are outside the fetch window by construction; study #1 measured the filing delay distribution (median 1 day), so the missing late tail is small and does not favor any particular offset.
- Multi-filer 8-Ks are attributed to the first filer (documented dataset limitation), and an issuer's CIK is the join key — an issuer that changed CIK mid-window (rare) would not join across the change.
- One quarter is one quarter. Earnings seasons give the offsets a natural rhythm; treat these numbers as a measurement of this window, not a law of nature.
Sources
- SEC Form 8-K — item 2.02, Results of Operations and Financial Condition
- SEC Form 4 — the ownership form whose transaction legs carry the trade dates
- 17 CFR § 232.13 (Regulation S-T Rule 13) — the 5:30 p.m. / next-business-day filing-date rule
- EDGAR daily index — the per-day ground truth the coverage check reads
- Study #1: How late is Form 4 data? · Study #2: When insider filings get corrected · Study #3: Which corporate events get disclosed on Fridays?
- FilingPulse API docs · insider trading API · 8-K event API · query patterns