Taxable investors sell the year's losers in November and December to book the loss against their taxes. The wash-sale rule then keeps them from buying back for 31 days. So the selling should depress losers into year end and reverse in January. The counterparty is any taxable holder for whom the deduction is worth more than the cost of trading.
The obvious confound was named before the run: the year's losers also fall in December simply because they are weak companies. Without a way to separate tax from momentum, any result would be uninterpretable.
How it was tested
Pre-registered on 2026-09-06 over 2014-2022, with 2024-2025 not loaded. Signal: bottom decile of year-to-date return, most negative first. US stocks above $5 with more than $1M of daily dollar volume. Four entry dates, the next open after 15 November, 1 December, 15 December or 31 December, all held to 31 January with an ATR stop and target. Four variants set the bar at alpha t 2.24.
Two controls carried the logic. A mid-June entry, with no tax deadline, tested whether the effect belongs to year end. A mid-December entry ranked by the last 20 days' drop instead of the year's loss was the discriminator, since the deduction depends on the loss since January, not on last month.
Where it died
The seasonality was there. The same losers bought in mid-June lost 7.99% per trade, while the best variant, entering 15 December, gained 2.77% over 239 trades and held up in both halves of the sample. But its alpha t was 1.24, short of 2.24, and t captured in a portfolio was 1.09.
The discriminator decided the rest. Ranking by the recent drop earned 5.97% per trade, about twice the year-to-date ranking. Whatever pays in December is tied to the recent fall, not to the tax loss.
The record
Thesis
Taxable holders sell the year's losers in November and December to realise the deduction; the 31-day wash-sale rule then delays repurchase, so the selling pressure reverses in January. Counterparty: taxable holders of losing positions, for whom the deduction is worth more than the execution cost.
Prior: Declared before the run: the obvious confound is momentum — the year's losers also fall in December because they are bad companies. The design had to separate the two or the result would mean nothing.
Specification
signal
returns_ytd in the bottom decile at the signal date
universe
US stocks, 20d dollar volume > $1M, price > $5
entry
next open after 15-Nov, 1-Dec, 15-Dec or 31-Dec (4 variants)
exit
31 January, 2.0 / 2.5 × ATR stop / target
ranking
most negative returns_ytd first
controls
P1 — same recipe entered mid-June (no tax deadline). P3 — mid-December entry ranked by returns_20d instead of returns_ytd (recent drop vs fiscal loss). P3 is the discriminator: the tax deduction depends on the loss since January, not on last month's drop.
held out
2024-2025 not loaded
Gates
Pre-registrationpass
Was the hypothesis, its parameters and its pass/fail rule written down before any data was looked at?
Market-adjusted alpha (legacy)fail
Does the strategy beat SPY over the same holding windows, assuming beta = 1?
t ≥ 2.24 (Bonferroni, 4 entry dates)
alpha t+1.24alpha / trade %+2.77trades239
Best variant (15-Dec entry). Run on 2026-09-06, two days before Gate 7 moved to Jensen alpha; measured with beta assumed = 1 and not re-derived.
Gate 8 — Capture-preserved alphafail
Does the subset of trades a real portfolio can actually take keep the alpha?
t_cap ≥ 1.65 and ratio ≥ 0.50
t captured+1.09capture ratio+0.94
Measured with the portfolio simulator before its 2026-09-19 slot-leak fix; not re-derived.
Stabilitypass
Is the alpha present in both halves of history?
t > 0 in both halves of the event years
t first half+1.08t second half+0.73
Why it died
The discriminator refuted the mechanism. If the tax deduction drove the effect, ranking by year-to-date loss should beat ranking by the last 20 days' drop. It lost by a factor of two: +2.77% vs +5.97% per trade. What pays in December is reversal of the recent drop, not the accumulated fiscal loss — momentum in a tax costume, exactly the confound declared up front. The best variant also missed the alpha threshold (t 1.24 vs 2.24).
What it taught
The seasonality is real and large — buying the year's losers in mid-June lost 7.99% per trade, in mid-December it gained 2.77% — but it is not the tax mechanism. Without the pre-registered discriminator, a positive, stable mid-December result would have been deployed as "tax-loss selling works". The returns_20d control scored t 2.95; it was a control and was not promoted, since turning a control that scored well into a new hypothesis is HARKing.
Verdict history
2026-09-06Pre-registered: 4 entry dates, threshold 2.24, stability as a gate
2026-09-06Single run — P1 seasonality passes, P3 discriminator fails, alpha below threshold No alpha
2026-09-06Mechanism moved to rejected in the registry