ID: S025
Slug: net-share-issuance-v1
Failed at: Stage 1 (Quick-screen)
Fail reason: magnitude
Date: 2026-06-13
Verdict
Failed at Stage 1 — the net-issuance anomaly is directionally real and perfectly monotone in our universe (buyers beat issuers every quintile step), but too small to clear the bar: buyer-leg excess +0.14%/mo vs a +0.20% gate, and the long/short spread (+0.31%/mo) is not statistically significant (p=0.21).
The setup we were testing
Long the lowest-net-issuance cohort (net buyers of their own stock) in the liquid US universe, rebalanced monthly, expecting positive excess return over an equal-weighted baseline and a monotone decline in forward return as net issuance rises. The "because": managers issue when shares are dear and buy back when cheap, and the market re-rates this only slowly — a behavioural / limits-to-arbitrage effect, not a flow trick (which is why it was a better bet than the front-run-into-oblivion Russell drift of S017).
How it was tested
- Universe/window. Monthly formation, 2011–2025; price ≥ $5, trailing-60d dollar volume ≥ $2M, ≥12 months listed (the new-listing exclusion S017's robustness check justified).
- Signal.
NSI = log(shares_t / shares_{t-12m})from EDGAREntityCommonStockSharesOutstanding, using only values filed on/before the formation date (src/data/edgar_facts.py, ~94% coverage). Ranked into quintiles. - Split trap (the pre-registered #1 risk). Raw shares jump at a split, which is not issuance. We derived a per-ticker cumulative split factor from the price series (on a split day the split-adjusted and raw daily returns diverge by the split ratio; dividends are far too small to trigger it — validated on AAPL 7:1/4:1, NVDA 4:1/10:1, KO 2:1 with zero dividend false-positives) and divided shares by it before computing NSI. Forward returns use adj_close (split+dividend clean).
- Metric. Lowest-NSI quintile forward return minus equal-weighted baseline; long/short = lowest minus highest NSI quintile; gate on the pre-registered thresholds.
What we found
179 monthly cross-sections, ~1,400 names each. Forward return by NSI quintile (Q0 = biggest buyers … Q4 = biggest issuers):
| Quintile | Avg fwd return/mo |
|---|---|
| Q0 (buyers) | +1.245% |
| Q1 | +1.158% |
| Q2 | +1.110% |
| Q3 | +1.064% |
| Q4 (issuers) | +0.937% |
Perfectly monotone — every step from buyers to issuers loses return. But the tradeable magnitude is thin:
| Metric | Result | Gate |
|---|---|---|
| Buyer leg excess vs EW baseline | +0.142%/mo | ≥ +0.20% ✗ |
| Long/short (low − high NSI) | +0.308%/mo, p=0.214 | mean>0 & p<0.05 ✗ |
| Monotone decreasing | yes | yes ✓ |
| Both halves positive | yes | yes ✓ |
| ≥ 60 months | 179 | ✓ |
3 of 5 gates pass — but the two that fail are the ones that matter for tradeability (size + significance), and the numbers are gross of costs: monthly rebalancing of a cross-section that includes small/mid names would erode most of +0.14%/mo.
Lower-turnover fallback (pre-registered, non-gating). A quarterly-rebalanced variant kept the same shape — monotone, both halves, +0.51%/quarter (~+2%/yr gross) buyer excess — but the long/short spread was still insignificant (p=0.15). Reducing turnover did not rescue it to significance.
Why the gate didn't pass
The factor is genuine but decayed — it's one of the most-published equity anomalies, and post-publication it has compressed to a magnitude that's real in-sample yet too small and too noisy to harvest after realistic small-cap trading costs. The monotonicity confirms the mechanism is there; the insignificant long/short spread says the edge is within the noise.
One thing we learned
A clean, monotone factor is not the same as a tradeable one — the gradient confirmed the textbook, but +0.14%/mo gross with an insignificant spread is exactly the "marginal-after-costs" case the pre-registration said to treat as a fail.
Was there anything close to working?
The monotonicity and both-halves consistency are the strongest "close" signal of any cut so far — the effect is unambiguously present. If revisited, the honest v2 is not a tweak of this one but a fundamentally lower-cost expression (a larger-cap-only, quarterly, low-issuance tilt where the ~2%/yr gross survives costs), pre-registered under a new S-number. Not pursued now: a known, decayed factor that fails the spread-significance test is a weak basis for a live slot.
For the specialist — methodology details (click to expand)
- PIT shares: latest
EntityCommonStockSharesOutstandingfiled ≤ formation date;t-12mpoint uses the latest filed ≤ (t − 365d). Split neutralisation as above (threshold |adj_ret/raw_ret − 1| > 0.10). - |NSI| > 1.0 (>170% / −63% in a year) dropped as data-error / missed-corporate-action guard.
- Forward return = adj_close(next formation)/adj_close(formation) − 1.
- Backtest:
src/lab/net_issuance.py(run() monthly = gated; run(rebalance_months=3) = quarterly exploratory). Monthly excess/LS series inmonthly.parquetbeside this file. - Limitation: the Finnhub-sourced universe carries some survivorship/coverage drift; the ≥12-month-listed filter and the monotone-both-halves consistency mitigate but don't eliminate it.