Seasonal strategy

Russell Rebalancing

Captures the small-cap bounce around the annual Russell reconstitution — long IWM from just after June 23 to the first session of July.

Production
Seasonal
IWM
Backtest

Performance

Real internal-backtest statistics from the registry — Internal backtest · IWM daily bars (Yahoo Finance) · 27 annual windows · 2000–2026.

70.4%
Win rate
3.80
Profit factor
+1.46%
Avg / trade
4.5%
Max drawdown
CAGR
not published
Exposure
not published
27
Total trades
5d
Avg holding

CAGR and exposure are not published for the library yet — we show “—” rather than invent them. Max drawdown, best year and worst year are undefined for the pooled Momentum universe backtest. Win rate is a share of trades, average return is per trade, and holding period is in trading days.

Historical pattern

Russell Rebalancing — average cumulative return across the held window

Trading sessions since entry (0 = first session after June 23, 5 = first session of July / exit) · Average cumulative return (%). Empirical average path: the mean cumulative return at each held session, computed across all 27 completed backtest windows on real IWM daily closes — measured from history, NOT illustrative and NOT externally published. It is labelled basis:"derived" only because the frozen v1 enum offers no "empirical" value, and "derived" (our own computation) is more honest here than "published" (which would imply an external source). Each point averages the same 27 windows; the day-5 value equals the mean per-trade return in `historical`.

Every year, FTSE Russell rebuilds the membership of its US indices (Russell 1000, 2000, 3000) from scratch — a process called reconstitution. Companies are re-ranked by market capitalization, and additions/deletions are announced in June and made effective at the close on the last Friday of June (the "rebalance date").

Because trillions of dollars track the Russell benchmarks passively, index funds and ETFs must trade the additions and deletions in size, price-insensitively, to stay aligned with the new membership. That demand/supply shock is heaviest in the small-cap, less-liquid Russell 2000, and it has historically been followed by a short relief bounce into early July.

This strategy monetizes that bounce with a single, fully mechanical trade per year:

  • Buy IWM at the close of the first trading session after June 23.
  • Sell at the close of the first trading session of July.
  • Hold cash the rest of the year.

It is a market-timing strategy: entry and exit are fixed trading dates, not price levels. It recommends no individual stocks and defines no stop or target — its only risk control is the very short, fixed holding period (about five trading sessions) and being flat otherwise.

Best for

  • Normal years with heavy passive participation and no competing macro shock, when reconstitution flow is the dominant driver of small-cap prices around month-end.
  • Years where pre-positioning around the rebalance unwinds into a clean early-July bounce.

Avoid when

  • A macro event (rate decisions, risk-off shocks, thin-liquidity holiday distortions) swamps the flow.
  • The effect is arbitraged away — it is well known and has decayed over time.
  • Small caps are in a strong independent trend that overwhelms the seasonal signal.

Market behaviour exploited

Mechanical, price-insensitive index-tracking flow forced by reconstitution — a structural microstructure effect, not a fundamental or news-driven one.

DriverMechanism
Passive replicationIndex funds/ETFs must hold exactly the index. When membership changes, they must buy adds and sell deletes regardless of price.
Concentration in timeReconstitution takes effect on one date (last Friday of June), so the flow is compressed into a few sessions rather than spread out.
Small-cap illiquidityThe Russell 2000's smaller names absorb large flow poorly, so the price impact — and the subsequent mean-reversion/relief bounce — is larger than in large caps.
Pre-positioning unwindArbitrageurs front-run the reconstitution; the unwind of those positions around the effective date adds to the post-rebalance drift.

The edge is a tendency, not a guarantee, and it has weakened as it became widely documented.

The rules live in one pure, date-driven core (russellRebalancingSignalFromBars) that backs both the live strategy state and the backtest adapter, so they can never drift.

Entry

The first trading session strictly after June 23.

Implementation: at the latest bar, entry fires when the session crossed the June-23 boundary since the previous session — i.e. the previous bar's date is on/before June 23 and the current bar's date is after it, in the same calendar year. Because it keys off actual bar dates, it lands on the correct open session regardless of weekends/holidays (usually June 24; June 26 when June 24–25 is a weekend) and fires exactly once per year.

Exit

The first trading session of July.

Implementation: exit fires when the current bar is in July and the previous bar is still in June (same year) — the first July session. It fires once (later July sessions have a July predecessor). Entry and exit are mutually exclusive on any single bar.

Position management

  • One trade per year; flat (in cash) otherwise.
  • No stop-loss, no profit target — the exit is a fixed date. entryPrice/stopLoss/firstTarget/riskPercent/rewardRiskRatio are reported as null (never invented).
  • Holding period: 5 trading sessions in every backtested year.

Deterministic, identical in construction to Santa Claus Rally and Turn of the Month — it uses the shared seasonalConfidence model. confidenceScore is a setup-quality measure (0–100), not a probability of profit.

ComponentMaxAwarded
seasonalWindow6060 when the window is Active (today is inside it), else 0.
windowProximity40Ramps linearly over the 10 calendar days before entry: 40 × (10 − daysUntilEntry) / 10, clamped to [0, 40]. 0 when far away or already finished.
  • Inside the window → 100 (Exceptional).
  • Approaching (≤10 days) → 60-less, rising with proximity (e.g. 5 days out → 20).
  • Far / finished → 0.

Bands (library-wide): <70 Weak · 70–79 Good · 80–89 Strong · 90–100 Exceptional.

The API returns ["Russell reconstitution window is active"] while the window is Active, else []. Operationally:

  • It is on/after the first trading session past June 23.
  • Position entered at that session's close in IWM.
  • No stop or target set — the exit is the date, not a price.
  • Exit at the close of the first July session.
  • Flat (in cash) outside the window.
  • Treat the historical edge as a tendency, not a guarantee — size accordingly.
  • Structural, not predictive. The edge comes from forced, mechanical index flow, not from forecasting news or fundamentals.
  • Objective and fully mechanical. Entry/exit are unambiguous calendar rules — no discretion, no indicator tuning.
  • Minimal market exposure. In the market ~5 sessions per year; in cash ~98% of the time, so tail risk is tightly bounded.
  • Documented, positive-expectancy backtest. 70% win rate, 3.8 profit factor, +1.46% average over 27 real years, shallow 4.5% max drawdown.
  • Non-correlated. A one-week small-cap seasonal sits apart from trend/mean-reversion books.
  • Small, decaying edge. ~1.5% per trade; well known and arbitraged, so future returns may compress.
  • Small sample. One trade/year → 27 observations. Statistically thin; a few years dominate.
  • Macro override risk. 2010 (−4.5%) and 2008 (−2.3%) show a risk-off tape can swamp the flow.
  • No adaptive risk control. A fixed-date exit means no stop; a bad week is taken in full (bounded only by the short hold).
  • Single-asset, single-window. No diversification within the strategy; execution slippage in IWM around a high-volume rebalance close is a real cost the backtest (close-to-close) does not model.
DimensionIdeal
MarketSmall-cap US equities (IWM), normal-to-constructive tape with heavy passive participation and no dominant macro catalyst that week.
TraderPassive, rules-driven, systematic — someone who wants a small, uncorrelated seasonal overlay and will take the trade every year without second-guessing.
TimeframeOne ~5-session window each late June; a calendar overlay, not a standalone book.
Avoid whenA major macro event lands in the window (FOMC, crisis, liquidity shock); when small caps are in a violent independent trend; or when sizing so large that execution slippage around the rebalance close erodes the ~1.5% edge.

API examples

Real responses from the live endpoints for this strategy.

Live strategy

GET /api/strategies?id=russell_rebalancing
GET /api/strategies?id=russell_rebalancing
{
  "strategies": [
    {
      "id": "russell_rebalancing",
      "name": "Russell Rebalancing",
      "category": "Seasonality",
      "asset": "IWM",
      "description": "WHAT IT IS: The Russell Rebalancing strategy captures the seasonal effect created by the annual reconstitution of the FTSE Russell US indices…",
      "historical": {
        "yearsTested": 27,
        "winRate": 0.7037,
        "averageReturn": 1.46,
        "bestYear": 5.51,
        "worstYear": -4.5,
        "maxDrawdown": 4.5,
        "averageHoldingPeriod": 5,
        "profitFactor": 3.8,
        "totalTrades": 27,
        "source": "Internal backtest · IWM daily bars (Yahoo Finance) · 27 annual windows · 2000–2026"
      },
      "historicalPattern": {
        "title": "Russell Rebalancing — average cumulative return across the held window",
        "xLabel": "Trading sessions since entry (0 = first session after June 23, 5 = first session of July / exit)",
        "yLabel": "Average cumulative return (%)",
        "basis": "derived",
        "source": "Internal backtest — 27 completed IWM windows (Yahoo Finance daily closes), 2000–2026",
        "note": "Empirical average path… labelled basis:\"derived\" only because the frozen v1 enum offers no \"empirical\" value.",
        "series": [
          { "day": 0, "label": "Entry", "cumulativeReturn": 0.0 },
          { "day": 1, "label": "+1", "cumulativeReturn": 0.17 },
          { "day": 2, "label": "+2", "cumulativeReturn": 0.44 },
          { "day": 3, "label": "+3", "cumulativeReturn": 0.81 },
          { "day": 4, "label": "+4", "cumulativeReturn": 1.12 },
          { "day": 5, "label": "Exit", "cumulativeReturn": 1.46 }
        ]
      },
      "status": "Active",
      "entryDate": "2026-06-24",
      "exitDate": "2026-07-01",
      "daysUntilEntry": 0,
      "entryPrice": null,
      "stopLoss": null,
      "firstTarget": null,
      "riskPercent": null,
      "rewardRiskRatio": null,
      "confidenceScore": 100,
      "confidenceBreakdown": { "seasonalWindow": 60, "windowProximity": 40 },
      "explanation": "IWM is inside its Russell Rebalancing window (entered 2026-06-24, exits 2026-07-01) — the post-reconstitution bounce period, rating 100/100 as a setup-quality measure (not a probability of profit). Entry is at the close of 2026-06-24; the strategy sets no price stop or target and exits on the fixed date 2026-07-01.",
      "checklist": ["Russell reconstitution window is active"],
      "score": 70,
      "recommended": true,
      "weight": "medium"
    }
  ]
}

Scanner

GET /api/scan?strategy=russell_rebalancing

This is a market-wide calendar strategy, not a per-symbol screen, so /api/scan?strategy=russell_rebalancing returns { "supported": false } with a clear message.

Backtest

GET /api/backtest?strategy=russell_rebalancing
GET /api/backtest?strategy=russell_rebalancing
{
  "strategy": "russell_rebalancing",
  "symbol": "IWM",
  "range": { "requestedFrom": null, "requestedTo": null, "testedFrom": "2000-05-26", "testedTo": "2026-08-04", "barsTested": 6585 },
  "metrics": {
    "totalTrades": 27,
    "winningTrades": 19,
    "losingTrades": 8,
    "winRate": 0.7037,
    "averageReturn": 0.0146,
    "medianReturn": 0.0179,
    "bestTrade": 0.0551,
    "worstTrade": -0.045,
    "averageHoldingPeriod": 5,
    "profitFactor": 3.7998,
    "totalReturn": 0.4654,
    "maxDrawdown": 0.045
  },
  "sampleTrades": [
    { "entryDate": "2026-06-24", "exitDate": "2026-07-01", "entryPrice": 296.69, "exitPrice": 299.32, "return": 0.0089, "holdingDays": 5 }
  ],
  "openTradeEntryDate": null
}

References

  • FTSE Russell — Russell US Indexes Reconstitution methodology and annual reconstitution calendar (recon effective at the close on the last Friday of June).
  • Academic/practitioner literature on the "Russell reconstitution effect" and index-inclusion price pressure (e.g. work following Chen, Noronha & Singal on index changes; Petajisto on index premia).
  • Backtest data: IWM daily OHLCV via Yahoo Finance, 2000–2026 (this repository's market-data layer, lib/market-data/prices.ts).

*Past behaviour does not ensure future results. confidenceScore measures setup quality, not the probability of profit.*