ID: S018
Slug: tax-loss-rebound-microcap-v1
Type: EVT
Date added: 2026-06-08
Status: open — promoted from lab/candidates/tax-loss-rebound-microcap-v1.md
Wall: 2 — Forced, scheduled flows
One-line setup
We expect that the worst year-to-date performers in a liquid-floor microcap universe, bought in mid-late December and held through end of January predict positive mean excess return over an equal-weighted microcap baseline in the US microcap universe with a liquidity floor that keeps round-trip spread tolerable over the Dec-Jan calendar window, because selling driven by tax deadlines is non- economic — losers get dumped in December for the tax write-off, pushing prices below fair value for reasons unrelated to the business; once the deadline passes the artificial pressure lifts and prices snap back, in microcaps where the names are too small for arbitrageurs to erase the effect.
Rationale (the "because", expanded)
Selling driven by tax deadlines is non-economic: investors dump losers in December to book the write-off, pushing prices below fair value for reasons that have nothing to do with the business. In January the artificial pressure lifts and prices snap back. The effect is dead in large caps but persists in the microcap tail — exactly where the arbitrageurs who'd erase it find the names too small to trade.
Orthogonal to the existing vol/trend book, calendar-mechanical, and cheap to test now — a useful pipeline-keeper while the options-data question gets sorted.
Data required
- Tiingo EOD prices + daily dollar volume for full US equity universe, 10+ years history (5-10 Decembers is the sample frame)
- Universe definition: market-cap band ($50M-$500M typical microcap band; needs calibration) + liquidity floor (avg daily $ volume) — Tiingo EOD covers this
- No options data, no scraping, no fundamentals required
Quick-kill gate (Stage 1)
Will be considered to have passed Stage 1 if:
- Mean per-name excess return over equal-weighted microcap baseline during the Dec-Jan window ≥ +2.0pp [suggested, to freeze]
- Hit rate (worst-YTD names outperforming baseline) ≥ 55% [suggested, to freeze]
- Sample size: ≥ 5 Decembers with ≥ 100 names per December (500-1000 events total) — note this is annual-cadence by design [suggested, to freeze]
- Effect present in at least 4 of the 5 Decembers (no single year carrying the result) [suggested, to freeze]
- Welch p<0.05 AND mean>0 on per-event excess return [suggested, to freeze]
- Friction-survival check: mean excess return after applying a microcap round-trip spread of ~150 bps (each leg) must remain ≥ +1.0pp — this is the honest test [suggested, to freeze]
What I expect to find
Effect probably present at the gross level — the academic literature on the January-microcap effect is durable. But the friction-survival check is the entire ballgame: microcap spreads can easily eat 200-400 bps round-trip, which is likely to halve or eliminate the gross edge. Probability of clearing the friction-adjusted gate is moderate-low (~30-40%). Most likely failure mode is exactly what S006 (gap-fade) demonstrated: positive in-sample mean that disappears once realistic transaction costs are applied.
Notes
- The universe-liquidity floor is the main design choice. Too tight → spreads stay manageable but sample drops; too loose → sample fattens but friction kills the edge. Calibrate Dec-Jan-only and pre-register before the run.
- One-event-per-year cadence; plan for 5+ years.
- An equity expression is cleaner than calls for first-test purposes — call-based convexity adds spread cost in illiquid names that further compresses the edge.
- Look-ahead trap: "worst YTD performer at year-end" must be computed from prices ≤ decision date, not from full-year prices.
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.