Alpha Research & Combination¶

Research question. Of thirteen candidate cross-sectional equity factors, which carry statistically robust predictive power for forward returns, and does combining the survivors outperform the best individual factor?

Overview¶

This notebook validates a set of price- and statistics-based factors individually, characterises their interactions, and tests several methods of combining them into a single cross-sectional signal. The emphasis is on statistical inference: correcting for the autocorrelation induced by overlapping forward returns, and attaching confidence intervals to every information-coefficient estimate so that a factor is retained only on robust evidence.

Method¶

  1. Factor construction: compute thirteen factors on the S&P 100 universe.
  2. Per-factor validation: for each factor, estimate the information coefficient (IC) at multiple horizons with Newey–West (HAC) t-statistics and block-bootstrap confidence intervals; examine IC decay, signal diagnostics (autocorrelation, turnover, dispersion, lead–lag), and a backtest at the signal's natural rebalance frequency.
  3. Redundancy analysis: the cross-factor correlation matrix of daily IC series to identify factors carrying overlapping information.
  4. Combination: build equal-weight, IC-weighted, and Lasso combinations on a chosen factor pair, characterise the chosen signal (same battery of tests as before; horizon, regularization, tear sheet), and stress-test it across market conditions and robustness controls.
  5. Conclusion: a decision table summarising which factors survive and which combination, if any, is presented.

0. Setup¶

All imports and plotting configurations.

1. Data and factor construction¶

The universe is the S&P 100 (roughly the 100 largest US large-caps) using daily adjusted closes from 2020 to the present. SPY is loaded as a market proxy for the residual-momentum factor (beta removal) but excluded from the cross-section. All factor outputs share the same column set so they can be stacked and combined. Per-ticker coverage and the data's idiosyncrasies are detailed immediately after the loading cell below.

1.1 Universe & price panel¶

Load adjusted daily closes for the S&P 100 (plus SPY as the residual-momentum market proxy), deduplicate Alphabet's dual listing, and split the cross-section off from SPY.

Universe: 100 tickers (+ SPY)
Period:   2020-01-02 to 2026-06-05
Shape:    1615 days x 100 tickers
Sector map covers 100/100 tickers

1.2 History coverage¶

Surface late listings (IPOs/spin-offs) so we know where the cross-section is thinner. The data idiosyncrasies are discussed immediately below.

Sector composition (100 names):
sector
Information Technology    20
Health Care               15
Financials                15
Industrials               15
Consumer Discretionary     9
Consumer Staples           9
Communication Services     8
Energy                     3
Utilities                  3
Real Estate                2
Materials                  1

2 name(s) listed after 2020-01-02 (partial history):
first_date n_obs pct_history sector
GEV 2024-04-02 04:00:00+00:00 547 34.0 Industrials
PLTR 2020-09-30 04:00:00+00:00 1427 88.0 Information Technology

Data coverage and idiosyncrasies.

  • Universe and period. 100 names drawn from the current S&P 100, over 2020-01-02 to mid-2026 (≈1,615 trading days). Alphabet's dual listing is deduplicated: GOOGL (class A) is kept, GOOG (class C) dropped. Berkshire Hathaway (BRK.B) is included; its class-share symbol follows the Alpaca dot convention.
  • Survivorship / selection bias. Membership is the current S&P 100 applied to the full history. Names that left the index are absent and present members were selected with hindsight, which biases absolute results upward. This study evaluates relative cross-sectional ranking (IC), which is far less sensitive to this than index-level returns, but absolute backtest figures should still be read with the bias in mind.
  • Partial history (late listings). Two names list after the 2020 start: GE Vernova (GEV), spun off from GE in April 2024 (~34% coverage), and Palantir (PLTR), a September 2020 direct listing (~88%). A name is NaN before it lists, so the cross-section grows from 98 names in early 2020 to 100 from 2024 onward. The IC computation ranks whichever names are live on each date (min_periods guard), so this is handled correctly; early-period ICs rest on a marginally smaller cross-section.
  • Dual-class deduplication. GOOG and GOOGL are one company (Alphabet) in two share classes and track almost identically; keeping both would double-count Alphabet in the IC and double-weight it in the portfolio, so only GOOGL is retained.
  • Sector mapping for sector-neutral momentum. Every name carries a GICS sector tag (100/100 mapped above), which SectorNeutralMomentum uses to demean each stock's momentum against its sector peers. One sector, Materials, contains only a single name in this universe (LIN, Linde), and a single-name sector has no peers to neutralise against, so the factor masks it to NaN rather than emit an uninformative demeaned-zero. That one stock therefore drops out of the sector-neutral cross-section (99 live names there) while every other factor keeps the full 100.
  • No internal gaps; adjusted prices. Aside from the late listings there are no missing trading days within any name's history, and all prices are split/dividend-adjusted so returns are clean modulo corporate actions.

1.3 The thirteen candidate factors¶

Construct all thirteen factors with default parameters on a shared column set, and sanity-check each one's first-valid date and coverage. Each is built in its standard orientation (default windows in parentheses).

Citations are tagged signal when the cited authors tested the construct as a cross-sectional return predictor, and measure when it originates as a risk measure or technical indicator that we repurpose as a signal here; see the note below the list.

Momentum / trend (5)

  • Momentum (252d, skip 21): trailing ~12-month total return, skipping the most recent month to avoid short-term reversal; classic momentum (signal: Jegadeesh & Titman, 1993).
  • XSMomentum (252d, skip 21): the same trailing return demeaned across the cross-section; rank-equivalent to Momentum on this universe (signal: Jegadeesh & Titman, 1993).
  • SectorNeutralMom (252d, skip 21): momentum demeaned within each GICS sector, stripping out sector bets (signal: Moskowitz & Grinblatt, 1999).
  • ResidualMom: momentum of market-beta-residualised returns, i.e. the idiosyncratic component only (signal: Blitz, Huij & Martens, 2011).
  • RollingSharpe (252d): trailing return-to-volatility ratio; risk-adjusted momentum, adapted from the volatility-scaled time-series-momentum idea (measure: Moskowitz, Ooi & Pedersen, 2012).

Mean-reversion / oscillators (3)

  • RSI (14d): Relative Strength Index, an overbought/oversold oscillator (measure: Wilder, 1978).
  • Bollinger (20d): z-score of price within its moving-average band (measure: Bollinger, 2001).
  • STReversal (5d): negative of the recent one-week return; bets that short-term (weekly) losers rebound (signal: Lehmann, 1990).

Risk / tail / quality (5)

  • LowVol (21d): inverse trailing volatility; the low-volatility anomaly (signal: Ang, Hodrick, Xing & Zhang, 2006).
  • RollingCVaR (252d, 5%): expected shortfall of the worst 5% of trailing daily returns; left-tail risk (measure: Artzner et al., 1999).
  • RollingMaxDD (252d): trailing maximum peak-to-trough drawdown (measure: Magdon-Ismail & Atiya, 2004).
  • RollingSkew (252d): skewness of the trailing return distribution (signal: Boyer, Mitton & Vorkink, 2010).
  • Quality (252d): price-based proxy for fundamental quality (signal: Asness, Frazzini & Pedersen, 2019).

On the citations. A signal tag means the cited authors tested that construct as a cross-sectional return predictor. A measure tag means the construct originates as a risk measure (CVaR, max-drawdown) or a technical indicator (RSI, Bollinger bands), and the SignalReport / time-series momentum citation describes its risk-adjustment lineage rather than a stock-selection test. The measure group (RSI, Bollinger, RollingCVaR, RollingMaxDD, and RollingSharpe) has little or no canonical precedent as a standalone cross-sectional alpha: rolling CVaR and max-drawdown signals are effectively our own constructions (downside risk is priced more broadly, e.g. Ang, Chen & Xing, 2006, but not as this specific signal). That makes those factors exploratory by design.

first_valid n_values cols
Momentum 2020-12-31 135044 100
XSMomentum 2020-12-31 135044 100
RSI 2020-01-23 158844 100
Bollinger 2020-01-30 158344 100
STReversal 2020-01-09 159744 100
LowVol 2020-02-03 158144 100
ResidualMom 2021-04-01 128844 100
SectorNeutralMom 2020-12-31 133681 100
Quality 2020-12-31 135044 100
RollingSharpe 2020-12-31 135044 100
RollingCVaR 2020-12-31 135044 100
RollingMaxDD 2020-12-31 135044 100
RollingSkew 2020-12-31 135044 100

Observations.

  • All thirteen factors build cleanly on the shared 100-name column set, so the signals stack and combine without column misalignment.
  • The first-valid dates expose each factor's lookback. The momentum/risk family (Momentum, XSMomentum, SectorNeutralMom, Quality, RollingSharpe, RollingCVaR, RollingMaxDD, RollingSkew) all start 2020-12-31 on a common 252-day estimation window, while the shorter-window technicals (STReversal, RSI, Bollinger, LowVol) come online within the first month.
  • ResidualMomentum starts latest (2021-04-01): it stacks a rolling market-beta regression on top of a momentum lookback, and so has the fewest observations. Its late start is why ResidualMom is dropped from the all-factor control in §4.6.1: keeping it would push the common evaluation window past the 2022 bear market.

2. Per-factor validation¶

Each factor is evaluated with SignalReport: IC at multiple horizons with Newey–West t-statistics and block-bootstrap confidence intervals, IC decay, signal diagnostics (autocorrelation, turnover, dispersion, lead–lag), and a backtest at the natural rebalance frequency. Only factors with statistically robust IC proceed to the combination step.

2.1 IC triage across horizons¶

A fast initial screen: mean IC and Newey–West t-statistics at 1/5/21-day horizons. Factors clearing $|t_{NW}| \geq 2$ at some horizon are flagged as survivors.

Why $|t_{NW}| \geq 2$. The statistic is the t-stat on the mean daily IC; it tests whether a factor's average rank-correlation with forward returns is reliably different from zero.

  • Newey–West (HAC) standard errors. Overlapping forward returns at horizons > 1 day make adjacent IC observations serially correlated, which deflates the naive standard error and inflates the t-stat. The NW correction widens the error to absorb that autocorrelation, so a 5- or 21-day t is not spuriously large.
  • Absolute value. A robustly negative IC is as tradable as a positive one (flip the sign and short the factor), so the screen tests the strength of the evidence and is agnostic to direction. When the IC is robustly negative, the factor's original economic hypothesis is contradicted, but the signal is still usable once inverted.

$|t| \geq 2$ is the conventional ~5% two-sided significance bar, applied here as a loose gate: it uses point estimates (no bootstrap), is computed in-sample over the full window, and makes no multiple-testing correction across the 13 × 3 = 39 tests (e.g. Bonferroni or Benjamini–Hochberg), which argues for a stricter bar downstream. Clearing it at some horizon is enough, since momentum and risk factors express at different horizons. Passing therefore only earns a factor more comprehensive testing in §2.2, where bootstrap CIs and a backtest apply more statistically robust scrutiny.

Note the structural look-ahead bias this introduces; the highest-IC factors over the full sample proceed into the combination, and this information is not available a priori; the signal validation and testing in this project is only for educational purposes, and we do not claim to discover real-time tradeable alpha; however, this lookahead can be avoided by splitting the sample period into true train/test splits, or doing a complete walk-forward (including hard or soft factor selection) for true OOS results.

7 factor(s) clear |t_NW| >= 2 (triage only): ['SectorNeutralMom', 'ResidualMom', 'XSMomentum', 'Momentum', 'RollingSharpe', 'LowVol', 'RollingCVaR']
ic_1d ic_5d ic_21d t_nw_1d t_nw_5d t_nw_21d max_abs_t
factor
SectorNeutralMom 0.016 0.016 0.014 3.021 1.866 0.955 3.021
ResidualMom 0.019 0.018 0.022 2.915 1.614 1.232 2.915
XSMomentum 0.020 0.020 0.017 2.655 1.547 0.798 2.655
Momentum 0.020 0.020 0.017 2.655 1.547 0.798 2.655
RollingSharpe 0.018 0.018 0.017 2.601 1.547 0.854 2.601
LowVol -0.007 -0.030 -0.056 -1.005 -2.281 -2.359 2.359
RollingCVaR -0.013 -0.033 -0.059 -1.471 -2.095 -2.032 2.095
RollingMaxDD -0.004 -0.023 -0.042 -0.526 -1.704 -1.743 1.743
Quality -0.001 -0.003 -0.011 -0.217 -0.415 -0.796 0.796
STReversal 0.005 0.006 0.002 0.791 0.593 0.183 0.791
RSI -0.003 -0.002 -0.005 -0.533 -0.173 -0.335 0.533
RollingSkew -0.001 0.000 0.008 -0.237 0.003 0.481 0.481
Bollinger -0.002 0.001 0.003 -0.272 0.093 0.252 0.272

Observations.

  • Seven factors clear the $|t_{NW}| \geq 2$ screen: the momentum cluster (SectorNeutralMom, ResidualMom, XSMomentum, Momentum, RollingSharpe) with positive IC, and two risk factors (LowVol, RollingCVaR) with negative IC. The remaining six never reach significance at any horizon.
  • The two families peak at opposite ends of the scanned horizons. Momentum's IC is strongest at 1 day ($t_{NW} \approx$ 2.6–3.0) and fades by 21 days; LowVol and RollingCVaR are insignificant at 1 day but strengthen monotonically to their most negative IC at 21 days ($t_{NW} \approx$ −2.0 to −2.4). The momentum edge is fast, the risk edge slow.
  • Caveat: 21 days is the longest horizon tested here, so the risk factors being "most negative at 21d" may be a boundary artifact of the horizon grid rather than a true peak; their IC could keep strengthening past 21d. §4.3 extends the scan to 63 days to locate where the slow edge actually lives.
  • The negative sign on LowVol/RollingCVaR means high-risk names out-performed over 2020–2026, consistent with a bull-dominated sample. Whether that sign is stable or a regime artifact is what §4.5 tests; here it only earns the factor a place in the battery.
  • Momentum and XSMomentum report identical statistics, confirming they are rank-equivalent (§3 shows IC corr $\approx$ 1).

2.2 Full validation on survivors¶

Run the complete SignalReport on each survivor: IC at multiple horizons with bootstrap CIs, IC decay, diagnostics, and a backtest at the natural rebalance frequency.

How the natural rebalance frequency is chosen. A factor's IC is reliable at some horizons and noise at others, so each one is traded at the horizon where its evidence is strongest, which need not be where its raw IC is largest. Among the tested horizons (1, 5, 10, 21 days), we pick the one with the highest Newey–West $|t|$-statistic on the mean IC. Using the HAC t-stat (rather than the IC point estimate) prevents the pick from drifting to long horizons, where overlapping forward returns inflate the IC on an ever-shrinking independent sample. The $|\cdot|$ keeps it valid for robustly-negative factors, which are simply traded inverted.

running SectorNeutralMom ...
running ResidualMom ...
running XSMomentum ...
running Momentum ...
running RollingSharpe ...
running LowVol ...
running RollingCVaR ...
done
IC@1d (95% CI) IC@21d (95% CI) nat_freq Sharpe(1d) Sharpe(nat)
factor
SectorNeutralMom +0.016 [+0.006, +0.026] +0.014 [-0.015, +0.044] 1 0.52 0.52
ResidualMom +0.019 [+0.007, +0.032] +0.022 [-0.012, +0.059] 1 0.35 0.35
XSMomentum +0.020 [+0.005, +0.035] +0.017 [-0.026, +0.060] 1 0.17 0.17
Momentum +0.020 [+0.005, +0.035] +0.017 [-0.026, +0.060] 1 0.54 0.54
RollingSharpe +0.018 [+0.004, +0.032] +0.017 [-0.023, +0.057] 1 0.16 0.16
LowVol -0.007 [-0.022, +0.007] -0.056 [-0.105, -0.010] 21 -1.24 -1.11
RollingCVaR -0.013 [-0.030, +0.004] -0.059 [-0.113, -0.000] 5 -0.97 -0.96

Observations.

  • The bootstrap CIs split the survivors into two reliability tiers. At 1 day, all five momentum factors have CIs that exclude zero (e.g. Momentum +0.020 [+0.005, +0.035]); neither risk factor does (LowVol −0.007 [−0.022, +0.007], RollingCVaR −0.013 [−0.030, +0.004]). At 21 days the picture inverts: both risk factors' CIs now exclude zero (LowVol −0.056 [−0.105, −0.010], RollingCVaR −0.059 [−0.113, −0.000]) while the momentum factors' 21d CIs straddle it (Momentum +0.017 [−0.026, +0.060]). Each family is reliable only at its own horizon, confirming the fast/slow split from triage.
  • natural_freq refines the split. The max-|t_NW| picker lands every momentum factor at 1 day and pushes the risk factors out, but not to the same horizon: LowVol → 21d, RollingCVaR → 5d. RollingCVaR's IC is most negative at 21d, yet it is picked at 5d, because the rule maximises the Newey–West reliability, and the 21d estimate carries the heaviest return overlap, so its HAC standard error inflates enough to drop its |t_NW| below the 5d value. LowVol's 21d signal is strong enough to survive that penalty and stay its most reliable horizon.
  • IC rank ≠ Sharpe rank. Among the momentum factors, Momentum and SectorNeutralMom post Sharpe ≈ 0.52–0.54 while XSMomentum and RollingSharpe (same-signed, similar IC) manage only ≈ 0.16–0.17. Identical ordinal IC, very different magnitude-weighted payoff: rank-vs-magnitude (cardinal sizing) gap is flagged for future work.
  • The risk factors are robustly unprofitable as built (LowVol Sharpe −1.24, RollingCVaR −0.97), exactly what a negative IC predicts. That makes them useful only if a sign-aware combiner flips them.

2.3 Example reports: Sector-Neutral Momentum vs LowVol¶

Full text-and-figure reports for the two factors carried into §4: one positive-IC momentum factor (Sector-Neutral Momentum) and one negative-IC risk factor (Low Volatility).

Reading the report. Every SignalReport prints the same blocks; this is what each statistic means and how it is computed.

  • Mean IC: the per-date cross-sectional Spearman rank correlation between the signal and forward returns (as in §2.4), averaged over all dates. The headline measure of predictive power.
  • ICIR: the information ratio of the IC series itself: mean IC $\div$ its own standard deviation across dates. It captures how stable the edge is day-to-day, independent of sample length.
  • t-stat (naive): $ICIR × \sqrt{n}$: tests whether the mean IC differs from zero, treating the n daily ICs as independent draws. At horizons > 1 day they are not (overlapping forward returns), so this number is optimistic.
  • t(NW): the same mean IC divided by a Newey–West (HAC) standard error: a Bartlett-kernel sum over the IC series' own autocovariances out to horizon − 1 lags, which absorbs that overlap autocorrelation. This is the honest significance test; the gap between t-stat and t(NW) is exactly how much the overlap was inflating the naive number.
  • 95% CI (bootstrap): a block bootstrap: resample contiguous blocks of length = horizon (so each block preserves its internal autocorrelation), recompute the mean IC, repeat 5,000× here, and take the 2.5th / 97.5th percentiles. A CI excluding zero is the non-parametric counterpart to a large |t(NW)|.
  • Turnover: $\Sigma \, |\Delta signal| \div \Sigma \,|signal|$ each day, averaged: the fraction of the gross book that changes from one day to the next. Low turnover means daily rebalancing mostly re-trades near-identical positions.
  • Dispersion: the cross-sectional standard deviation of the signal each day, averaged: how far apart the scores are across names. Near-zero dispersion means the signal can rank names but barely separates them in magnitude, so cardinal (magnitude) sizing has little to work with.
  • Lead–lag profile: for each offset k, the mean cross-sectional Spearman correlation between the signal at t and the one-day return at t + k. Positive k (lead) is genuinely predictive; negative k (lag) is reactive, the signal merely echoing past moves (momentum, built from trailing returns, is near-symmetric by construction). Note this uses single-day returns at each offset, unlike the cumulative-horizon returns in the IC table above.
============================================================
  Signal Report: LowVol
============================================================

  Diagnostics
  ────────────────────────────────────────
  Lag-1 autocorrelation:     0.983  âš  quasi-static
  Mean daily turnover:      0.039  âš  very low
  Mean dispersion:          0.008  âš  near zero

  IC by Horizon
  ────────────────────────────────────────────────────────
  Horizon   Mean IC    ICIR   t-stat    t(NW)            95% CI
  ────────────────────────────────────────────────────────
      1d   -0.0074   -0.03    -1.00    -1.00  [-0.022, +0.007]
      5d   -0.0301   -0.10    -4.10    -2.28  [-0.056, -0.004]
     10d   -0.0397   -0.14    -5.55    -2.22  [-0.074, -0.005]
     21d   -0.0563   -0.21    -8.52    -2.36  [-0.105, -0.010]

  Backtest Comparison (cost = 10 bps)
  ────────────────────────────────────────
  Natural rebalance freq:  21d
  Sharpe (daily):          -1.240
  Sharpe (21d rebal):      -1.105

  Lead-Lag Profile
  ────────────────────────────────────────
  Strongest lead (predictive): offset +10  IC = -0.0063
  Strongest lag (reactive):    offset -10  IC = +0.0031

============================================================

============================================================
  Signal Report: SectorNeutralMom
============================================================

  Diagnostics
  ────────────────────────────────────────
  Lag-1 autocorrelation:     0.991  âš  quasi-static
  Mean daily turnover:      0.093
  Mean dispersion:          0.314

  IC by Horizon
  ────────────────────────────────────────────────────────
  Horizon   Mean IC    ICIR   t-stat    t(NW)            95% CI
  ────────────────────────────────────────────────────────
      1d   +0.0160    0.08     3.02     3.02  [+0.006, +0.026]
      5d   +0.0163    0.09     3.26     1.87  [-0.000, +0.033]
     10d   +0.0167    0.10     3.62     1.50  [-0.006, +0.038]
     21d   +0.0143    0.09     3.32     0.95  [-0.015, +0.044]

  Backtest Comparison (cost = 10 bps)
  ────────────────────────────────────────
  Natural rebalance freq:  1d
  Sharpe (daily):          +0.524
  Sharpe (1d rebal):      +0.524

  Lead-Lag Profile
  ────────────────────────────────────────
  Strongest lead (predictive): offset +1  IC = +0.0160
  Strongest lag (reactive):    offset -1  IC = +0.0154

============================================================

No description has been provided for this image
No description has been provided for this image

Observations.

  • This pair is a demonstration of the Newey–West correction. LowVol's naive t-stat balloons monotonically with horizon (−1.00 → −4.10 → −5.55 → −8.52) as overlapping long-horizon returns pile up correlated observations. The HAC t(NW) holds flat at ≈ −2.3 across 5–21d (−2.28, −2.22, −2.36). Sector-Neutral Momentum shows the same issue with a different output: its naive t holds ≈ 3.0–3.6 at every horizon, but t(NW) collapses from 3.02 (1d) to 0.95 (21d). So NW exposes both inflations, and in doing so separates a genuine slow edge that survives the correction (LowVol, ≈ −2.3) from a fast edge whose long-horizon "significance" was primarily an overlap artefact (Sector-Neutral Momentum, → 0.95).
  • The IC-decay curves: LowVol strengthens with horizon, Sector-Neutral Momentum stays flat. LowVol's mean IC deepens monotonically (−0.007 → −0.030 → −0.040 → −0.056); on the decay plot its confidence band straddles zero only at lags 1–2, then sits entirely below zero with the gap widening out toward 21d. Its NW |t| rises to a peak at the longest tested horizon (−2.36 at 21d), so natural_freq lands on 21d, and because the band is still pulling away from zero at the grid's edge, the genuinely reliable horizon may sit beyond it; §4.3 re-scans to 63d to check. That deepening, reliably-signed negative IC is what a sign-aware combiner can flip into a positive contribution. Sector-Neutral Momentum's mean IC instead stays nearly flat at ≈ +0.016 across all horizons, but its band reaches zero by around lag 3–4 and is nearly symmetric about zero by the longer horizons, so its reliability sits mostly at the 1-day horizon (natural_freq = 1).
  • The diagnostic flags, and the autocorrelation decay. Both clear the quasi-static flag on lag-1 autocorrelation (LowVol 0.983, Sector-Neutral Momentum 0.991), but their full autocorrelation functions diverge sharply: Sector-Neutral Momentum's stays above 0.95 through lag 5–6 and is still near 0.9 by lag 20, while LowVol's falls below 0.8 by lag 9 and to ≈ 0.4 by lag 20: a stock's momentum score persists for weeks, its volatility score for only a week or two. (This needn't track turnover, which is a normalized magnitude of daily change rather than a correlation: Sector-Neutral Momentum 0.093 vs LowVol 0.039, with LowVol also tripping the near-zero-dispersion flag at 0.008.) Slow inputs either way, but the daily book still captures the edge through persistence: LowVol's daily and 21-day-natural Sharpes stay close (−1.24 vs −1.11), Sector-Neutral Momentum's is daily by construction (+0.52).
  • Lead–lag: LowVol's forward content is a flat negative plateau, its backward content drifts. Across the predictive (lead) offsets +1 to +10, LowVol's IC sits on a near-uniform plateau around −0.007, a small but stable forward signal: low-volatility names persistently precede modestly lower returns over this bull sample. The reactive (lag) side is different: it climbs almost linearly as the offset moves left, from −0.004 at −1, through roughly zero at −5, to about +0.003 at −10. So its relationship with past returns changes sign across the window while its relationship with future returns holds steady; the forward content is the more consistent of the two, the property you want, even though both are weak. Sector-Neutral Momentum is near-symmetric (lead +1: +0.0160 vs lag −1: +0.0154): built from trailing returns, it anticipates and echoes returns about equally.
  • Dispersion exposes the rank-vs-magnitude gap. LowVol's signal dispersion is just 0.008 (flagged near-zero) versus Sector-Neutral Momentum's 0.314: the low-volatility scores are squeezed into a razor-thin band, so cardinal (magnitude) sizing can barely separate names even where rank-IC still grades them.

2.4 What the IC series looks like through time¶

The numbers above collapse each factor to a single mean IC. It is also worth seeing the daily IC series and its distribution as well.

No description has been provided for this image
No description has been provided for this image

Observations.

  • Daily IC is almost all noise; the 21-day series makes the overlap visible. The h=1 daily IC swings widely around a mean near zero, the noise floor that makes single-day significance hopeless and motivates the averaging in the first place. The h=21 series is visibly smoother, drifting in slow, noisy plateaus rather than spiking: that smoothing is the overlap autocorrelation from §2.3 (consecutive 21-day windows share 20 days).
  • The 63-day mean exposes a small, persistent drift, and it already splits by regime. For Sector-Neutral Momentum the rolling mean sits with a slight positive tilt, mostly above zero across the full sample and more steadily positive after 2023, a faint but durable momentum edge. For LowVol it is noisier and closer to zero, positive through the 2022 bear and into 2023, then leaning negative later in the sample. That sign-by-regime is the first direct sight of §4.5: momentum's edge is broadly positive, low-vol's is concentrated in the bear (and mildly adverse otherwise in this sample).
  • SNM's cumulative IC: a steady fast edge at 1d, a regime-flipping one at 21d. The 1-day cumulative IC climbs like a random walk with a definite upward drift: past an immediate early drop it rises fairly consistently from mid-2021 to 20+ by 2026, with a single conspicuous dip at the start of 2023 (the momentum stumble at the bear→bull turn). The drift rate is simply the positive mean daily IC compounding. The 21-day cumulative IC tells a different story: it accumulates negative through the 2022 bear to a trough near −20 at the 2023 transition, then climbs to just under +20 by the end. So SNM's longer-horizon predictive power changes sign across regimes while its 1-day edge holds throughout, exactly why its reliable, and chosen, horizon is 1 day.
  • LowVol's cumulative IC: small and mixed at 1d, a large negative swing at 21d. The 1-day cumulative IC is noisy and mostly positive through mid-2024, a broad hump that builds from 2022, peaks around 2023 and fades by 2024, before drifting negative afterwards, ending roughly as far below zero as the hump rose above it. The 21-day cumulative IC is smoother but swings far wider: it dips negative early to a trough before 2022, recovers to zero, then from the start of 2023 drifts down almost monotonically (with occasional positive spikes) to about −90 by series end. That dwarfs SNM's swings (≈ +20 at either horizon): because the low-vol edge lives at the long horizon, its 21-day IC is far larger per day and accumulates a much bigger run. The sign is the low-vol effect inverted in a bull-dominated sample: high-vol names outran low-vol over 21-day windows, relentlessly through the 2023+ bull, with only the 2022 bear offering the brief reprieve (the recovery to zero). That very size and persistence is what makes the factor valuable once a sign-aware combiner flips it: a large, reliably-signed negative IC becomes a large positive contribution (§4).

3. Cross-factor IC correlation¶

The K×K correlation of the daily IC series across all 13 factors shows which are right on the same days. This is the notion of redundancy that matters for combination: two factors with highly correlated IC carry the same information and should not both enter at full weight, whereas low (or negative) correlation means genuine diversification. Computed at the 1-day horizon, where the momentum family's edge concentrates. The momentum flavours should cluster tightly (Momentum and XSMomentum are rank-equivalent, so their IC correlation should be $\approx$ 1), while LowVol should sit apart as an independent, risk-based source.

No description has been provided for this image

Observations.

  • The block-diagonal structure that we predicted is confirmed. The momentum/trend factors are mutually correlated at 0.85–0.93 (Momentum–ResidualMom 0.92, –RollingSharpe 0.92); the vol/tail factors cluster nearly as tightly (LowVol–RollingCVaR 0.94, –RollingMaxDD 0.83); and the reversal factors form a third block (RSI–Bollinger 0.89, Bollinger–STReversal 0.78). Quality sits apart, near-zero against everything ($|corr| \leq 0.15$).
  • Momentum and LowVol are essentially independent in IC; so the combination offers diversification. SectorNeutralMom–LowVol is -0.00 (Momentum–LowVol −0.09): the two axes are right on different days, so pairing them in §4 combines genuinely diversifying information rather than re-weighting one source. This is the redundancy notion that matters for combination.
  • Two dilutions complicate the "risk" block. RollingMaxDD correlates +0.30 to +0.42 with the momentum factors: a deep-drawdown stock is also a momentum loser, so it straddles both axes rather than being pure risk. RollingSkew runs anti-momentum (−0.34 to −0.41) and only loosely joins the vol block (~0.46). So the momentum family is far more internally coherent than the risk family, which is a looser group of distinct tail statistics.

4. Combination¶

Three combiners (equal-weight, IC-weighted, rolling Lasso) are built on a two-factor pair, compared against the raw inputs, and the chosen signal is then characterised (horizon, regularization) and split by regime.

  • EqualWeight. Average of the cross-sectionally z-scored signals. No parameters. It assumes every factor is positively oriented, so it cannot flip a negative-IC input.
  • ICWeighted. Weights each factor by its trailing mean IC with the sign preserved, so a negative-IC factor is flipped (shorted). Parameters: shrinkage=0.0 (keep the raw signed weights), lookback=252 (trailing-IC window).
  • Lasso. Rolling L1-penalised regression of forward returns on the z-scored signals; redundant factors' coefficients go to zero. Parameters: alpha=0.001 (small penalty, mid-plateau; see §4.4), lookback=252 (training window).

4.1 Constructing the three combiners¶

Combine a momentum factor (SectorNeutralMom) with a risk factor (LowVol), feeding LowVol raw (it has negative IC): the sign-aware combiners must flip it from trailing data, while equal-weight cannot.

Why LowVol for the risk factor. LowVol is the low-volatility anomaly (Ang, Hodrick, Xing & Zhang, 2006), and it is marginally the stronger risk factor on our IC table: higher peak |t_NW| (2.36 vs 2.10), a 21-day CI that excludes zero more cleanly, and a more negative standalone Sharpe (−1.24 vs −0.97). It is 94% IC-correlated with RollingCVaR (§3), so the two are near-interchangeable in rank.

Parameter choices: shrinkage=0 keeps ICWeighted's signed weights so a negative-IC factor is flipped; alpha=0.001 is small because daily forward returns (~1e-2) are tiny against the z-scored features (~1), so a larger penalty zeros the coefficients. Tested in §4.4.

EqualWeight  non-empty rows:  1594  /  1615
ICWeighted   non-empty rows:  1342  /  1615
Lasso        non-empty rows:  1362  /  1615

Observations.

  • EqualWeight covers the most (1594 rows). It averages z-scored inputs (nanmean), so it produces a value as soon as either factor is live; LowVol starts in Feb 2020 (22-day window), so the combiner inherits that start.
  • Lasso (1362) is gated by SectorNeutralMom. Its 252-day training window needs both factors present, and SNM warms up in Dec 2020.
  • ICWeighted (1342) warms up last, ~Feb 2021, needing a 252-day trailing-IC window on top of the factors' warmup. Its first-valid date would set common_start; §4.2 floors it at 2021-12-31 so the sample splits cleanly into the 2022 bear and 2023–26 bull, discarding ~11 months of early-2021 data outside both regimes.

4.2 Head-to-head: combiners vs raw inputs¶

Evaluate the three combiners against their raw inputs on a common window (set by the longest combiner warmup), with the validation metrics and a PnL comparison.

Common window: 2021-12-31 -> 2026-06-05 (1111 days)
running SectorNeutralMom ...
running LowVol ...
running EqualWeight ...
running ICWeighted ...
running Lasso ...
done
IC@1d ICIR@1d IC@21d nat_freq Sharpe(1d) Sharpe(nat) PnL(1d) PnL(nat)
signal
SectorNeutralMom 0.0203 0.10 0.0269 1 0.80 0.80 0.418 0.418
LowVol -0.0119 -0.04 -0.0612 21 -1.38 -1.18 -0.569 -0.512
EqualWeight 0.0047 0.02 -0.0198 21 -0.71 -0.54 -0.294 -0.228
ICWeighted 0.0239 0.09 0.0672 1 0.97 0.97 0.701 0.701
Lasso 0.0171 0.06 0.0672 21 0.98 0.89 0.690 0.592

Observations.

  • EqualWeight cannot flip a negative-IC factor. Averaging SectorNeutralMom (+IC) with raw LowVol (−IC) lets the two partly cancel: EqualWeight posts IC@1d 0.005, Sharpe(nat) −0.54, PnL −0.23, worse than either input oriented correctly.
  • Both sign-aware combiners flip LowVol and beat the best single input (SectorNeutralMom Sharpe(nat) 0.80). ICWeighted reaches Sharpe(nat) 0.97 (PnL 0.68, IC@1d 0.024); Lasso reaches 0.89 (PnL 0.59).
  • ICWeighted and Lasso are close (0.97 vs 0.89). Separating them is likely chasing noise; both are carried into the regime and robustness checks.
  • The combiners' natural_freq picks diverge: Lasso 21d, ICWeighted 1d. The max-|t_NW| rule puts Lasso at the 21d scan cap and ICWeighted at 1d (SectorNeutralMom also 1d; LowVol and EqualWeight 21d). On this 1–21d grid neither is pinned down: Lasso sits at the boundary, and ICWeighted's t(NW) is near-flat across 1–21d. §4.3 extends the scan to 63 days. Horizon is an overfit-prone parameter, so only standard rebalance cadences are tested.

4.3 Horizon analysis & natural frequency¶

Extend the IC-decay scan to 63 days to see where each combiner's IC stays reliable (earlier scans capped at 21 days hit the boundary). Both signals are profiled, the Lasso (§4.3a) and ICWeighted (§4.3b), since we may carry both forward.

4.3a Lasso¶

Deep IC-decay report for the Lasso (SectorNeutralMom + LowVol).

============================================================
  Signal Report: Lasso (deep)
============================================================

  Diagnostics
  ────────────────────────────────────────
  Lag-1 autocorrelation:     0.968  âš  quasi-static
  Mean daily turnover:      0.163
  Mean dispersion:          0.026

  IC by Horizon
  ────────────────────────────────────────────────────────
  Horizon   Mean IC    ICIR   t-stat    t(NW)            95% CI
  ────────────────────────────────────────────────────────
      1d   +0.0171    0.06     2.13     2.13  [+0.002, +0.033]
      5d   +0.0356    0.14     4.54     2.52  [+0.009, +0.064]
     10d   +0.0491    0.19     6.42     2.57  [+0.013, +0.087]
     21d   +0.0672    0.29     9.64     2.73  [+0.019, +0.116]
     30d   +0.0725    0.31    10.30     2.48  [+0.019, +0.132]
     42d   +0.0738    0.31    10.02     2.13  [+0.008, +0.145]
     63d   +0.0904    0.40    12.90     2.38  [+0.010, +0.165]

  Backtest Comparison (cost = 10 bps)
  ────────────────────────────────────────
  Natural rebalance freq:  21d
  Sharpe (daily):          +0.981
  Sharpe (21d rebal):      +0.892

  Lead-Lag Profile
  ────────────────────────────────────────
  Strongest lead (predictive): offset +5  IC = +0.0179
  Strongest lag (reactive):    offset -5  IC = +0.0299

============================================================

No description has been provided for this image

Observations.

  • The Lasso's IC is reliable across horizons, peaking at 21d. Mean IC rises from +0.017 (1d) to +0.090 (63d); the HAC t-stat stays ≥ 2.1 throughout and peaks at 2.73 at 21d, where the CI gap from zero is widest. natural_freq picks 21d (the largest HAC t-stat, §2.2 rule).
  • Diagnostics. Lag-1 autocorrelation 0.968 (quasi-static, expected for 252-day-lookback inputs), turnover 0.16, dispersion 0.026. The low dispersion is a scale artifact: the Lasso standardizes its regression target, so the combined signal's values are tiny (~1e-3). It carries no performance meaning; the rank-based IC and the scale-invariant backtester ignore signal scale.
  • The signal leans reactive. Lead-lag is stronger on the past-return side (~+0.028) than the future-return side (~+0.015), so much of the long-horizon IC is persistence of an existing tilt. These are full-sample figures on a bull-dominated window.

4.3b ICWeighted¶

Deep IC-decay report for the ICWeighted combiner, on the same 63-day scan (deep_cfg, defined in §4.3a).

============================================================
  Signal Report: ICWeighted (deep)
============================================================

  Diagnostics
  ────────────────────────────────────────
  Lag-1 autocorrelation:     0.974  âš  quasi-static
  Mean daily turnover:      0.132
  Mean dispersion:          0.816

  IC by Horizon
  ────────────────────────────────────────────────────────
  Horizon   Mean IC    ICIR   t-stat    t(NW)            95% CI
  ────────────────────────────────────────────────────────
      1d   +0.0239    0.09     2.96     2.96  [+0.008, +0.040]
      5d   +0.0398    0.16     5.19     2.93  [+0.013, +0.066]
     10d   +0.0527    0.22     7.22     2.92  [+0.016, +0.089]
     21d   +0.0672    0.31    10.18     2.94  [+0.022, +0.112]
     30d   +0.0679    0.31    10.24     2.55  [+0.017, +0.121]
     42d   +0.0665    0.29     9.52     2.03  [+0.003, +0.131]
     63d   +0.0780    0.34    11.14     1.97  [-0.008, +0.147]

  Backtest Comparison (cost = 10 bps)
  ────────────────────────────────────────
  Natural rebalance freq:  1d
  Sharpe (daily):          +0.971
  Sharpe (1d rebal):      +0.971

  Lead-Lag Profile
  ────────────────────────────────────────
  Strongest lead (predictive): offset +1  IC = +0.0239
  Strongest lag (reactive):    offset -4  IC = +0.0343

============================================================

No description has been provided for this image

Observations.

  • ICWeighted's IC is strong and flat from 1d to 21d, then decays (HAC t-stat ~2.9, highest at 1d, 2.96; 42d 2.03; 63d 1.97 with a CI that straddles zero). The edge sits in the 1–42 day range. natural_freq picks 1d (t-stat marginally highest there; §2.2 rule), where the book has Sharpe 0.97.
  • The pick is a near-tie across 1–21d: t(NW) is 2.96 (1d), 2.93 (5d), 2.92 (10d), 2.94 (21d). The 21d horizon has a wider CI gap from zero, so the natural cadence for both combiners arguably lies at 21d.
  • Diagnostics. Lag-1 autocorrelation 0.974 (quasi-static), turnover 0.13, dispersion 0.816 (the largest here). This is a scale artifact opposite to the Lasso's: ICWeighted sums unit-variance z-scored factors (O(1) values), versus the Lasso's ~1e-3 coefficients. It carries no performance meaning, since the IC is rank-based and the backtester scale-invariant.
  • Same reactive lean. Lead-lag is past-return-dominant (~+0.033 vs ~+0.020), so as with the Lasso much of the IC is persistence.

4.3c Rebalance-frequency sweep¶

The two natural-frequency picks sit at opposite ends of the scan (Lasso 21d, ICWeighted 1d), and the ICWeighted pick is a near-tie, so neither is decisive. Sweep the rebalance cadence for each across short-to-monthly horizons, split by regime, to see whether a faster or slower rebalance helps, and whether a faster cadence helps the bear.

Sharpe Sh_bear Sh_bull
signal freq
Lasso 1 0.98 -0.05 1.33
5 1.01 0.00 1.34
7 1.08 0.10 1.42
10 1.00 -0.10 1.36
15 0.88 -0.20 1.23
21 0.89 0.13 1.15
31 0.91 0.52 1.02
ICWeighted 1 0.97 0.10 1.27
5 0.99 0.07 1.30
7 1.02 0.13 1.33
10 1.01 -0.01 1.35
15 0.84 -0.16 1.18
21 0.85 0.09 1.11
31 0.96 0.53 1.10

Observations.

  • Full-sample Sharpe peaks at a fast 7-day rebalance for both combiners (Lasso 1.08, ICWeighted 1.02), above the 21d figures (0.89 / 0.85). Likely because the full sample is bull-dominated, and momentum's fast-decaying edge is best captured by frequent rebalancing.
  • The bear prefers a slow 31-day rebalance (Sh_bear 0.52 / 0.53 at 31d, versus ~0.10 at 7d and negative around 15d). A choppy bear erodes a fast book; rebalancing slowly holds the defensive LowVol tilt through the chop.
  • The two objectives pull apart by regime. Bull rewards fast, bear rewards slow; 21d captures the best of neither (bear ~0.10). The horizon that maximises IC reliability differs from the one that maximises backtest Sharpe. natural_freq is just a heuristic (the max-|t(NW)| horizon); on the reliability evidence a 20–21d cadence is arguably the more robust read for ICWeighted, since its IC-decay CI band sits furthest from zero around the three-week mark. These results are also noisy, and prone to overfitting. It is difficult to claim regime specific robustness and separate causes cleanly with a small sample.

4.4 Regularization robustness (alpha sweep)¶

Sweep the Lasso penalty to check the chosen alpha=0.001 is stable. The sweep uses point estimates only (no bootstrap) for speed, and reports live_dates to catch a flattering Sharpe computed off an over-penalized, near-dead signal.

live_dates IC@1d IC@21d nat_freq Sharpe(1d) Sharpe(nat)
alpha
0.0005 1111 0.0171 0.0672 21 0.98 0.90
0.0010 1111 0.0171 0.0672 21 0.98 0.89
0.0050 1111 0.0177 0.0651 21 0.96 0.79
0.0100 1111 0.0142 0.0583 21 0.70 0.55
0.0500 1111 -0.0191 -0.0048 5 0.09 -0.35

Observations.

  • The chosen alpha=0.001 sits on a flat plateau. Across 0.0005 → 0.005 the IC (≈0.017 at 1d, ≈0.065–0.067 at 21d) and Sharpe(1d) (0.96–0.98) are essentially constant; a tenfold change in the penalty barely moves the signal. The 0.001 default is mid-plateau, so the result does not hinge on a fragile parameter choice.
  • Beyond the plateau the signal degrades sharply. By 0.01 Sharpe(nat) falls to 0.55; by 0.05 both IC@1d (−0.019) and IC@21d (−0.005) turn negative and the book is unprofitable (Sharpe(nat) −0.35). The cliff shows the penalty is doing real variable selection.
  • live_dates stays at 1111 throughout, so none of these Sharpes are flattered by an over-penalized signal computed off a shrunken sample; the high-alpha degradation reflects genuine signal loss (the constant sample rules out a coverage artifact).

4.5 Regime stability¶

Split both combiners into the 2022 bear and the 2023-26 bull to check whether the edge is cross-regime or carried by one.

The eval window starts 2021-12-31, so the bear leg is only ~1 year (about 8 independent 31-day windows), so its IC and Sharpe are noisy; read the sign/direction there and treat the magnitude as noise. The shared full_and_regime evaluator (defined in the next cell) backtests a signal at the fixed 31-day cadence and reports full-sample IC/Sharpe plus the per-regime split, and is reused by the controls below.

days IC@1d IC@31d Sharpe AnnRet MaxDD SPY AnnRet
signal regime
Lasso 2022 bear 252 0.0124 0.0063 0.52 0.062 -0.089 -0.184
bear->bull transition 145 -0.0314 -0.1025 -1.70 -0.166 -0.143 0.287
2023-26 bull 858 0.0185 0.0928 1.02 0.130 -0.134 0.228
ICWeighted 2022 bear 252 0.0170 0.0073 0.53 0.067 -0.090 -0.184
bear->bull transition 145 -0.0086 -0.1103 -1.39 -0.168 -0.161 0.287
2023-26 bull 858 0.0259 0.0865 1.10 0.143 -0.150 0.228

Observations.

  • Both combiners are positive in both the bear and the bull. At the 31-day cadence the Lasso earns Sharpe 0.52 (bear) / 1.02 (bull) and ICWeighted 0.53 / 1.10, each with a positive annualized return in the 2022 bear (+6.2% / +6.7%) while SPY fell −18.4%. The book is dollar-neutral by construction, but this table does not measure its market beta; a low-vol-vs-high-vol tilt carries net-negative beta, which a falling market rewards, so the bear return here cannot be cleanly separated from that exposure.
  • The damage is concentrated in the regime change. Over the bear-bull transition window (late Sep 2022 – Apr 2023, bracketing the SPY low of 12 Oct 2022 and both signals' drawdown troughs in Mar–Apr 2023), Sharpe is sharply negative: −1.70 (Lasso), −1.39 (ICWeighted), and this overlapping window is where each book takes its full-sample max drawdown (~−16%).
  • The bear results are weakly evidenced. Sharpe ~0.52 over a single ~1-year window is only a ~0.5 t-stat, and bear IC@31d is a marginal +0.006–0.007. So the bear contribution is mostly the defensive tilt being directionally right (low-vol outperformed through the 2022 decline); the cross-sectional selection inside the bear stays noisy (IC near zero). The bull is where the cross-sectional selection shows up (the larger IC@31d +0.09, Sharpe ~1.0–1.1).

Decomposition and orientation. First, lay the two raw factors (SectorNeutralMom, LowVol) beside the two combiners at the 31-day cadence, split across the bear, the bear→bull transition, and the bull, to see which factor accounts for each regime's contribution. Second, look at how the sign-aware combiners orient LowVol: they set each factor's sign from its 252-day trailing IC, so compare that trailing sign against the realized ~1-month IC through the transition to see whether the orientation tracks the regime or lags it.

Sharpe Sh_bear Sh_trans Sh_bull IC@31d IC_bear IC_trans IC_bull
SectorNeutralMom 0.87 -0.73 -1.37 1.18 0.0267 -0.0414 -0.0708 0.0475
LowVol -0.97 1.00 -1.45 -1.71 -0.0712 0.0787 -0.1482 -0.1168
ICWeighted 0.96 0.53 -1.39 1.10 0.0681 0.0073 -0.1103 0.0865
Lasso 0.91 0.52 -1.70 1.02 0.0726 0.0063 -0.1025 0.0928
trailing252 (orientation) realized21 combiner tilt rewarded
date
2022-08-31 0.0233 0.0765 long low-vol low-vol
2022-12-30 0.0358 0.0763 long low-vol low-vol
2023-02-28 0.0085 -0.0077 long low-vol high-vol
2023-04-28 -0.0031 0.0610 long high-vol low-vol
2023-06-30 -0.0145 -0.0324 long high-vol high-vol

Observations.

  • The two raw factors contribute with opposite signs across regimes. SectorNeutralMomentum is positive in the bull (Sharpe +1.18, IC_bull +0.048) and negative in the bear (−0.73, IC_bear −0.041); LowVol is the reverse (bear +1.00, IC_bear +0.079; bull −1.71, IC_bull −0.117). For momentum this is cross-sectional rather than directional: its IC (a rank correlation, independent of the market level) flips sign, so the return ranking reversed in 2022 as prior winners became losers. Momentum profits when the ranking persists and loses when leadership rotates. LowVol's IC flips too, and its long-low-vol/short-high-vol tilt also carries net-negative beta, so part of its bear gain is market exposure rather than pure cross-sectional selection (see the cell above).
  • In the combiners the bear selection is weak. ICWeighted and Lasso post a positive bear Sharpe (0.53 / 0.52) but a bear IC@31d of only +0.007 / +0.006, far below LowVol's raw +0.079. Momentum's bear IC is negative (−0.041), so the two inputs partly cancel in the bear: the combiner keeps a small positive bear return while its cross-sectional ranking there is close to flat.
  • Every row is negative through the transition. Both raw factors and both combiners have a negative transition Sharpe (−1.37 to −1.70) and negative IC@31d (−0.07 to −0.15), including raw LowVol (−1.45) and raw SectorNeutralMomentum (−1.37). Both inputs are trailing measures, so neither can reposition before the trend it tracks has already turned; the opposite-sign behaviour that separates them in the stable regimes does not hold through the turn, where they move offside together.
  • The combiner's LowVol sign lags the realized IC through the transition. The sign it uses (LowVol's trailing-252 IC) stays positive (long low-vol) from Aug 2022 through Feb 2023 (+0.023 → +0.036 → +0.009) and only turns negative by late Apr 2023. The realized ~1-month IC flips faster: low-vol rewarded into Dec 2022 (+0.076), high-vol by Feb 2023 (−0.008), low-vol again by Apr (+0.061). So the tilt and what was rewarded disagree at Feb 2023 (long low-vol while high-vol paid) and Apr 2023 (long high-vol just as low-vol recovered), both inside the transition window. A sign set from a 252-day trailing average cannot track an IC that changes sign within weeks; this is a lookback / non-stationarity effect.

4.6 Robustness controls¶

Two controls: whether the two-factor pick matters (compared against all factors), and which factor family accounts for each regime's result.

4.6.1 All factors¶

Run the three combiners on the full factor set, to test whether the two-factor result depends on the specific pair. Two factors are excluded: XSMomentum (a rank-duplicate of Momentum, which makes the Lasso coefficients unidentifiable) and ResidualMom (its late-2021 start would shorten the 2022 bear window). That leaves 11 factors on the same 2021-12-31 window.

All-factor inputs (11): ['Momentum', 'RSI', 'Bollinger', 'STReversal', 'LowVol', 'SectorNeutralMom', 'Quality', 'RollingSharpe', 'RollingCVaR', 'RollingMaxDD', 'RollingSkew']
IC@1d IC@31d Sharpe Sh_bear IC31_bear Sh_bull IC31_bull
EqualWeight_all 0.0083 -0.0188 -0.44 1.18 0.0336 -1.10 -0.0348
ICWeighted_all 0.0218 0.0419 0.69 -0.06 -0.0304 0.91 0.0639
Lasso_all 0.0120 0.0619 0.77 -0.10 0.0240 1.03 0.0734

Observations.

  • On the full set the combiners have a negative bear Sharpe. Lasso_all and ICWeighted_all reach full Sharpe 0.77 / 0.69 with bear −0.10 / −0.06, against the two-factor combiners' 0.91 / 0.96 with bear +0.52 / +0.53. Spreading weight across eleven factors removes the positive bear result the LowVol-heavy pair produced.
  • Lasso_all has a positive bear IC@31d (+0.024) but a negative bear Sharpe (−0.10). A small positive rank-correlation on ~8 independent windows does not carry through to the sized book.
  • This also makes sense mechanically; the factors predict different types of "movements" in different market conditions and regimes; combining them is essentially trying to predict the market uniformly with a single tailored signal.

Attribution. EqualWeight_all has a negative full Sharpe, positive bear, and negative bull. To see which factors produce this, equal-weight each as-built sub-group (momentum, reversal, risk) on its own and split by regime. The All (11) row repeats the EqualWeight_all line above as a check.

IC@1d IC@31d Sharpe Sh_bear IC31_bear Sh_bull IC31_bull
Momentum (3) 0.0243 0.0357 0.77 -0.08 -0.0193 0.98 0.0524
Reversal (3) -0.0007 -0.0047 0.05 1.62 0.0318 -0.43 -0.0159
Risk (4) -0.0097 -0.0614 -0.92 1.08 0.0860 -1.68 -0.1062
All (11) 0.0083 -0.0188 -0.44 1.18 0.0336 -1.10 -0.0348

Observations.

  • The risk and reversal groups both produce the bear-positive, bull-negative pattern. Risk (4): full −0.92, bear +1.08, bull −1.68. Reversal (3): full +0.05, bear +1.62, bull −0.43. Momentum (3): full +0.77, bear −0.08, bull +0.98. The risk group accounts for the negative full Sharpe and the bull underperformance; the reversal group accounts for most of the bear Sharpe.
  • The 2022 decline was choppy, with short counter-trend rallies. Short-window reversal factors are positive there (bear +1.62) while 252-day momentum is negative (bear −0.08). Equal-weight cannot flip a factor, so averaging all eleven nets to the defensive/contrarian side (All bear +1.18, bull −1.10).

4.6.2 Factor families by regime¶

Split the factors into momentum-only, defensive-only, and reversal-only equal-weight books, and split each across the bear, the bear→bull transition, and the bull, to see how each family behaves in each regime, including the transition.

Sharpe Sh_bear Sh_trans Sh_bull IC@31d IC_bear IC_trans IC_bull
Momentum-only (EW) 0.77 -0.08 -1.23 0.98 0.0357 -0.0193 -0.1102 0.0524
Defensive-only (EW, as-built) -0.97 0.86 -1.42 -1.74 -0.0683 0.0450 -0.1671 -0.1028
Reversal-only (EW, as-built) 0.05 1.62 2.23 -0.43 -0.0047 0.0318 0.0435 -0.0159

Observations.

  • Each family is positive in a different regime. Momentum: bull +0.98, bear −0.08. Defensive: bear +0.86, bull −1.74. Reversal: transition +2.23, bull −0.43, full-sample +0.05. Reversal is the only family with a positive transition Sharpe; momentum and defensive are both negative there (−1.23, −1.42).
  • Reversal's pattern follows from its construction: it bets on short-term direction change, so it is positive in the choppy transition and negative in the trending bull, and close to zero full-sample.

4.6.3 Adding reversal to the combiners¶

Reversal alone is positive in the transition (§4.6.2, Sharpe +2.23). Test whether adding it to the combiners changes the transition result. Use the reversal family, equal-weighted (RSI + Bollinger + STReversal) as a single input, and test three pairings per combiner: SNM + LowVol, that pair plus reversal, and momentum + reversal. If a static blend can use reversal, the transition Sharpe should improve.

Sharpe Sh_bear Sh_trans Sh_bull IC@31d IC_bear IC_trans IC_bull
Lasso: SNM+LowVol 0.91 0.52 -1.70 1.02 0.0726 0.0063 -0.1025 0.0928
Lasso: SNM+LowVol+Reversal 0.74 -0.27 -1.80 1.03 0.0654 -0.0125 -0.0964 0.0891
Lasso: SNM+Reversal 0.27 -2.13 -2.74 0.79 0.0174 -0.0398 -0.0114 0.0349
ICWeighted: SNM+LowVol 0.96 0.53 -1.39 1.10 0.0681 0.0073 -0.1103 0.0865
ICWeighted: SNM+LowVol+Reversal 0.77 -0.39 -1.64 1.11 0.0599 -0.0148 -0.1300 0.0826
ICWeighted: SNM+Reversal 0.35 -1.79 -2.24 0.86 0.0174 -0.0672 -0.0886 0.0432

Observations.

  • Adding reversal does not improve the transition Sharpe. SNM+LowVol+Reversal is −1.80 (Lasso) / −1.64 (ICWeighted), against −1.70 / −1.39 for the pair. Dropping the defensive factor (SNM+Reversal) is worse in the bear (−2.13 / −1.79) and the transition (−2.74 / −2.24).
  • Adding reversal lowers the full and bear Sharpe. Full Sharpe falls 0.91 → 0.74 (Lasso) and 0.96 → 0.77 (ICWeighted); bear falls to −0.27 / −0.39.
  • The transition ranking improves while the Sharpe does not. SNM+Reversal's transition IC@31d is −0.011 (Lasso), against −0.103 for the pair. Reversal is small and full-sample-weak, so the combiner sizes it down; the larger momentum and LowVol positions set the book, and both are negative in the transition. The improvement shows in the ranks but not in the sized returns.
  • One issue is non-stationarity and the long lookback windows in the parameters; IC-weighting and the signals cannot react to fast reversals or regime change.

4.7 IC-weighting diagnostics¶

ICWeighted weights factors by their trailing IC. Two diagnostics on that choice: whether a factor's trailing IC predicts its future IC (§4.7.1), and whether decaying the IC window faster helps (§4.7.2).

4.7.1 IC autocorrelation¶

IC-weighting assumes a factor's trailing IC carries information about its future IC. Test this with the autocorrelation of each factor's daily IC series, separating whether trailing IC predicts the magnitude of future IC (timing) from whether it supplies a stable sign (orientation).

mean_IC IC_vol acf_1 acf_5 acf_21 acf_63
factor
Momentum 0.0261 0.277 0.005 -0.040 -0.013 0.039
XSMomentum 0.0261 0.277 0.005 -0.040 -0.013 0.039
RSI -0.0019 0.227 0.019 0.093 -0.035 -0.001
Bollinger -0.0017 0.226 0.043 0.089 -0.005 -0.013
STReversal 0.0017 0.243 -0.040 0.034 -0.014 -0.026
LowVol -0.0119 0.293 0.023 0.004 -0.013 0.070
ResidualMom 0.0230 0.238 -0.011 -0.058 -0.005 0.033
SectorNeutralMom 0.0203 0.199 0.003 -0.047 -0.042 0.049
Quality -0.0028 0.154 0.031 0.006 -0.012 0.038
RollingSharpe 0.0233 0.264 -0.004 -0.064 -0.019 0.039
RollingCVaR -0.0113 0.325 0.018 0.012 -0.011 0.062
RollingMaxDD -0.0005 0.290 0.007 -0.005 -0.030 0.071
RollingSkew -0.0064 0.158 0.013 -0.014 0.013 0.048

Observations.

  • Daily IC has essentially no autocorrelation. Across all 13 factors and lags 1/5/21/63, the IC autocorrelations sit between −0.064 and +0.093, against a ±1.96/√1110 ≈ ±0.059 noise band. Almost all are inside it; the few outside (RSI/Bollinger acf_5 ≈ 0.09) are isolated. Trailing IC does not predict the magnitude of next-period IC, so there is no short-term factor-quality signal to time.
  • The sign of the mean IC is stable. The mean-IC column is consistently positive for momentum (~+0.02 to +0.03) and consistently negative for LowVol and RollingCVaR. So trailing IC supplies a stable sign (orientation) even though the day-to-day IC is noise. This is what IC-weighting uses: it orients each factor to its profitable direction.
  • This also explains the transition lag. With no short-term IC persistence, the orientation can only update at the slow trailing-window pace, so it cannot react quickly when the regime flips.

4.7.2 EWM vs flat IC-weighting¶

§4.7.1 showed the orientation updates slowly because trailing IC has no short-term persistence. Test whether decaying the IC window faster (EWM) lets it react sooner. Compare flat-252 against EWM at several halflives, on the SNM+LowVol pair and the pair-plus-reversal, split by regime (bear / transition / bull) with final PnL.

Sharpe Sh_bear Sh_trans Sh_bull PnL
SNM+LowVol | flat-252 0.96 0.53 -1.39 1.10 0.680
SNM+LowVol | ewm-hl63 0.92 0.57 -1.10 1.04 0.648
SNM+LowVol | ewm-hl126 0.99 0.89 -1.01 1.03 0.726
SNM+LowVol | ewm-hl252 0.93 0.92 -1.44 0.93 0.654
SNM+LowVol+Reversal | flat-252 0.77 -0.39 -1.64 1.11 0.449
SNM+LowVol+Reversal | ewm-hl63 0.84 0.11 -1.39 1.08 0.531
SNM+LowVol+Reversal | ewm-hl126 0.84 0.23 -1.53 1.03 0.531
SNM+LowVol+Reversal | ewm-hl252 0.80 0.34 -1.62 0.95 0.508

Observations.

  • A faster IC window raises the bear and full Sharpe on the pair. SNM+LowVol at ewm-hl126 has full Sharpe 0.99, bear 0.89, transition −1.01, PnL 0.726, against flat-252's 0.96, 0.53, −1.39, 0.680. A shorter window picks up the new IC sign sooner, so it orients to the bear earlier. (§4.7.1 ruled out quality-timing, so this is orientation speed.)
  • The transition stays negative for every window. It ranges −1.01 to −1.44, and faster is not uniformly better (hl252 transition −1.44, bull 0.93). A shorter window reduces the orientation lag but cannot track an IC that flips within weeks.
  • For the reversal-inclusive set, EWM raises the bear but the set still trails the pair. Bear improves from −0.39 (flat) to +0.34 (hl252), but the best reversal-set full Sharpe (0.84) stays below the pair's (0.99), and the transition stays negative. Adding reversal remains net-negative even with faster weighting.

5. Conclusion¶

Selected signal. Signed IC-weighting (EWM, 126-day halflife) of SectorNeutralMomentum + LowVol, rebalanced at 31 days. On the full 2021-12-31 to 2026 sample it has Sharpe 0.99 (PnL +73%, win rate 56%) and beta ≈ −0.02 to SPY. Split by regime, its Sharpe is +0.89 in the 2022 bear and +1.03 in the bull, with a positive return in the bear while SPY fell −18%. Its largest drawdown (≈ −16%) is at the bear→bull turn. These are in-sample figures on one bear and one bull, so they describe this sample only.

What was built. A factor-construction and validation pipeline: factor construction → per-factor gating via SignalReport (HAC t-stats, block-bootstrap CIs, IC decay, diagnostics) → IC-correlation redundancy mapping → three-combiner comparison → horizon and regularization selection → regime and robustness checks.

Decision trail.

Stage Outcome
Triage (13 → 7) Momentum family (+IC) and risk family (−IC) survive; six fail at every horizon.
Curated inputs SectorNeutralMom + LowVol, near-independent (corr ≈ 0), both studied factors.
Combiner ICWeighted and Lasso each flip LowVol to its profitable orientation; EqualWeight cannot flip. ICWeighted with EWM hl126 used as the final variant (§4.7.2).
Horizon 31-day rebalance (highest 2022-bear Sharpe in the §4.3c sweep).

Main observations.

  1. Opposite-regime contributions. Momentum is positive in the bull and negative in the bear (+1.18 / −0.73); LowVol as built is the reverse (+1.00 bear / −1.71 bull). Both books are dollar-neutral. Momentum's swing is cross-sectional rather than directional: its IC flips from +0.048 (bull) to −0.041 (bear), so the return ranking reversed in 2022 (leadership rotation) while the dollar-neutral book carried little market exposure. LowVol additionally carries net-negative beta (§4.5).
  2. Both factors lose through the transition (Sharpe ≈ −1.0 to −1.4). Both are trailing signals oriented by a slow trailing IC, so at the turn they carry the sign of the regime that just ended. Daily IC has no short-term persistence (§4.7.1), so the orientation updates slowly.
  3. Reversal does not transfer. Reversal alone is positive in the transition (+2.23) but adding it to the combiners does not help (§4.6.3): it is weak full-sample, so the combiner sizes it down and the momentum/LowVol positions set the book. The transition ranking improves (IC −0.10 → −0.01) while the sized return does not.
  4. A faster IC window (EWM hl126) raises the bear (0.53 → 0.89); the transition stays negative (§4.7.2).

Caveats. A single bear regime (~252 days, ~8 independent 31-day windows → the bear Sharpe is a ~0.9-over-one-year estimate, encouraging but not significant); current-membership survivorship bias inflates absolute figures; the bear edge is partly a defensive tilt paying off (low-vol outperformed) rather than fine-grained selection (bear IC@31d marginal). There is also some structural "overfitting" in the results although the study attempted to avoid snooping by testing standard parameters, factors etc. A much larger study is needed to present the statistical findings with confidence. A lookahead bias is present in the selection of factors based on full in-sample results; a more refined study ought to split the entire signal generation process over train/test splits.

Future directions.

  1. Regime-conditional orientation. A single static weight vector cannot turn reversal on only at the turn while down-weighting the slow factors there. This makes sense given the thesis of the signals themselves; if a signal trades on short term reversal, it cannot provide value in long directional regimes.
  2. Faster / regime-aware IC windows. EWM hl126 already helps; shorter or state-dependent windows, or an explicit volatility/transition trigger, could cut the orientation lag further.
  3. Rank-transform sizing. Size on cross-sectional rank instead of z-score magnitude, so the book sizes by what IC measures. The rank-vs-magnitude gap recurs throughout, and is why reversal's transition ranking does not show up in the sized returns.
  4. Point-in-time universe + longer history. Reconstruct historical index membership and extend to ~2018 (adding the 2020 COVID bear) to test the regime findings on more than one downturn and remove survivorship bias.
Final signal vs Lasso - regime Sharpes (31d rebal, 10bps):
                             Sharpe  Sh_bear  Sh_trans  Sh_bull
Final: ICWeighted EWM-hl126    0.99     0.89     -1.01     1.03
alt: Lasso (alpha=0.001)       0.91     0.52     -1.70     1.02

S&P 500 (SPY, long-only) benchmark:
       Sharpe  AnnRet  MaxDD
full     0.73   0.119 -0.245
bear    -0.72  -0.184 -0.245
trans    1.34   0.287 -0.075
bull     1.43   0.228 -0.188
No description has been provided for this image