Thirteen cross-sectional equity factors, run through a statistical gate on the S&P 100 (2020–2026), then combined into one signal. Every information coefficient is corrected for the autocorrelation that overlapping forward returns inject and carries a bootstrap confidence interval, so a factor is kept only on robust evidence. The result is a market-neutral signal (beta ≈ 0, Sharpe 0.99) that is profitable across the stable bull and bear sub-periods and takes its main drawdown at the 2022–2023 regime transition.
Available materials: GitHub
Research Notebooks: Data Exploration Factor Analysis Signal Validation Alpha Research & Combination
Gross fraction of the book traded at each 31-day rebalance.
SignalSigned IC-weighting (EWM, 126-day half-life) of Sector-Neutral Momentum + Low Volatility
ExecutionRebalanced every 31 days, 10 bps cost, dollar-neutral unit-exposure long/short on S&P 100 constituents, benchmarked against SPY over Dec 2021–Jun 2026
The sample holds one bear regime (about 8 independent 31-day windows), so the bear Sharpe (0.89) is suggestive but not statistically significant. The universe is current S&P 100 membership, so survivorship bias inflates the absolute figures. And factor selection is in-sample; a stricter study would split signal generation over train and test.
The thirteen factors. Momentum: Momentum (12–1), Cross-Sectional Momentum, Sector-Neutral Momentum, Residual Momentum. Mean-reversion: Short-Term Reversal, RSI, Bollinger z-score. Risk: Low Volatility, Rolling Sharpe, Quality proxy. Tail: Rolling CVaR, Rolling Max Drawdown, Rolling Skewness.
No lookahead. The forward return $r_{i,t} = P_{i,t+1}/P_{i,t} - 1$ pays today's positions the move from $t$ to $t{+}1$.
Costs. Turnover $\text{TO}_t = \sum_i |p_{i,t} - p_{i,t-1}|$ is billed at $c = 10$ bps, with the first day charged the full build $\text{TO}_0 = \sum_i |p_{i,0}|$.
Residual beta. Dollar-neutrality ($\sum_i w_i = 0$) does not imply beta-neutrality. Writing each stock's beta as $\beta_i = \bar{\beta} + \tilde{\beta}_i$, the book's beta is $\beta_p = \sum_i w_i \beta_i = \bar{\beta}\sum_i w_i + \sum_i w_i \tilde{\beta}_i = \sum_i w_i \tilde{\beta}_i$: the average term cancels for free, but a residual survives when the long and short baskets carry unequal average beta. So beta sits near zero only for a balanced book, not by construction. The realized beta in the chosen signal displayed above is an outcome of dollar-neutrality, but beta-neutrality would require additional constraints (orthogonality to the estimated beta vector) which complicates the backtesting and execution.
Held weights. The holding period is $H = 31$ trading days, and $\tau(t) = H\lfloor t/H \rfloor$ is the most recent rebalance date. The target vector is scaled to unit gross exposure ($\sum_i |\hat{w}_{i,t}| = 1$) so the portfolio is normalized in terms of total wealth and daily returns stay comparable regardless of the signal's magnitude. Between rebalances the book carries the target weight vector $\hat{w}_{i,\tau(t)}$ rather than a fixed number of shares, so it is re-set to those weights every day. A buy-and-hold book instead fixes share counts at the rebalance and lets the weights drift as prices move. Holding the weights fixed is a small execution simplification; since the vector is set at the rebalance from past data, it adds no lookahead.
Simplified cost. The 10 bps rate is linear in turnover and identical for every name, so it stands in for spread and commissions but ignores market impact (which grows with trade size), borrow fees on the short leg, and per-name liquidity. It is a screening-grade estimate: adequate for ranking candidates on equal footing, and optimistic for a large book.