Skip to main content
2026-05-22 · 4 min read · ← 1 · research · harness · ts-momentum

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:

  1. Entry rule. ts_momentum filters on absolute return magnitude; baseline always trades the quantiles regardless of magnitude.

  2. 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:

  1. Compute per-symbol 20-day return.
  2. Filter to symbols where |return| > threshold.
  3. Cross-sectionally rank the survivors.
  4. 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.

deskgdfindgfstrategiesgsfeaturesgepromotionsgpapigabotgbwritinggw

Shortcuts are no-ops while typing in an input or textarea.