Research question
At the end of each month, rank a universe of large-cap US equities by predicted next-month return, go long the top decile and short the bottom, equal-weighted and dollar-neutral. Does that portfolio earn a positive return net of the cost of trading it?
Data and method
Daily prices for 50 large-cap US equities, resampled monthly. Four features computed strictly from information available at or before each formation date: 12-1 momentum with the most recent month skipped, one-month reversal, trailing 252-day realised volatility, and log dollar volume as a liquidity proxy. A ridge regression predicts the cross-section of next-month returns; a linear model is deliberate, since with four features on a monthly panel the binding constraint is signal, not capacity.
Why not cross-validation
Observations in a financial panel are not exchangeable across time — the ordering is the problem. Shuffled k-fold, which is the default reflex in most ML work, would train on months whose labels had not yet been realised. This study uses an expanding window instead: at each formation month, the training set contains only pairs whose outcomes were already known. Features are standardised within each cross-section rather than pooled, so the level of the market in 2008 cannot leak into a rank computed in 2021. And a test in the suite permutes the labels and asserts the pipeline then earns nothing — if a leak existed anywhere, a shuffled target would still score.
What the numbers say
The decile spread earns an annualised Sharpe of 0.324 gross and 0.246 net of a 10bp charge on turnover, with a net t-statistic of 0.813. Simply holding the same 50 names equal-weighted returned a Sharpe of 1.00 over the identical window. The strategy underperforms doing nothing.
Costs are not the main culprit. Turnover averages 0.652 per month, roughly 0.8% a year in charges, moving Sharpe from 0.324 to 0.246. Setting costs to zero entirely raises the t-statistic only to 1.072. The signal was weak before a cent was charged.
Every specification tested
Each invocation appends a row to a committed log, because a t-statistic drawn from the best of several attempts must be read against the number of attempts. Baseline: 0.324 gross, 0.246 net, t = 0.813. Momentum alone: 0.238, 0.154, t = 0.510. Cost sensitivity at 20bp: 0.324, 0.168, t = 0.554. Zero-cost upper bound: 0.324, 0.324, t = 1.072. Quintile rather than decile spread: 0.559, 0.478, t = 1.579.
Harvey, Liu and Zhu (2016) argue a new factor should clear a t-statistic of 3.0 rather than 2.0, precisely because the literature has tested so many candidates. That hurdle was adopted before the result, not after. Nothing here approaches it.
The most tempting number, and why it is noise
The quintile specification looks meaningfully better — net Sharpe 0.478, t = 1.579. Reported alone it would read as a near-miss worth pursuing. Read against six attempts it is noise. It also has a mechanical explanation that has nothing to do with predictive power: with 50 names a decile is five stocks per leg, which is far too concentrated, and widening to ten cuts annualised volatility from 10.0% to 7.3% while annual return moves only from 3.24% to 3.47%. That is diversification, not signal. Publishing the log rather than the best row is the point of the exercise.
What it does not settle
The universe is a list of currently traded tickers, so companies delisted or bankrupted during the sample are absent and the results are optimistic — a clean run needs point-in-time constituents with delisting returns. Costs are a flat 10bp assumption, not a market-impact model. No capacity analysis is attempted. And the sample begins in January 2014 rather than 2005 because the protocol requires every name to have complete features, and at least one constituent listed late; that excludes the 2009 momentum crash, the single most important stress period for this signal.
Why this matters beyond markets
The transferable habit is stating the threshold before seeing the result, and reporting what was actually measured rather than the most flattering row. Financial data makes the discipline visible because the noise is loud and the incentive to self-deceive is obvious — but leakage, multiple testing, and evaluation protocols that quietly match the wrong data structure are hazards in any modeling problem. A negative result documented well is more informative than a positive one that has not been stress-tested.