ID: S019
Slug: insider-cluster-buys-v1
Type: EVT
Date added: 2026-06-08
Status: open (data scraper required) — promoted from
lab/candidates/insider-cluster-buys-v1.md
Wall: 3 — Messy data that won't license cleanly
Data infra dependency: SEC EDGAR Form 4 scraper — net-new build, but data is free and well-structured. Shares plumbing with S020 (buyback-announcement-drift). Stage 1 cannot run until the scraper lands.
One-line setup
We expect that small-cap names where ≥ N distinct insiders execute open-market purchases (excluding option exercises and grants) within a short window, entered shortly after the filings post and held over a multi-week drift horizon predict positive mean excess return over an equal-weighted small-cap baseline in the US small-cap universe with a liquidity floor over a 20-60 trading-day forward window, because open-market insider purchases are a costly, credible signal — insiders only buy with cash when they think the price is low and they are legally exposed if trading on improper information; clustered buying (multiple insiders, short window) is one of the most durable documented anomalies and is strongest in small caps where capacity stops the funds from competing it away.
Rationale (the "because", expanded)
An open-market purchase is a costly, credible signal: insiders only buy with cash when they think the price is low, and they're legally exposed if they're trading on something improper. Clustered buying — many insiders, short window — is one of the most durable documented anomalies. It's strongest in small caps, which is precisely where capacity stops the funds from competing it away.
The most robust effect on the candidate list, equity-expressible so it sidesteps the options-history blocker entirely — a strong, clean Stage-1 validator. Equity is the clean expression; calls add convexity where liquidity allows.
Data required
- SEC EDGAR Form 4 filings — net-new scraper (free public data, well-structured XBRL). Must distinguish open-market purchases (codes P, A) from option exercises (M) and grants (G/J).
- Tiingo EOD prices + daily $ volume for full US equity universe, 5+ years history
- Universe filter: market-cap floor (small-cap band, calibrate), liquidity floor for tradeability
- Cluster definition parameters (N distinct insiders, time window days, transaction-size floor) — calibrate before freeze
Quick-kill gate (Stage 1)
Will be considered to have passed Stage 1 if:
- Mean per-event 20-day excess return over equal-weighted small-cap baseline ≥ +1.5pp [suggested, to freeze]
- Hit rate ≥ 55% [suggested, to freeze]
- Sample size ≥ 400 cluster events across the look-back window [suggested, to freeze]
- Effect present in both sample halves [suggested, to freeze]
- Welch p<0.05 AND mean>0 [suggested, to freeze]
- Filter-validity check: pure open-market purchases (code P) must outperform mixed-code events (P + M, P + G) — if not, the classifier is wrong or the signal is weaker than claimed [suggested, to freeze]
What I expect to find
Effect probably present and clearer than most candidates on the list because the underlying anomaly has held up across many academic studies (Lakonishok-Lee, Cohen-Malloy-Pomorski, etc). Expected mean excess return 1-3pp, hit rate 55-60%. Probability of clearing the gate is moderate-high (~60%). Most likely failure mode is the classification problem: distinguishing genuine conviction clusters from routine, scheduled buying (10b5-1 plans appear in Form 4 too) is real work and a sloppy filter will dissolve the edge into noise.
Notes
- The EDGAR scraper is shared infrastructure with S020. Build once, use twice — that's the per-setup data cost amortisation argument.
- Look-ahead trap: filing-timestamp is the only valid entry trigger, NOT trade-date. Form 4s file 2 days after the trade, so the trade-date is unavailable at decision time.
- 10b5-1 trading plans complicate the "conviction" interpretation. Many insider buys are scheduled rather than discretionary. Filter must either flag 10b5-1 explicitly (filings sometimes disclose the plan) or accept the noise.
Disclosure boundary
This setup file is internal. Downstream result.md / kill.md
writeups must follow lab/DISCLOSURE_POLICY.md §2. Pre-publish:
python -m pytest tests/test_disclosure.py.