Form 4 Transaction Codes in Practice: What 1.63 Million Rows Reveal
An empirical guide to SEC Form 4 codes shows why grants, exercises and tax withholding dominate the raw data—and why code P represents only 3.00% of the release.
The most common mistake in insider-trading analysis happens before any model is built: treating every reported acquisition as a buy and every disposition as a sale.
SEC Form 4 does not describe one kind of transaction. It combines purchases, sales, compensation awards, option exercises, tax withholding, gifts and less common ownership changes. The transaction code—not the direction flag—explains what happened.
We measured every observed code in the July 29, 2026 InsiderAlpha Form 4 Research Database. The release contains 1,633,946 publishable rows across 1,771 issuers from January 2000 through July 2026.
The central result is unusually clear:
Code
Pappears in only 49,046 rows, or 3.00% of the release. CodesA,MandF—awards, exercises and exercise-price or tax-related dispositions—account for 969,088 rows, or 59.31%.
This is why a raw “acquired shares” filter is not an insider-buying screener.
The five codes that dominate Form 4 data
| Code | Practical meaning | Rows | Share of release | Default research treatment |
|---|---|---|---|---|
S | Open-market or private sale | 499,814 | 30.59% | Sale, but inspect plan and holdings context |
A | Grant, award or other acquisition under Rule 16b-3 | 389,209 | 23.82% | Compensation; not a purchase |
M | Exercise or conversion of a derivative security | 320,719 | 19.63% | Exercise; inspect related rows |
F | Security delivered or withheld for exercise price or tax liability | 259,160 | 15.86% | Mechanical disposition; not an ordinary sale |
P | Open-market or private purchase | 49,046 | 3.00% | Purchase candidate |
These definitions follow the official SEC Form 4 instructions. The wording matters: code P covers an open-market or private purchase, so the code alone does not prove that an order executed anonymously on an exchange.
The five largest codes account for 92.90% of all rows. Most practical classification errors can therefore be prevented by interpreting these five correctly.
The complete observed code distribution
The release contains 18 transaction codes. This is the observed distribution, not a claim that every code permitted by the SEC appears in the data.
| Code | Rows | Share | What it generally represents |
|---|---|---|---|
S | 499,814 | 30.589% | Open-market or private sale |
A | 389,209 | 23.820% | Grant, award or other Rule 16b-3 acquisition |
M | 320,719 | 19.628% | Exercise or conversion of a derivative security |
F | 259,160 | 15.861% | Exercise-price or tax-liability payment with securities |
P | 49,046 | 3.002% | Open-market or private purchase |
G | 48,137 | 2.946% | Bona fide gift |
J | 30,995 | 1.897% | Other transaction requiring explanation |
D | 16,553 | 1.013% | Disposition to the issuer under Rule 16b-3 |
C | 15,196 | 0.930% | Conversion of a derivative security |
X | 1,572 | 0.096% | Exercise of an in-the-money or at-the-money derivative |
L | 1,465 | 0.090% | Small acquisition under Rule 16a-6 |
I | 1,459 | 0.089% | Discretionary employee-benefit-plan transaction |
W | 400 | 0.024% | Acquisition or disposition by will or inheritance rules |
Z | 134 | 0.008% | Deposit into or withdrawal from a voting trust |
O | 30 | 0.002% | Exercise of an out-of-the-money derivative |
U | 26 | 0.002% | Disposition connected with a tender offer, merger or acquisition |
E | 20 | 0.001% | Expiration of a short derivative position |
H | 11 | 0.001% | Expiration or cancellation of a long derivative position with value received |
Codes such as J require the filing explanation. A production classifier should preserve the footnotes and source accession instead of forcing every uncommon code into bullish, bearish or neutral labels.
For a concise reference to each major code, use the Form 4 transaction-code guide.
“Acquired” does not mean “purchased”
Form 4 contains two concepts that are easy to confuse:
- Transaction code
Adescribes a grant, award or other acquisition under Rule 16b-3. - Acquired/disposed flag
Asays only that beneficial ownership increased on that transaction row.
In the canonical records with an explicit direction flag, 391,613 rows were marked acquired. Only 19,078 of those rows used transaction code P. By contrast, 361,166 used one of the non-purchase acquisition codes A, M, G or C.
That means a query such as this is semantically wrong:
SELECT *
FROM transactions
WHERE acquired_disposed = 'A';
It captures grants, exercises, gifts and conversions alongside purchases. A purchase screen must begin with "Type" = 'P', then apply security-table, amendment, price and provenance rules.
One filing can describe an economic sequence
A second failure mode is interpreting every row independently. Among 351,623 SEC-linked accessions in the release, 97,742—or 27.8%—contain more than one distinct transaction code.
The most frequent multi-code combinations were:
| Codes in one filing | Filings | Typical question to investigate |
|---|---|---|
A + F | 23,026 | Was part of an award withheld for taxes? |
M + S | 22,189 | Were exercised securities sold in the same filing? |
F + M | 21,343 | Did withholding accompany an option exercise? |
A + F + M | 6,052 | Does the filing combine compensation and exercise mechanics? |
F + M + S | 2,601 | How much exposure remained after exercise, withholding and sale? |
The combinations do not prove motive. They show why accession-level context matters. An M row followed by an S row is economically different from a standalone P row, even if both contain acquired shares somewhere in the filing.
Do later returns differ by code?
To describe—not trade—the observed paths, we collapsed rows to one ticker–transaction date–code company-day from January 2007 onward. We used the median return where several rows shared that identity and required a mature 180-day outcome.
| Code | Mature company-days | Issuers | Median 30D | Median 90D | Median 180D | Positive at 180D |
|---|---|---|---|---|---|---|
P | 14,485 | 1,206 | +1.92% | +4.83% | +8.07% | 65.2% |
S | 107,338 | 1,403 | +0.82% | +2.99% | +5.58% | 60.7% |
G | 21,099 | 1,026 | +1.12% | +3.08% | +5.47% | 61.5% |
A | 42,083 | 1,160 | +1.00% | +2.69% | +5.31% | 60.6% |
F | 39,664 | 1,086 | +0.76% | +2.47% | +5.22% | 60.1% |
M | 55,504 | 1,021 | +0.79% | +2.67% | +4.93% | 60.0% |
Code P had the strongest raw median and positive-outcome rate in this comparison. That does not prove that code P creates excess returns. The outcomes are absolute security returns, not benchmark-adjusted returns, and the code cohorts differ by issuer, period, role and transaction motivation.
The table supports a narrower conclusion: transaction semantics separate economically different populations before any predictive model is attempted.
A defensible classification policy
For most insider-activity products, the safest default policy is:
- Count
Pas a reported purchase candidate andSas a reported sale candidate. - Keep
A,M,F,G,DandCout of discretionary buy/sell totals by default. - Inspect related rows inside the same accession before interpreting exercises or compensation events.
- Preserve
transaction_table,security_title,ownership_nature,shares_owned_afterand footnotes. - Resolve amendments through canonical identity rather than counting originals and corrections twice.
- Use
accepted_at—not the private transaction date—when simulating what a public user could have known. - Label footnote-derived attributes as detected language, not verified intent.
The companion implementation guide, How to Build an Insider Trading Screener That Does Not Count Grants as Buys, turns those rules into a reproducible DuckDB query.
Methodology and limitations
Counts come from the versioned July 29, 2026 database release. The release combines SEC-linked canonical records with validated historical records. Historical rows without a canonical accession remain distinguishable through provenance fields.
The return comparison starts in 2007, groups by ticker, transaction date and code, and uses only events with available 180-day outcomes. It does not control for market regime, size, sector, liquidity, delisting, filing delay or repeated observations from the same issuer. It is descriptive evidence, not investment advice.
Transaction-code definitions are abbreviated for research use. The official instructions and filing footnotes remain authoritative.
Conclusion
Form 4 is not noisy because the SEC codes are unclear. It becomes noisy when an analysis discards them.
In this release, purchases were rare: code P represented 3.00% of rows, while awards, exercises and tax-related dispositions represented 59.31%. More than one quarter of SEC-linked filings contained multiple codes, often reflecting connected compensation, exercise and sale mechanics.
The practical lesson is simple: classify the transaction before measuring its size, timing or outcome. Researchers can inspect the 64-field schema in the free 10,000-row sample or query targeted records through the InsiderAlpha API.
Inspect before purchasing
Preview 10,000 real rows and all 64 fields
Validate the schema and research workflow before buying the 1,633,946-row release. No email or account is required for the sample.
- Reproduce a published report
- Run the included queries with DuckDB
- CSV, Parquet and DuckDB in the full release
- Three months of API access included
One-time payment · instant download · regular price $199