Files
momentum-system/docs/research/supplyside_notes.md
T

19 KiB
Raw Blame History

Supply-Side Mechanics Shelf — Final Distillation Note

System: small-cap ORB momentum bot (gap ≥10%, $2–20, ≥300k day vol, long-only, minutes–hours holds, ~2k logged fires, pre-registered counterfactual harness).

Framing. Twelve conversion levers are dead, and the one supply-side gate already tried — the 90-day any-EDGAR-filing keep-or-zero veto — failed backwards (flagged fires outperformed, n=64). This shelf's 15 sources converge on a single explanation for that backfire, and it is the most useful thing in the entire pile: a registration filing is a lagging marker of price strength, not a leading marker of supply pressure. Firms file and sell because the stock ran (Greenwood §V; Billett/Floros/Garfinkel's sell-into-strength coefficient; WTD's baby-shelf capacity that mechanically grows with the 60-day high). So the naive dilution-trap story was not just noisy — it was sign-inverted by construction, and the ledger's n=64 result is what the mechanism predicts.

The squeeze literature warnings hold up under the primary sources here: nothing in this shelf supports any squeeze-long construction. Fabozzi/Mann, Lamont, Staley, both gamma papers, the meme-frenzy paper, and the SEC GME report collectively add zero computable squeeze-timing signal and several independent reasons the free proxies (SI, short-vol%, FTDs) are equilibrium quantities or noise. Those are all rejected below, explicitly.

What survives is narrow but real: the timing axis inside the EDGAR feed itself (registration vs. pricing), an exit-shape prediction (priced supply dampens continuation, not just price), and two accrual features (forward dilution propensity; halt-reopen discontinuity). None require new paid data. Two are not gates at all, which matters under the hardened random-gate null.


2. Convergent mechanisms

M1 — Registration ≠ sale: supply hits the tape at the pricing/takedown event, not the filing. An S-1/S-3 creates legal capacity; float actually changes at the 424B pricing (or ATM takedown), which is the US analog of Greenwood's pay-date and Hong–Scheinkman–Xiong's lock-up expiration. Six sources land here independently: Greenwood (pay-date, not announcement, carries the negative return), Harris (shelf vs. pricing are mechanically distinct moments with opposite information content), Asness/Fabozzi (lending-supply mechanics fire only at execution), HSX (price drops at the supply event even though the date is public), ATM/JFQA and WTD (program existence is EDGAR-visible; sale dates never are). The failed veto collapsed these two stages into one flag. This is the shelf's load-bearing mechanism.

M2 — Issuance follows strength (the veto-backfire mechanism). Greenwood §V (issuance/insider selling after the float-driven rise, even matched on prior returns), ATM/JFQA (same-quarter abnormal return is the only significant takedown predictor; prior quarter is not), WTD (baby-shelf legal capacity is computed off the trailing 60-day high, so capacity peaks exactly on gap days). Consequence: any filing-recency feature is partially a momentum-strength proxy, which is positive-EV in this system. Every hypothesis below must be checked net of gap%/rvol/quality for this reason.

M3 — ATM supply is invisible at daily granularity and decays with program age. Sale dates are never disclosed (quarterly aggregates only, 8-K usually backward-looking — ATM/JFQA Table 1); only ~1/3 of programs ever complete, and takedown pace decays monotonically with quarters elapsed. Two implications: (a) no EDGAR-derived feature can ever be a same-day supply flag, so expect attenuated signal and design for it; (b) a flat N-day cutoff is the wrong functional form — features should age/decay.

M4 — Priced supply changes the path, not only the level: turnover and volatility compress. HSX's model predicts price, turnover, and volatility all fall together when float is released, with a nonlinear effect that is largest exactly in the thin-float regime this system trades. Asness/Fabozzi adds the lending-side version: a priced secondary relieves borrow specialness, removing short-covering fuel for continuation legs. Both point at the same tradeable consequence: fires shortly after a priced takedown should show weaker continuation (lower MFE, shorter legs) — an exit-config claim, not an entry veto.

M5 — Sign of the post-pricing effect is contested; the separation is not. Greenwood + HSX predict 424B-recent fires are worse (supply pressure at the release event); Harris + Asness/Fabozzi predict they're fine-to-better (overhang resolved, borrow relieved) while shelf-only names carry the drag. All four agree the two buckets should behave differently — which is precisely the shape the hardened random-gate null demands. Register the split; let the harness pick the sign.

M6 — Halt reopen is a regime switch, not a pause. Harris: a halt swaps continuous discriminatory pricing for a single-price call auction; a stop resting through a halt fills at the discontinuous clearing price, not its level. This is a different event class from ordinary recrossing (the refuted trigger-erasure lever fired on continuous-market recrosses, which are normal here). Thin gappers are the maximally halt-prone population.


3. Ranked hypotheses (top 4)

H1 — Filing-stage split of the dilution flag: 424B-recent vs. shelf-only vs. clean

The highest-convergence item on the shelf (M1+M2+M5; proposed independently by 5 of 15 sources). Re-cuts the failed veto along the mechanism's own joint, and predicts which fires get BETTER, not just which to skip.

Statement. The failed 90-day veto averaged two mechanically opposite populations. Split every fire three ways at fire time: shelf-only (S-1 or S-3 accession in trailing 90d, no 424B in trailing 15 trading days), 424B-recent (any 424B accession in trailing 15 trading days), clean (neither). Prediction: the buckets separate. Primary direction (Greenwood pay-date + HSX): 424B-recent underperforms clean by ≥0.05R; shelf-only performs at/above clean (consistent with the observed n=64 outperformance, since shelf-only dominates the flagged population by base rate). Registered alternative (Harris/Asness lending-relief): the drag sits on shelf-only instead. Either outcome is a usable gate; no separation kills it.

Data needed: existing (EDGAR dilution_events: form type + accession date; verify the feed actually preserves 424B subtypes — filter out debt-only/boilerplate 424B3s where identifiable).

Computable features: days_since_last_424B, days_since_last_S1S3, categorical filing_stage ∈ {424b_recent, shelf_only, clean}; secondary graded feature per Greenwood magnitude-scaling: offering size / trailing 20d dollar volume where parseable.

DRAFT PRE-REGISTRATION

  • population: {min_entry_gap_pct: 0.10, min_day_volume: 300000, price_min: 2.0, price_max: 20.0}
  • intervention: keep-or-zero gate on the bucket the split identifies as the drag bucket (primary registration: zero 424b_recent, keep shelf_only and clean); both non-gated buckets reported so the adjudicator sees separation, not exposure-cut
  • bars: {expR_delta_min: 0.05, min_n: 300} — random-gate null applies: gated bucket must be worse than flagged_share × |mean baseline| + 0.05R, AND the kept flagged bucket (shelf_only) must be ≥ baseline (that's the separation claim)
  • fidelity: {atr_frac: 0.25, spread_mult: 3, adverse_ticks: 1}

Expected direction: 424B-recent expR ≤ baseline − 0.05R; shelf-only ≥ baseline; clean = baseline.

Kill criteria: (a) 424B-recent and shelf-only statistically indistinguishable → mechanism dead, do not re-cut a third time; (b) separation exists but vanishes after conditioning on gap%/rvol/quality → M2 confound, it was momentum all along; (c) 424B-recent bucket still < n=300 after 3 months of accrual → park as accrual feature, do not adjudicate thin.

Confound guards: condition on gap%/rvol/quality (M2: filing stage proxies strength); exclude/segment fires already tagged is_dilutive by the LLM classifier so this isolates the EDGAR-timing signal from news content; EDGAR nightly refresh lags one session — use accession dates strictly < fire date.

Coverage-design note (dilution-v1 lesson): a fire whose symbol has no EDGAR coverage at all (no CIK match, feed gap) must be skipped from the test population, not defaulted to "clean/keep" — the prior veto's cousin failure (regime lever) shipped inert because missing data silently read as pass. Log coverage % per bucket in the probe.


H2 — Recent-priced-supply continuation dampener (exit-config variant, not a gate)

M4 (HSX volatility/turnover compression + Asness/Fabozzi covering-fuel removal + WTD ATM-absorbs-the-pop). Structurally immune to the random-gate null because it gates nothing — it's a paired counterfactual on the same fires.

Statement. Fires in names with a 424B priced within the trailing 10 trading days have structurally weaker continuation (lower MFE, faster fade after trigger) regardless of entry EV — fresh float dampens the path. A tighter exit (earlier partial profit-take / tighter trail) beats the standard exit config on this subset only, while the standard config stays default everywhere else.

Data needed: existing (EDGAR 424B dates + 1-min OHLCV for MFE/MAE path replay in the harness).

Computable features: recent_424B_flag (≤10 trading days), per-fire MFE/MAE/realized-range under current vs. tightened exit config; optional interaction with is_60d_high (WTD baby-shelf capacity peaks there — flag it, don't gate it).

DRAFT PRE-REGISTRATION

  • population: {min_entry_gap_pct: 0.10, min_day_volume: 300000, price_min: 2.0, price_max: 20.0}, restricted to recent_424B_flag = 1 fires
  • intervention: exit-config variant (tighter trail + earlier partial) replayed against standard exit on the flagged subset; standard exit unchanged on all other fires
  • bars: {expR_delta_min: 0.05, min_n: 300} on the subset (random-gate null formally applies but is trivially satisfied — no fires are zeroed; the comparison is config-vs-config on identical fires)
  • fidelity: {atr_frac: 0.25, spread_mult: 3, adverse_ticks: 1}

Expected direction: tighter exit wins by ≥0.05R on 424B-recent fires; loses or ties on clean fires (predicted asymmetry is the mechanism check — if the tight exit wins everywhere, that's a generic exit finding, not a supply finding, and it collides with the refuted fast-exit ledger).

Kill criteria: (a) tight exit wins on clean fires too → not supply-specific, discard as trigger-erasure-adjacent; (b) MFE distribution of 424B-recent fires indistinguishable from clean after gap/rvol conditioning → M4 doesn't bite at this horizon; (c) subset accrues < n=300 in 4 months → keep logging, don't test.

Confound guards: 424B pricing clusters with news-heavy days — compare against a news-matched clean control, not raw baseline; reverse causality (firms price after weakness) — check the flagged subset's prior-5d return distribution.

Coverage-design note: same skip-not-keep rule as H1 — no EDGAR coverage → excluded from both arms.


H3 — Post-pump dilution propensity → same-name re-entry derate (accrual-first)

M2 turned from a bug into a feature (Greenwood §V + ATM sell-into-strength). The only hypothesis here that uses the lagging direction of causality correctly.

Statement. Big fires cause filings, not vice versa. Squeeze-tier fires (gap ≥150% & rvol ≥5) should show materially elevated (>2×) incidence of new dilution accessions in T+1..T+10 vs. ordinary-tier fires. Once accrued, the tradeable form is a second-fire rule: a re-fire in the same name within 10 sessions of a squeeze-tier fire, with an intervening dilution accession, is a genuinely distinct population predicted to underperform — the pump happened, the supply response is now filed, and the M2 strength-proxy value of the filing is already spent on fire #1.

Data needed: existing (fire tier features + EDGAR feed).

Computable features: any_dilution_accession_T1_T10 per fire; tier-bucketed incidence table; refire_after_squeeze_with_intervening_filing flag on subsequent fires.

DRAFT PRE-REGISTRATION (accrual phase now; gate registration deferred)

  • population: {min_entry_gap_pct: 0.10, min_day_volume: 300000, price_min: 2.0, price_max: 20.0}
  • intervention (deferred): keep-or-zero on refire_after_squeeze_with_intervening_filing = 1; all first fires untouched
  • bars: {expR_delta_min: 0.05, min_n: 300}, random-gate null applies — the kept re-fires (no intervening filing) must match baseline for separation to count
  • fidelity: {atr_frac: 0.25, spread_mult: 3, adverse_ticks: 1}

Expected direction: incidence >2× after squeeze-tier fires; flagged re-fires expR ≤ baseline − 0.05R; unflagged re-fires ≈ baseline.

Kill criteria: incidence ratio <1.5× after 2 months of accrual → mechanism absent in this universe, drop before ever gating; flagged-refire n hopelessly thin (<50 in 3 months) → park.

Confound guards: must never be applied to the triggering fire (that is exactly the §V mistake the failed veto made); EDGAR nightly lag means T+1 incidence is undercounted by up to one session — measure T+2..T+10 as the robust window.


H4 — Halt-discontinuity forced exit at reopen (accrual-first, tail-risk)

M6 (Harris). Explicitly distinct from the refuted trigger-erasure lever: fires on a regime-switch event (halt→auction), not on continuous-market recrossing.

Statement. A stop resting through a mid-hold halt fills at the reopen's single clearing price, not its level. Forcing exit at/immediately after the reopening print on currently-held names reduces tail losses vs. letting the stop ride the gap. This is a variance/tail claim on the halted subset, not a mean-edge claim.

Data needed: existing (1-min bar timestamp gaps for halt detection + 15s quote snapshots for size-collapse confirmation). Validate the halt flag against a real halt source before trusting (a feed hiccup also makes a bar gap) — the existing bar-gap halt guard's detection can be reused (rung 2: this codebase already detects bar gaps for the entry-side halt guard; extend, don't rebuild).

Computable features: mid_hold_halt_flag (intraday bar-gap >1min on a held name, quote-size collapse corroboration), reopen_gap_pct.

DRAFT PRE-REGISTRATION (accrual phase: log halt incidence + reopen-gap distribution on held fires)

  • population: {min_entry_gap_pct: 0.10, min_day_volume: 300000, price_min: 2.0, price_max: 20.0}, restricted to fires with mid_hold_halt_flag = 1
  • intervention: exit-config variant — forced exit at first reopen print vs. current stop-through-halt behavior, paired replay
  • bars: {expR_delta_min: 0.05, min_n: 300} — honestly unlikely to reach n=300 soon; adjudicate only when it does, report tail metrics (P5 of fire R) alongside expR
  • fidelity: {atr_frac: 0.25, spread_mult: 3, adverse_ticks: 1} — reopen fills should additionally assume the adverse side of the reopen print

Expected direction: forced reopen-exit improves expR and truncates the left tail on halted fires; no effect elsewhere by construction.

Kill criteria: halt incidence on held fires <1/month → not worth harness slots, keep as passive logging; reopen-gap distribution symmetric around zero → discontinuity isn't adverse-biased, no edge in forcing.

Confound guards: halt-up vs. halt-down must be separated (halt-up reopens may favor holding — Harris's gravitational effect); data-gap false positives excluded via quote-snapshot corroboration.


4. Rejected during synthesis

  • Any squeeze-long timing feature (Staley float-scarcity, Barbon–Buraschi gamma, Baig meme-gamma, 0DTE paper) — requires options/borrow data we don't have; SEC GME report found no gamma squeeze even in the canonical case; literature-refuted on base rates.
  • Prior-day short-sale-volume% gate (Harris-derived) — Lamont + Asness/Fabozzi show short-flow/SI is an equilibrium quantity, sign-ambiguous at exactly the extremes; ATS-estimate noise on micro-caps; shape is exposure-shrink with no credible "these fires get better" leg. Fails the hardened bar by design.
  • FTD-based flags — SEC report: non-persistent, conflates long/short fails; predicts negative returns at monthly staleness; nothing to time with.
  • Bi-monthly SI / days-to-cover anything — doubly dead: stale (brief's own warning) and structurally confounded (Lamont's zero-SI-at-max-constraint case).
  • Flat filing-recency re-test with a different window — already failed at 90d; M3 says the functional form is wrong, not the window length. Age-decay is folded into H1's features instead of standing alone.
  • S-1 vs. S-3 issuer-quality split as a standalone (WTD) — plausible but n=64-scale before splitting; folded into H1 as a secondary cut if H1's buckets separate.
  • 60d-high × ATM-capacity entry veto (WTD) — collides head-on with new-high momentum being positive in this system; demoted to a logged interaction flag inside H2.
  • Sub-$5 margin-lending borrow-pool constraint (Asness/Fabozzi) — re-litigates refuted price/float/liquidity gating.
  • Borrow-scarcity spread/liquidity gates (Fabozzi/Mann) — refuted liquidity-floor lever wearing a lending-market hat.
  • Opening-auction imbalance fade (Harris) — already captured by the static open-gap population variable; nothing incremental.
  • Anti-shorting-firm / loan-recall event features (Lamont) — event class not identifiable from any available feed; monthly-year horizon mismatch.
  • A-/B-share float-speculation transfer (Mei et al.) — its generalizable claim is the already-refuted low-float lever; market institutions non-analogous.

5. Data acquisition order

  1. Nothing new for H1/H2/H3 — first job is verifying the existing dilution_events feed preserves 424B form subtypes and accession dates cleanly, plus per-symbol CIK coverage stats (the skip-not-keep prerequisite).
  2. OpenBB/yfinance float shares — second, and only to magnitude-grade H1 (offering $/float per Greenwood scaling); never as a gate input (float gating is refuted). Accept staleness on actively-diluting names.
  3. Do not wire stockgrid short-vol%, FINRA SI, or SEC FTD files — every source that examined them here disqualified them; wiring them invites exactly the re-litigation this ledger exists to prevent.