| Composite Score | Equity (SPY) | Defensive (SHY) | Regime |
|---|---|---|---|
| 0 – 1 | 100% | 0% | All Clear |
| 2 | 50% | 50% | Watch |
| 3 – 5 | 0% | 100% | Defence |
What it measures: The number of large-cap stocks (from a universe of 90) that have experienced a significant decline over the trailing 8 trading days. This captures the breadth of selling pressure across the market.
Why it matters: Broad-based selling across many stocks is a more reliable stress indicator than a single index move. A market can fall 2% on a handful of mega-cap names, but when 115+ stocks are simultaneously declining, it signals genuine institutional de-risking.
Rule: Signal fires when the 8-day rolling count ≥ 115. Resets when count falls below threshold.
Frequency: Daily. Execution: T+1 close.
What it measures: Whether the S&P 500 is trading above or below its 200-day simple moving average — the most widely followed long-term trend indicator in institutional asset management.
Why it matters: A sustained break below the 200-day MA historically precedes extended bear markets. It acts as a confirmation filter: short-term volatility alone does not trigger this signal.
Rule: Signal fires when SPY closes below its 200-day SMA. Resets when SPY closes above.
Frequency: Daily. Execution: T+1 close.
What it measures: The trailing 12-month absolute return of the S&P 500. Negative 12-month momentum indicates a market that has been in decline for an extended period.
Why it matters: Absolute momentum is one of the most robust factors in academic finance (Moskowitz, Ooi & Pedersen, 2012). Markets with negative trailing returns tend to continue declining — this captures the persistence of bear markets.
Rule: Signal fires when SPY 12-month return is negative. Resets when trailing return turns positive.
Frequency: Monthly. Execution: 1st trading day of following month.
What it measures: Whether the S&P 500 is above or below its 10-month simple moving average. Based on Mebane Faber’s widely cited 2007 research on tactical asset allocation.
Why it matters: The 10-month SMA is a slower, more stable trend filter than the daily 200-day MA. It reduces noise from short-term whipsaw while still capturing major regime changes. Monthly evaluation further limits transaction frequency.
Rule: Signal fires when SPY is below its 10-month SMA at month-end. Resets when SPY closes above at month-end.
Frequency: Monthly. Execution: 1st trading day of following month.
What it measures: The ratio of VIX (30-day implied volatility) to VIX3M (3-month implied volatility). When VIX exceeds VIX3M, the term structure is in backwardation — the options market is pricing near-term risk higher than medium-term risk.
Why it matters: Term structure inversion is a real-time institutional fear gauge. Unlike price-based signals, it reflects the forward-looking expectations of options market participants. A 3-day confirmation filter eliminates single-day spikes from routine expiration dynamics.
Rule: Signal fires when VIX/VIX3M > 1.0 for 3 consecutive trading days. Resets when the ratio falls below 1.0. Available from 2008 (VIX3M inception).
Frequency: Daily. Execution: T+1 close.
The primary defensive asset. Duration of approximately 2 years minimises interest rate risk while preserving capital. Avoids the double-loss scenario where both equities and long-duration bonds decline simultaneously, as occurred in 2022. Backtesting confirms SHY delivers comparable risk-adjusted returns to IEF with lower tail risk in rate-rising environments.
Fully systematic. All entry and exit decisions are rules-based with no discretionary overrides. The system is designed to remove behavioural bias from defensive timing decisions.
No look-ahead bias. All signals use previous-day data for next-day-close execution (T+1). Daily signals (stress count, 200-day MA, VIX term structure) are evaluated each trading day. Monthly signals (momentum, SMA, canary) are evaluated at month-end and execute on the first trading day of the following month.
Minimum holding period: Once a defensive position is triggered, it is held for at least 42 trading days (~2 months) regardless of whether the composite score subsequently drops. This prevents costly whipsaw from short-lived signal oscillations near the threshold.
Transaction cost budget: 5 basis points per allocation change, applied to the full notional amount being rebalanced.
Data pipeline: Automated daily via GitHub Actions. All price data sourced from adjusted close (total return) series to accurately reflect dividend reinvestment.