BATS COMPONENT · SECTOR OSCILLATOR

How broad is today’s sector move?

A proprietary McClellan-style breadth measure. Every day we count how many of the 11 SPDR sector ETFs closed up versus down, then smooth that count with a short-term exponential moving average. When sectors move together (all up or all down), the oscillator spikes. When they diverge or the market is quiet, it hovers near zero.

The recipe

For each trading day:

  1. Advances (A): how many of XLK / XLF / XLE / XLV / XLI / XLY / XLP / XLU / XLB / XLRE / XLC closed higher than yesterday.
  2. Declines (D): how many closed lower.
  3. Ratio-adjusted A/D: (A − D) / (A + D) × 100. Ranges −100 (all sectors down) to +100 (all sectors up).
  4. Oscillator: EMA-5(RA) minus EMA-10(RA). The two EMAs cross often, and the difference between them captures the daily breadth pressure.

Why 5/10 instead of the classic McClellan 19/39? Because our universe is 11 sectors, not the 3,000+ NYSE stocks the original was built for. Faster smoothing keeps the signal reactive to real breadth swings without becoming pure noise.

How it maps to a BATS score

Oscillator readings roughly range from −25 (broad selling pressure) to +25 (broad accumulation), with the vast majority of days landing between −15 and +15. We linearly map that band to a 0–100 score, clamped at the tails:

What the backtest showed (1998–2025, 6,681 days)

Both tails deliver above-baseline 12-month S&P forward returns — the classic U-shape of a legitimate contrarian-plus-momentum signal:

On six of the seven biggest historic bottoms (2002 dot-com, 2008 Lehman, 2011 debt ceiling, 2018 Powell put, 2020 COVID, 2022 bear low) the oscillator confirmed bearish or strong-bearish, reinforcing BATS’s extreme-oversold call. On the 2009-03-09 GFC bottom it had already pivoted to neutral — sector breadth turned before the slower components confirmed, which is a feature, not a bug.

← Back to the BATS dashboard