STUDY · NEGATIVE RESULT · 11 OCT 2026

We looked for the insider-buying edge in 470,754 Form 4 records and, outside 2008–09, did not find it.

How small an effect this could have seen: with the crisis years removed, the 21-day excess return of insider-buying clusters has a 95% interval of [−0.26%, +0.62%]. A published 50 bp-a-month estimate sits inside that interval; an 82 bp estimate sits just outside it. Insider-buying signals are widely assumed to be large. This study was designed to find one.

Published 11 Oct 2026 · Reviewed 17 Oct 2026 · Script: form4/ · Data: SEC Form 4 bulk files, 81 quarters, 2006–2026 Q1 · Originally at Substack · 2 pre-publication corrections, see Corrections

Funding: none. No firm paid for, saw or approved this study. How donttrade is paid →

Published whether or not the result was interesting. The script and data are linked above.

What this sample could and could not rule out: 21-day excess return of insider-buying clusters, 2008–09 removed, against two published estimates

−0.5%0+0.5%+1.0% 95% interval, this study: [−0.26%, +0.62%] 50 bp/month — Jeng, Metrick & Zeckhauser (inside) 82 bp — Cohen, Malloy & Pomorski (just outside) 95% interval, this study: [−0.26%, +0.62%] 50 bp 82 bp −0.5%0+0.5%+1.0% 50 bp/month — Jeng, Metrick& Zeckhauser: inside the interval 82 bp — Cohen, Malloy& Pomorski: just outside it

Open the chart full size (SVG, new tab) ↗

Tradable, as-traded screen, three or more insiders, 2008 and 2009 removed. An effect the size of the larger estimate is about the smallest thing this window could have ruled out, and did. Anything smaller, this sample cannot speak to. Figures from the post below. Download the numbers behind this chart (CSV)

What this is: I build trading tools and then publish the measurement, including when the measurement kills the idea. Methods and negative results, yes; live signals, never. It’s free — subscribing just means the next one finds you.


When several company insiders buy their own stock in the same week, the stock tends to outperform. It is one of the better-documented anomalies in finance, it has a mechanism you can state in a sentence — the people who know most about a business are putting their own money into it — and it has been measured repeatedly over forty years.

So I built the thing that reads those filings: all 81 quarterly SEC bulk files, 2006 through the first quarter of 2026, 470,754 records. Then, before trading it, I measured whether it still works.

The honest answer is messier than “it doesn’t,” and the mess is the finding.

The short version

If you read nothing else:

  • The signal is real in the data, and almost all of it is 2008 and 2009. Those two years supply 94% of the entire excess return of the era I would otherwise have called the one that worked.

  • Take the crisis out and nothing is left. No stretch of years before 2017 shows a reliable gain once 2008–09 is removed.

  • After 2017, in the stocks you could actually have bought, the average cluster trails the market — and not by enough to be sure of even that.

  • In most cuts of this data the typical trade loses money — in both eras before any screen is applied, and on every cut after 2017, including the ones whose averages look impressive. A thin tail of large winners does the lifting.

  • The year-to-year swing is several times larger than the effect anyone claims. Annual averages run from −2.85% to +5.80%, around claimed edges of well under one percentage point.

  • So this is not an edge that decayed. It is a number too noisy to have been an edge in the first place — and a bug in my own code very nearly hid that from me.

Everything below is the evidence, in order, with every figure checkable against a public repository. I have left in the places where the data argues against me, including two that are stronger than my own headline.

What the literature says

In one line, if you don’t need the citations: four independent studies, spanning forty years of data, all found that insider buying beats the market — and every one of their samples ends in 2016 or earlier.

Kang, Kim and Wang (working paper, 2018) define a cluster as multiple insiders buying the same stock on the same or consecutive days, 1986–2016. At 21 trading days: cluster 3.80%, non-cluster 1.95%, a difference of 1.85% at t = 20.10. Those are DGTW characteristic-adjusted returns — benchmarked on size, book-to-market and momentum, not against an index.

Twenty-one trading days is a month. That is a tradable horizon for someone who checks the market once a day.

And unusually for an anomaly, the edge survives being long-only. Cohen, Malloy and Pomorski decompose it: for opportunistic insiders, equal-weighted, the long leg is 1.58% per month (t = 7.03) against a short leg of −0.23% that isn’t significant — my arithmetic makes that 87% of the spread. Their headline figure is more conservative: 82 basis points a month, value-weighted. Ali and Hirshleifer, across all insiders, get long 0.84% (t = 10.08) against short −0.03% (t = −0.64) — about 97% on the long side.

But Ali and Hirshleifer also found the opposite where it is strongest, and it would be dishonest to cite them without it: among opportunistic insiders the short leg is −34 bp/month equal-weighted, −53 value-weighted, both significant at 1% — in their words, “in contrast with most previous work, the effect is substantial and significant even on the short side.” So the long-only story holds across insiders in general and weakens exactly where the signal is sharpest.

Jeng, Metrick and Zeckhauser are cleanest: the purchase portfolio earns more than 50 basis points a month, and “the sale portfolio does not earn abnormal returns.” Insiders sell for a hundred reasons. They buy for one.

Note the sample end dates. 2016. 2007. 2014. 1996.

What I measured

The SEC publishes every Form 4 as structured quarterly bulk files, free, back to 2006. I downloaded all 81 — 2006 Q1 through 2026 Q1. Every download succeeded.

From those I kept open-market purchases only: transaction code P, shares acquired rather than disposed, blank and NONE tickers dropped, price and share count both positive.

One correction to how this was described before. An earlier version of this pipeline claimed to exclude 10b5-1 plan transactions — pre-scheduled trades that carry no information about what an insider thinks today. It never did. The flag lives in the SEC’s SUBMISSION table and my code looked for it in the transactions table, where it does not exist in any of the 81 quarters, and the reader silently drops a column it cannot find. The filter is now applied where the field actually is. It exists only from 2023 Q1, covers 13 of 81 quarters, and removes 3.89% of filing-owner records in those quarters — 6.06% if you count individual transaction rows instead, and those two denominators are not interchangeable. That filter covers only the late era, so the two eras are not filtered alike.

470,754 filing-owner records — not filings. The SEC’s reporting-owner table has one row per owner per filing, so a jointly filed Form 4 contributes more than one. That distinction turns out to matter and I come back to it.

Then the signal. For each ticker in each calendar week of the filing date, I counted distinct SEC reporting-owner IDs and kept weeks with at least two and at least $100,000 of combined notional. Entry is the close of the first trading day after the last filing in that week — you cannot act on a filing before it exists. Hold 21 trading days. Benchmark is SPY over the identical window.

That gives 66,874 cluster weeks, of which 35,888 clear the notional floor and 17,018 resolve to usable price data.

One difference from the papers, stated up front. Kang, Kim and Wang measure from the transaction date. I measure from the filing date, because that is when the information is public and therefore when a reader could act. Post-SOX a Form 4 is due within two business days, so my window starts about two days later than theirs — and their own table shows 2.06% of the 3.80% accrues in the first five days. Starting late forfeits a large share of what they measure. That is most of why my magnitudes are smaller, and it is the honest version of the signal rather than the generous one.

The result

21-day market-adjusted return. The median is printed beside the mean wherever the two diverge enough to change what you would conclude, because that gap is most of this post:

How to read the numbers in this post

Skip this if you already know what a t-statistic is.

  • 21-day market-adjusted return — what the stock did over the next 21 trading days, about a calendar month, minus what SPY, the S&P 500 ETF, did over the exact same days. Positive means it beat the market.

  • mean — the plain average across all the trades in that line. A portfolio earns the mean.

  • median — the middle trade. Half did better, half did worse. A positive mean with a negative median means a few enormous winners are carrying a pile of losers.

  • t — how sure you can be the number is not luck. Below about 2, it is indistinguishable from chance; above it, something is probably there.

  • N — how many trades are in that line.

  • cluster — one week in which two or more separate insiders at the same company filed purchases of its stock, totalling at least $100,000.

  • as-traded price — the price the insider reported paying that day, rather than the retroactively adjusted price your charting software shows. Why that distinction matters is the section after this one.

What the figures below are: all 17,018 clusters, with no screen for whether the stock was one you could realistically have bought.

  • All clusters, ≥2 insiders: N 17,018 · mean +1.07% · median −0.76% · t 2.89

    • 2006–2016: N 7,261 · mean +1.91% · median −0.21% · t 7.03

    • 2017–2026 Q1: N 9,757 · mean +0.44% · median −1.27% · t 0.72

Read the medians before the means. In the unscreened sample the median cluster loses money in both eras, including the one with a t of 7.03 — every positive figure there is a mean dragged up by a thin tail of large winners. That is not true once the liquidity and price screens are applied: in the early tradable universe the median is positive at every insider threshold (+0.06% at ≥2, +0.25% at ≥3, +0.30% at ≥4, +0.93% at ≥5 against a +1.54% mean). A portfolio earns the mean, so means are the right statistic for a trading claim — but a strategy whose median trade is negative is one you abandon long before the tail arrives, so I print both at the cuts the argument turns on.

The screen that was wrong, and what fixing it did

Every “tradable” figure in v1 through v4 came from a filter that did not do what it said.

The screen was price ≥ $5 and 20-day median dollar volume ≥ $1 million. The price came from Yahoo, and Yahoo’s closes are retroactively adjusted for splits. So Netflix’s 2006 insider buys — on $30 million a day of real volume — are recorded at a price of $0.29, because of splits in 2015 and 2025. Tesla’s 2011 cluster is recorded at $1.90. Both fail a $5 screen they cleared by two orders of magnitude at the time.

Setting auto_adjust=False does not fix this; it only turns off the dividend adjustment. I checked: NVIDIA closed at about $1,208.88 on 7 June 2024, three days before a 10-for-1 split. Yahoo returns 120.54 adjusted and 120.89 unadjusted. There is no raw close to ask for.

The fix was already in my own data and I had thrown it away. Form 4 reports TRANS_PRICEPERSHARE — the price the insider reported paying, on the transaction date, with no retroactive adjustment of any kind. My loader computed it, used it for the notional, and dropped it. Two different variables in this pipeline were called px, and the screen ran on the wrong one. (I say “reported paying” rather than “paid” deliberately — see the filing-errors section.)

Re-screened on the as-traded price, Netflix 2006 is $19.99, Tesla 2010 is $17.00 and Tesla 2011 is $28.76. (Tesla 2010 is corrected but still excluded — it has no computable dollar volume, which is its own defect, below.) The dollar-volume half of the screen needed no change: the split adjustment cancels in price × volume, so those figures are as-traded up to a residual dividend-only deflation I have not measured.

The error was not uniform across time, which is why it mattered. Among events that clear the liquidity floor — the only ones the price screen actually decides:

What this is: how often the broken price screen made the wrong call, split by era. The mistake runs one way early and the other way late.

  • 2006–2016: wrongly admitted (px ≥ 5, real price < 5) 120 · wrongly rejected (px < 5, real price ≥ 5) 252

  • 2017–2026: wrongly admitted (px ≥ 5, real price < 5) 243 · wrongly rejected (px < 5, real price ≥ 5) 137

Early on, forward splits deflate old adjusted prices and the screen threw out real companies. Recently, reverse splits inflate the adjusted prices of penny stocks and the screen let them in — ATRA’s November 2023 cluster shows an adjusted $12.03 against a real price of $0.24. The bias flips sign across exactly the two eras the post compares.

Restricting to what you could actually buy

Both screens, so you can see what the correction did. As-traded is the specification I stand behind — the other is here because it produced every number I published before today.

What this is: the result on stocks you could realistically trade — under the corrected price screen on the left, and the broken one that produced every number I published before today on the right.

21-day:

  • ≥3 insiders, 2006–2016: as-traded (primary) +0.89% (t 2.70), median +0.25% · published spec (old) +0.99% (t 2.69), median +0.16%

  • ≥3 insiders, 2017–2026 Q1: as-traded (primary) −0.42% (t −1.33), median −1.16% · published spec (old) −0.58% (t −1.78), median −1.26%

  • ≥2 insiders, 2006–2016: as-traded (primary) +0.66% (t 3.01) · published spec (old) +0.59% (t 2.51)

  • ≥2 insiders, 2017–2026 Q1: as-traded (primary) −0.20% (t −0.86) · published spec (old) −0.30% (t −1.29)

  • ≥4 insiders, 2006–2016 / 2017–2026: as-traded (primary) +0.90% (t 2.13) / −0.29% (t −0.69)

  • ≥5 insiders, 2006–2016 / 2017–2026: as-traded (primary) +1.54% (t 3.21) / −0.64% (t −1.18)

The two screens agree about 2,649 of the post-2017 events. On that common core the figure is −0.476% (t −1.48) — between the two, which is what you would hope for and not a result in its own right.

Full sample post-2017: +0.44%. Tradable post-2017: −0.20%. The effect did not die everywhere — but the remainder is no longer significant either. Measured on the complement rather than asserted: non-tradable 2006–2016 +2.77% (t 6.41), non-tradable 2017–2026 +1.16% (t 0.91). It roughly halved and lost significance in the names you cannot practically buy; it went negative in the names you can.

And now the thing I did not expect

I removed 2008 and 2009 to check whether the good era leaned on the crash. Tradable, as-traded screen, with 95% confidence intervals, at both insider thresholds — because the two disagree and the stronger version is the one I was previously not printing:

What this is: the early era with the crisis years taken out, at two levels of strictness for what counts as a cluster. This is where the title comes from.

  • 2006–2016: ≥2 insiders +0.66% (t 3.01), N 2,958 · ≥3 insiders +0.89% (t 2.70), N 1,524

    • excluding 2008–09: ≥2 insiders +0.18% (t 0.80), median −0.14%, [−0.26, +0.62] · ≥3 insiders +0.06% (t 0.18), median −0.16%, N 1,178

    • excluding 2008–09–10: ≥2 insiders +0.15% (t 0.62) · ≥3 insiders +0.02% (t 0.05), N 1,073

    • 2010–2016 only: ≥2 insiders +0.15% (t 0.58) · ≥3 insiders +0.14% (t 0.35), N 946

    • 2006–2007 only: ≥2 insiders +0.33% (t 0.73) · ≥3 insiders −0.25% (t −0.38), N 232

None of those windows gets near significance; the largest t is 0.80, and at the tighter threshold the largest |t| is 0.38. Tradable with three or more insiders, 2008 was +3.17% (t 4.04, N 278, median +1.93%) and 2009 +5.80% (median +2.63%); nothing else in twenty-one years comes close. (2009 is 68 events with a 95% interval of [+0.94, +10.67]. It is the noisiest cell in the study and should not carry weight alone — the claim rests on 2008, which is 278 events at t 4.04.)

2008 and 2009 supply 94% of the tradable, three-or-more-insider early era’s entire excess-return sum — 31% of the unscreened early era’s. Strip them and what remains of the tradable early era shows nothing significantly positive on any cut inside it.

That last clause is doing real work and I want to be exact about how much. I enumerated every contiguous run of years in the sample with at least 30 events. Inside the early era, excluding 2008–09, no contiguous window reaches significance at three or more insiders — the largest |t| is 1.85 (2014 alone, N 143, −1.56%). At two or more insiders exactly one does: 2014–2015, −0.82% (t −2.13, N 709), and it is negative.

It does not generalise past the early era. Across the full sample, 32 crisis-free contiguous windows reach nominal significance at three or more insiders and 41 do at two or more. They are overwhelmingly negative — 30 of 32 and 29 of 41 — and the strongest is 2021–2024 at −2.09% (t −4.79). But some are positive, and the honest ones to name are the ones that beat me:

What this is: the calm stretches of years that look better than my own “good era.” I print them because they argue against me.

crisis-free window, ≥2 insiders:

  • 2016–2018: N 1,238 · mean +1.10% · median +0.54% · t +3.41

  • 2016–2019: N 1,679 · mean +0.89% · median +0.32% · t +3.20

  • 2025–2026 Q1: N 821 · mean +2.36% · median −0.25% · t +3.05

  • (my early-era headline, for comparison): N 2,958 · mean +0.66% · median +0.06% · t 3.01

2016–2018 and 2016–2019 — contiguous crisis-free runs straddling my own era break — are both more significant than the early era I am calling the one that worked. I am not going to pretend otherwise, and I am not going to claim it as a finding either: 231 contiguous windows are tested at each threshold, and a handful at t ≈ 3 out of 231 is what noise looks like. The 2025–2026 row has a negative median despite a +2.36% mean. (The counts are not an artefact of either cutoff: every one of the 231 windows clears the 30-event floor — the smallest is 65 events — and using exact per-degree-of-freedom critical values instead of a flat 1.96 changes none of them.)

That is a failure to detect, not a proof of zero. The ex-crisis interval is [−0.26%, +0.62%] over 21 days. Jeng, Metrick and Zeckhauser’s lower bound of 50 bp a month sits inside it; Cohen, Malloy and Pomorski’s 82 bp sits just outside, so an effect of that size is about the smallest thing this window could have ruled out — and did. Anything smaller, this sample cannot speak to.

If you’ve read this far: this is what every post here looks like — the finding, the thing that nearly fooled me, and the figures to check it with. Subscribing is free and there is no paid tier to upsell you to.

Every year, including the ones that disagree with me

Tradable, three or more insiders, as-traded screen. Every year of it, because naming two of them would be a choice:

What this is: every year in the sample, one line each, so you can see the two that matter and the many that disagree with each other.

  • 2006: N 65 · mean +0.01% · t +0.01

  • 2017: N 178 · mean +2.47% · t +2.70

  • 2007: N 167 · mean −0.35% · t −0.42

  • 2018: N 283 · mean −0.08% · t −0.13

  • 2008: N 278 · mean +3.17% · t +4.04

  • 2019: N 241 · mean +0.48% · t +0.63

  • 2009: N 68 · mean +5.80% · t +2.38

  • 2020: N 371 · mean +0.15% · t +0.11

  • 2010: N 105 · mean +0.53% · t +0.51

  • 2021: N 256 · mean −2.85% · t −3.57

  • 2011: N 149 · mean +1.70% · t +1.72

  • 2022: N 367 · mean −1.90% · t −1.96

  • 2012: N 112 · mean −0.41% · t −0.53

  • 2023: N 289 · mean −0.94% · t −1.18

  • 2013: N 69 · mean +2.24% · t +0.87

  • 2024: N 291 · mean −2.79% · t −3.51

  • 2014: N 143 · mean −1.56% · t −1.85

  • 2025: N 338 · mean +1.80% · t +1.80

  • 2015: N 189 · mean −0.55% · t −0.67

  • 2026 Q1: N 101 · mean +1.68% · t +0.99

  • 2016: N 179 · mean +0.24% · t +0.22

(Four of those medians are worth naming. 2017 is +2.47% on the mean and +0.13% on the median — the single best post-2017 year is carried almost entirely by a tail. Of these four, the crisis years are the two where the typical trade moved with the mean: 2008 +1.93% against +3.17%, 2009 +2.63% against +5.80%. And the widest gap in the whole twenty-one years is none of those three — 2013 is +2.24% on the mean against −1.88% on the median, on 69 events, which is the 2017 pattern in sharper form.)

The argument against this post, stated properly

Five of the ten post-2017 periods are negative, so half are not. Split into regimes rather than averaged:

What this is: the late era split into regimes instead of averaged — the strongest version of the case against this post.

  • 2017–2020: N 1,073 · mean +0.55% · median −0.51% · t +1.03

  • 2021–2024: N 1,203 · mean −2.09% · median −2.11% · t −4.79

  • 2025–2026 Q1: N 439 · mean +1.77% · median −0.25% · t +2.05

  • 2017–2026 excluding 2021–24: N 1,512 · mean +0.90% · median −0.38% · t +2.00

All four of those medians are negative, and three of them flip sign against their mean. The two nominally significant positive lines — 2025–2026 at t +2.05 and the pooled row at t +2.00 — both have a typical trade that loses money.

All four of those lines are crisis-free, and three of the four are nominally significant — 2021–2024 at t −4.79, 2025–2026 at t +2.05, and the pooled row at t +2.00. The first points against the other two. That is the first thing to notice about them.

Now put that last line where it belongs, next to the early era with its exceptional years removed, and with the medians this post promises everywhere else:

What this is: the two eras side by side, each with its own exceptional years removed. On averages, the era I call dead is the stronger one.

  • the era I say worked, crisis removed: N 1,178 · mean +0.06% · t 0.18 · median −0.16%

  • the era I say died, four bad years removed: N 1,512 · mean +0.90% · t 2.00 · median −0.38%

On means, the era I am calling dead is the stronger of the two. An earlier draft of this post printed the +0.90% on its own, called it the strongest argument against itself, and never set it beside the +0.06%. That omission was the worst thing in that draft.

On medians the comparison does not merely fail to favour me — it reverses against the whole exercise. The typical trade in the “recovered” late era loses more than twice what the typical trade in the “working” early era loses. Neither pool has a positive median. Whatever these two numbers are evidence of, it is not that either period contained something you could have traded.

The obvious rebuttal to the +0.90% is that nothing tells you in advance which regime you are in, so deleting 2021–24 is not something a trader could have done. That rebuttal is true, and it is weaker than it looks, because the two exclusions are not the same kind of thing. 2008–09 is a named macro event whose dates were fixed by history before anyone looked at this data. 2021–24 is four consecutive years selected because of their returns — the boundaries are the data. So I do not get to claim perfect symmetry, and an earlier draft of this post claimed it anyway.

What I do get to say is narrower and, I think, more damaging to both numbers: this sample contains one two-year episode that supplies the entire positive mean and four years that supply the entire negative one, and the standard deviation of its annual mean is 2.05 percentage points. Remove either and the residue has a negative median. That is a description of variance, not of an effect.

What this actually tells you is the point. The annual means run from −2.85% to +5.80% with a standard deviation of 2.05 percentage points, around effects being claimed at well under one point. The year-to-year noise is several times larger than the signal. Any era mean here is an average over sub-periods that disagree violently, and that is a better reason not to trade this than any single negative number.

Did I choose the split that suited me?

A fair question, since 2016/2017 is where the literature’s samples end and it is also where my story breaks. So I ran every single-year cut point. All twenty, not the flattering ones — and with a third figure on every line that is the reason the first two are less impressive than they look.

What this is: every year the sample could have been split at, not just the one I chose. The third figure on each line removes the crisis from that line’s before-window.

  • 2007: before +0.01% (t 0.01) · after +0.05% (t 0.20) · before, excluding 2008–09 +0.01% (t 0.01)

  • 2008: before −0.25% (t −0.38) · after +0.07% (t 0.27) · before, excluding 2008–09 −0.25% (t −0.38)

  • 2009: before +1.62% (t 3.07) · after −0.17% (t −0.64) · before, excluding 2008–09 −0.25% (t −0.38)

  • 2010: before +2.11% (t 3.85) · after −0.28% (t −1.07) · before, excluding 2008–09 −0.25% (t −0.38)

  • 2011: before +1.87% (t 3.80) · after −0.30% (t −1.14) · before, excluding 2008–09 −0.00% (t −0.01)

  • 2012: before +1.84% (t 4.17) · after −0.39% (t −1.42) · before, excluding 2008–09 +0.52% (t 1.05)

  • 2013: before +1.57% (t 3.93) · after −0.39% (t −1.38) · before, excluding 2008–09 +0.34% (t 0.81)

  • 2014: before +1.61% (t 3.93) · after −0.44% (t −1.58) · before, excluding 2008–09 +0.54% (t 1.16)

  • 2015: before +1.22% (t 3.25) · after −0.39% (t −1.34) · before, excluding 2008–09 +0.17% (t 0.41)

  • 2016: before +0.97% (t 2.84) · after −0.38% (t −1.25) · before, excluding 2008–09 +0.03% (t 0.09)

  • 2017 — the one I used: before +0.89% (t 2.70) · after −0.42% (t −1.33) · before, excluding 2008–09 +0.06% (t 0.18)

  • 2018: before +1.05% (t 3.40) · after −0.63% (t −1.87) · before, excluding 2008–09 +0.38% (t 1.16)

  • 2019: before +0.89% (t 3.19) · after −0.69% (t −1.88) · before, excluding 2008–09 +0.30% (t 1.03)

  • 2020: before +0.85% (t 3.23) · after −0.83% (t −2.07) · before, excluding 2008–09 +0.32% (t 1.19)

  • 2021: before +0.75% (t 2.56) · after −1.06% (t −2.67) · before, excluding 2008–09 +0.29% (t 0.94)

  • 2022: before +0.42% (t 1.54) · after −0.72% (t −1.63) · before, excluding 2008–09 −0.03% (t −0.09)

  • 2023: before +0.16% (t 0.59) · after −0.30% (t −0.61) · before, excluding 2008–09 −0.27% (t −0.94)

  • 2024: before +0.07% (t 0.27) · after −0.05% (t −0.08) · before, excluding 2008–09 −0.33% (t −1.22)

  • 2025: before −0.15% (t −0.62) · after +1.77% (t 2.05) · before, excluding 2008–09 −0.54% (t −2.10)

  • 2026: before +0.01% (t 0.04) · after +1.68% (t 0.99) · before, excluding 2008–09 −0.33% (t −1.31)

Every cut from 2009 to 2024 gives positive before and negative after — though at 2023 and 2024 both legs are indistinguishable from zero, so the pattern is really 2009 to 2022.

That third figure is the point. 2008–09 sits inside every one of those before-windows. Remove those two years and not one before-leg is significantly positive at any cut — the largest t is 1.19 — while nine go negative, one of them significantly so (the 2025 cut, −0.54%, t −2.10, N 3,454). The sweep restates the crisis finding rather than independently corroborating it. At the 2025 and 2026 cuts the pattern reverses outright.

My split is not special in either direction. Of the sixteen cuts from 2009 to 2024, mine sits in the middle — eleventh by before-leg mean, twelfth by before-leg t. Cuts from 2018 to 2022 give a stronger negative and cuts from 2023 on give a weaker one, turning positive at 2025.

Does the conclusion depend on how I defined a cluster?

A single Form 4 filed jointly by two reporting owners — a person and their family trust, spouses, a 10%-owner group — satisfies “two distinct reporting-owner IDs” while representing one decision. 21.9% of the 17,018 events I analyse are exactly that, 28.6% of the tradable universe at three or more insiders, and 30.4% of the events behind my headline figure.

Recomputing on two or more separate filings:

What this is: the same result under a stricter definition of cluster — counting separate filings rather than separate named owners.

  • All clusters: ≥2 owners +1.07%, t 2.89, N 17,018 · ≥2 separate filings +1.30%, t 2.82, N 13,289

    • 2006–2016: ≥2 owners +1.91%, t 7.03, N 7,261 · ≥2 separate filings +2.24%, t 7.31, N 5,821

    • 2017–2026: ≥2 owners +0.44%, t 0.72, N 9,757 · ≥2 separate filings +0.57%, t 0.72, N 7,468

  • Tradable 2006–2016: ≥2 owners +0.66%, t 3.01, N 2,958 · ≥2 separate filings +0.71%, t 3.11, N 2,442

  • Tradable 2017–2026: ≥2 owners −0.20%, t −0.86, N 5,171 · ≥2 separate filings −0.30%, t −1.33, N 4,048

Tightening the definition makes the early era slightly stronger and the tradable late era slightly more negative. The contamination is also era-asymmetric, which cuts against me: 19.8% of pre-2017 events are single joint filings against 23.5% after, so the later era is the more contaminated one and correcting for it widens rather than narrows the gap I am claiming.

The 63-day claim, withdrawn

An earlier draft said: “63 trading days, tradable with three or more insiders: … 2017–2026 −0.41% (t = −0.71). Three months tells the same story as one.”That sentence does not survive, and neither does its replacement.

On the corrected screen the 63-day figure for 2017–2026 is +0.93% (t 1.45) — the opposite sign. So I decomposed it:

What this is: why I withdrew a claim about the three-month horizon. Sixty-six observations flip the sign of a 2,715-event result.

63-day, tradable ≥3, 2017–2026:

  • published screen: N 2,810 · mean −0.41% · t −0.71

  • as-traded screen: N 2,715 · mean +0.93% · t +1.45

  • the 2,649 events both screens agree about: N 2,649 · mean +0.13% · t +0.22

  • events the correction removed: N 161 · mean −9.21% · t −3.19

  • events the correction added: N 66 · mean +32.96% · t +2.95

The sign of a 2,715-event result is set by 66 observations, 26 of which fall between 15 February and 15 April 2020 — led by OVV, MTDR and SM, energy names bought at the bottom of the crash and up 350–435% over the next three months. Excluding that window, both screens are significantly negative: published −2.05% (t −3.98), as-traded −1.51% (t −2.94).

The median says the same thing without any decomposition: the as-traded 63-day mean for 2017–2026 is +0.93% while the median is −2.13%.

It is screen-dependent at the other end too — 63-day 2006–2016 is +1.62% (t 2.65) published, +1.33% (t 2.39) as-traded, and +1.12% (t 1.88) on the common core, which is not significant. So I claim nothing at 63 days in either direction. The horizon is too noisy for this sample to speak.

Win rate, 21 days, tradable, three or more insiders: 2006–2016 51.0%, 2017–2026 45.7%, all eras 47.6%.

What I’d want someone to attack

The prices in the filings are sometimes wrong, and I now screen on them. The SEC’s price-per-share field is free text and filers misuse it: Assured Guaranty’s April 2008 filings report $250,000,000 per share, which is the total dollar amount in the wrong box. That propagates into the notional, so 21 events show more than $1 trillion of single-week insider buying and the largest is $6.7 quadrillion. 194 events carry a reported price above $1,000 and 65 above $10,000.

I do not filter them, and the reason is instructive. I tried: an earlier draft excluded everything above $10,000. But those 65 are not fake events — twenty of them clear the liquidity floor and every one is a real issuer, including Assured Guaranty’s April 2008, May 2008 and June 2009 clusters, twelve and thirteen reporting owners each on $14–25 million a day. The error is in the price field, not in the event, and filtering on the field deletes real clusters from the two years this post’s title rests on. So the errors stay in, disclosed, and here is what they cost: 63 events carry a notional above $1bn; one is in the sample behind my headline figure and dropping it moves −0.422% (t −1.326) to −0.431% (t −1.352). Seven are in the early-era sample; dropping all seven moves +0.887% (t 2.70) to +0.878% (t 2.66). A real defect, and immaterial, and I would rather give you the number than the reassurance.

12.4% of events are non-tradable because their liquidity could not be computed, not because they were illiquid. The test is dvol >= $1M and a missing value fails it silently: 2,112 events have no figure — 19.6% of pre-2017 events against 7.1% after. Of those, 1,595 would clear the price screen and they average +2.80% (t 2.98) — so the exclusion is not neutral, and the two eras’ tradable universes are not selected the same way. This affects both price screens identically.

Survivorship, and it is big. 35,888 events qualify and 17,018 resolve — 52.6% dropped. I decomposed it and the answer is less interesting than I feared: roughly 94% of drops are simply no price data at all — the ticker is gone, or was never priced. About 4% are series under 300 observations, about 2% are symbols that are not symbols (the SEC’s ticker field is free text and contains entries like ( EPG ) and (NONE)). That 94% folds in a fourth counter, 300 events from two rate-limited batches; “no price data at all” on its own is 93.0%. My drop ledger overstates its absolute drop count by 2,211 events — about 12% — because two rate-limited batches were counted and then refetched; pushing the entire excess into the largest category still leaves it at 93.8%, so the shape holds either way.

One thing I worried about that turned out to be nothing. The pipeline drops events within 21 trading days of the end of a price series, which would systematically exclude the final, worst weeks of a stock going to zero. It drops exactly zero events — those have already failed for having no price data.

Survivorship is era-dependent and it cuts against the decay story. An event from 2006 has had twenty years for its ticker to disappear; one from 2024 has had two. So the measured fall from +1.91% to +0.44% overstates the true decline.

That makes three ways the late era is measured differently from the early one — survivorship, the 10b5-1 filter covering only late quarters, and the worse joint-filing contamination after 2017 — and all three push toward the result I am reporting.

Benchmark. SPY only, and the two corrections pull opposite ways. From 3 January 2017 to 31 March 2026, IWM returned +105.5% against SPY’s +234.4% — small caps underperformed by 5.85 percentage points a year, beating large caps in only 2 of 9 years. Insider-buy names skew small, so a size adjustment would make the post-2017 number less bad. But market-adjusting assumes beta of 1, and for high-beta names a beta adjustment makes it worse. The net sign is not something I can claim.

What the code does and does not do.an.py prints both price screens at insider thresholds n ∈ {2, 3, 4, 5}, horizons {21, 63 days} and tradable thresholds n ∈ {3, 4}, and for every cut it covers it prints a median column, the full twenty-one-row year table, the win rates and the dollar-volume quartiles. (One line above is not in it: the tradable n ≥ 5 cells, since the script sweeps tradable thresholds {3, 4} only.)(The year table it prints carries no median column; the medians named under it were computed separately.)What is not in the script is the cut-point sweep, the regime pools, the contiguous-window enumeration, the crisis windows beyond ex 2008-09, the common-core decomposition, the non-tradable complement and the notional sensitivity. Those are computed on top of f4/events_px.csv.gz — which is gitignored and not in the repository, because it is built from 923MB of SEC archives. Rebuilding it is four commands and about half an hour, most of it waiting on Yahoo. I would rather say that than imply a one-click reproduction that does not exist.

What I did not sweep is the cluster definition itself — the calendar week, the $100,000 floor, the close-to-close entry are each a single choice fixed before the result was known. Sweeping those is how you manufacture a positive finding from a dead effect.

No transaction costs anywhere above. Adding them moves every post-2017 number further down.

What this means if you trade

Nothing here is a recommendation and none of it is tailored to anyone’s situation. But four things came out of this that I would want to know if I were reading somebody else’s work:

1. Read the median before the mean. In this study the flattering averages and the losing middle trades sit right next to each other — the median loses in both eras before any screen, and on every cut after 2017. A strategy whose typical trade loses money is one you abandon long before the tail that justifies it ever arrives — and that tail is the only reason the average looks good.

2. One extraordinary stretch can be the entire result. Two years supply 94% of the tradable early era’s excess return. A backtest that reports a single figure for a decade cannot show you that, and you will size positions as though the edge were steady when it was one episode.

3. Check what your price history is actually telling you. My screen threw out Netflix’s 2006 insider buys — on $30 million a day of real volume — because splits in 2015 and 2025 make its historical price read as $0.29. The prices on your chart are not the prices anyone traded at, and a filter built on them is filtering on a fiction.

4. A free, public, machine-readable signal is the one most likely to be gone. Across 97 published predictors, returns fell 58% after publication, and more than half of that is attributed specifically to people trading the published paper rather than to ordinary decay.

What I did not do was trade it first and learn this afterwards.

Why publish a negative

Because the alternative was to trade it.

Everything in the literature here is real. The papers replicate — my own 2006–2016 numbers reproduce their direction and significance. What happened is the ordinary thing that happens to published anomalies: people read them, and SEC filings became machine-readable and instantly distributed. McLean and Pontiff measured returns 58% lower post-publication across 97 predictors. Of that, 26 points is ordinary out-of-sample decay; the remaining 32 points they attribute specifically to publication-informed trading rather than to data mining.

But that is not the whole story. A signal whose tradable version paid in 2008 and 2009 and has swung across an eight-point annual range since, whose median trade loses money in every era, and whose “dead” period beats its “live” period once each has had its exceptional years removed, is not a decayed edge. It is a number too noisy to have been an edge in the first place — and I would not have learned that from a backtest reporting one figure for a decade.

The test cost an afternoon and about forty lines of pandas. Finding the bug in my own price screen cost rather more.

Code and data pipeline: https://github.com/donttrade/disposition-effect — see form4/. The SEC bulk files are free and the whole thing re-runs end to end.

Methods and negative results, yes. Live signals, never.

This is independent research published for informational and educational purposes. It is not investment advice, it is not tailored to anyone’s circumstances, and it recommends no security or strategy.

Who pays, and what the money does not buy →

Update, 16 Oct 2026: the portfolio-context study described in the next paragraph is now published: read it. The original text is kept; the edits made on this site are listed under Versions.

If you just want more of this, subscribe — it is free. I publish the method and the result whether or not it worked, which means a good share of what lands here will be negative. Next: the pre-registered one in the same repository that did replicate — whether the rest of a trader’s portfolio decides which position they sell, on free CC0 data, with placebos that collapse to nothing.


What I know is wrong with this, and the state of the repository

At publication the repository held three studies. form4/ is this one. The other two are named so that a reader who opens the repository is not surprised by them: pdde/ is a pre-registered replication of An, Engelberg, Henriksson, Wang and Williams’ Portfolio-Driven Disposition Effect on free CC0 data, which replicates — a ratio of 2.041 on the pre-specified specification and 3.013 under trader-day fixed effects, with placebos collapsing to about 1.05. volmom/ is a pre-registered test of volatility-scaled cross-sectional momentum, which fails: the effect is real at factor scale and dead under the constraints of a small retail account. Neither has anything to do with the insider-cluster result here. Each carries its own README and its own caveats.

Update, 17 Oct 2026: the portfolio-driven study’s headline did not survive a stricter, pre-registered test that compares each trader with themselves at the same holding day; see its correction. The paragraph above is kept as published.

Still outstanding: a sweep script is not published.form4/ contains an.py, build.py, clusters.py, merge_px.py and rets.py; none of them computes the cut-point sweep, the regime pools or the contiguous-window enumeration. The disclosure above stands as written.

Known and unfixed, disclosed rather than hidden:

  • events.csv.gz contains 6 events with a non-positive price, 5 with negative dollar volume and 50 with a price above $1 million — yfinance artefacts, all excluded by the liquidity floor, none fixed.

  • The true error rate in the SEC’s price-per-share field is NOT MEASURED.

  • No external check that the as-traded price matches the market price. Four cases agree: NFLX 2006 ($19.99), TSLA 2010 ($17.00), TSLA 2011 ($28.76) and NVR ($4,105.97 against a $3,953.09 close).

  • The residual dividend-only deflation of dollar volume: NOT MEASURED.

On verification. The published-specification figures were recomputed by three independent passes, one adversarial, and reproduce to the digit in all 16 cells checked — but on the capped specification this version abandoned. Removing the cap moved twelve of the sixty-three year-table cells and left the sixty cut-point cells unchanged at two decimals; that is a measured result, not an inheritance. The figures this post adds on top — the sweep, the ex-crisis column, the regime pools, the contiguous-window enumeration, the medians, the intervals, the win rates and the complement — have each been computed and independently re-measured twice. The contiguous-window enumeration in particular was produced once, re-run independently before being printed, and re-derived a third time; all three agree in every clause, including that there are none inside the early era at three or more insiders and exactly one at two or more.

Versions

DateWhat changed
11 Oct 2026Published, with two corrections disclosed in the text (10b5-1 filter location; 63-day claim withdrawn).
15 Oct 2026Dated update note added: the portfolio-context study promised at the end is not yet published here. On-site edits, no figure changed: a paragraph inviting firms to get in touch was removed (study pages carry no offer); “The short version” is now a section heading; a missing space after “value-weighted.” restored; the repository’s commit count dropped, since it goes stale.
15 Oct 2026Licence notice below the study: the permitted wording is now “measured by donttrade under a fixed-scope agreement”, and the notice no longer lists “verified” among the permitted terms. No figure changed.
16 Oct 2026Update note changed: the portfolio-context study is now published, with a link. A missing space after “three studies.” restored. No figure changed.
17 Oct 2026Update note added after the paragraph describing the repository, which says the portfolio-driven study “replicates”: that study’s headline has since been corrected (see Corrections). No figure in this study changed.

Text and charts: CC BY-NC 4.0. Study code: MIT. The numbers are facts: quote them freely, with a link. A figure may be described as “measured by donttrade under a fixed-scope agreement” only when it comes from a signed engagement; no one may describe it as audited, certified or verified.

Cite this study

donttrade (2026). The insider-buying edge was mostly 2008. Published 11 Oct 2026. https://donttrade.ca/research/insider-buying-edge/

@misc{donttrade2026insider,
  author = {donttrade},
  title  = {The insider-buying edge was mostly 2008},
  year   = {2026},
  url    = {https://donttrade.ca/research/insider-buying-edge/},
  note   = {Code: https://github.com/donttrade/disposition-effect}
}

WHAT NEXT

  1. Get the next study by email

  2. Read another study: 76.1% of 4,659 traders →
  3. Re-run this one (script) →

Work at a prop firm or broker? For firms →