Why ts_momentum leads at N=100
what you'll learn · Why per-symbol time-series-momentum with an absolute return threshold outperforms cross-sectional ranking on single-signal data, and what this tells us about the entry-rule design axis.
At N=100 seeds, ts_momentum (+0.995) beats baseline (+0.863) by +0.132 Sharpe. Hit rate 82% vs baseline's 79%. Not a small margin — 1.2 standard errors above baseline. The mechanism: ts_momentum's |return| > threshold entry rule closes time-series chop that cross-sectional ranking can't filter. Deepens PR #557's 'strategy shape beats factor count' rule into a sharper claim about the entry-rule axis.
PR #760’s N=100 leaderboard surfaced a winner the session-summary
v2 missed: ts_momentum. Mean +0.995, hit rate 82% — both higher
than baseline’s +0.863 / 79%, and the +0.132 Δ exceeds the
standard error of the difference.
This note examines WHY.
The shape comparison
ts_momentum:
for each symbol:
if abs(log(P_t / P_{t-20})) > 0.02: # 2% absolute return threshold
weight = sign(log(P_t / P_{t-20})) / N_active
baseline (XsMomentumLive):
for each symbol:
score = log(P_t / P_{t-20})
rank scores cross-sectionally
long_quantile = top 20% by score
short_quantile = bottom 20% by score
Two key differences:
-
Entry rule. ts_momentum filters on absolute return magnitude; baseline always trades the quantiles regardless of magnitude.
-
Sizing. ts_momentum equal-weights active symbols; baseline weights by gross-leverage budget across quantiles.
The +0.132 mean delta and the +3 hit-rate-percentage-point delta trace to the first difference. The sizing convention is secondary.
What the threshold does
On synthetic FOMC-drift data, most bars produce per-symbol 20-day returns in the ±1% range (the daily vol is ~1% so 20-day vol is ~4.5%, but the directional drift is small most of the time). When the 20-day return is below the 2% threshold, ts_momentum stays flat in that symbol.
Baseline can’t stay flat. It ALWAYS picks a long quantile and a short quantile. On a flat-return day, the quantiles are distinguished only by noise — the strategy is buying noise.
The 2% threshold filters time-series chop. The cross-sectional ranking has no equivalent filter. Baseline’s only filter is the symbol’s relative rank among others; when ALL symbols are chopping around zero, the rank order is meaningless.
What this confirms
PR #557’s discipline rule said:
Entry rule does more work than score rule on most signals.
The N=100 leaderboard sharpens this. Specifically:
- Entry rule (ts_momentum threshold): lead +0.13 Sharpe over baseline.
- Score rule (multi-factor variants): lose 0.5-1.4 Sharpe from baseline.
The DELTA in Sharpe between the best entry-rule arm and the best score-rule arm is over 1.5 — the largest design-axis difference visible at N=100.
What this rules out
-
Not “ts_momentum always wins.” The threshold is calibrated to this synthetic’s vol scale (1% daily, 2% 20-day threshold). Real markets have multiple regimes; the threshold might need to be regime-conditional, not constant. PR #717’s vol-clustering note hinted at this.
-
Not “cross-sectional is obsolete.” Cross-sectional ranking has properties (built-in market-neutrality, leverage budget, hedge against universe-wide moves) that ts_momentum doesn’t. The +0.13 Sharpe lead on this synthetic doesn’t transfer to every market regime.
-
Not “skip the cross-sectional arms.” The catalog keeps both because real data might invert the ordering — e.g., if drift signals are universe-wide, cross-sectional ranking catches the rotation while ts_momentum stays flat.
The composite question
A natural follow-up: compose ts_momentum’s entry-rule with cross-sectional ranking. The arm would:
- Compute per-symbol 20-day return.
- Filter to symbols where |return| > threshold.
- Cross-sectionally rank the survivors.
- Long top quantile, short bottom quantile.
This combines the chop-filter benefit (ts_momentum’s edge) with the market-neutrality benefit (cross-sectional’s edge). It’s also same-stage composition (filter × rank, both at score-time) of two arms with low pairwise correlation, so the pairwise rule predicts stacking.
Out of scope for this note — but the strategy class
XsTimeSeriesFilteredMomentumStrategy is the natural
follow-up PR.
The refined catalog axis
PR #686’s catalog has the entry-rule axis with these rows:
| Entry rule | Strategy | Effect |
|---|---|---|
| Always trade quantiles | all Xs* score variants | default |
| Trade only when top-bottom spread is above threshold | xs_momentum_with_spread_filter |
closes cross-sectional chop |
| Trade only when per-symbol vol_5/vol_60 is under threshold | xs_momentum_with_vol_regime_filter |
per-symbol vol level gate |
| Trade per-symbol only when absolute return is above threshold | time_series_momentum |
closes time-series chop |
The N=100 result orders these by effectiveness:
time_series_momentum (entry-axis): +0.995 ← leader
baseline (no entry filter): +0.863
xs_momentum_with_spread_filter: +0.861 (filter dormant)
xs_momentum_with_vol_regime_filter: +0.649 (worse)
The time-series entry rule is the only one that beats baseline on this synthetic. The cross-sectional spread filter is dormant (no effect). The vol-regime filter actively harms.
The discipline rule
On data where the underlying alpha is per-symbol momentum with time-series chop noise, the entry-rule design axis is the highest-value lever. Cross-sectional ranking captures relative strength but not absolute strength; time-series threshold filters captures absolute strength but not relative ordering. The composite of both (cross-sectional ranking on ts-filtered universe) is the obvious follow-up.
A corollary: when a new dataset is encountered, run the catalog’s entry-rule axis FIRST (ts_momentum, spread_filter, vol_regime_filter). The score axis (two/three/four_factor) is secondary. The entry rule decision likely dominates the score-weight tuning.
The closing observation
ts_momentum was in the harness from PR ~#530 — the second
or third strategy after baseline. For most of this session it
sat mid-pack in the rankings, lost in the noise of small-N
results and the focus on composite-arm experiments. The N=100
run promoted it to clear leader.
The lesson: small-N harness output is suggestive; high-N harness output is diagnostic. The leader changed because the noise floor dropped, not because the strategy changed. Run more seeds on existing arms before shipping new ones.