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.
Performance
Real internal-backtest statistics from the registry — Internal backtest · IWM daily bars (Yahoo Finance) · 27 annual windows · 2000–2026.
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.
| Driver | Mechanism |
|---|---|
| Passive replication | Index funds/ETFs must hold exactly the index. When membership changes, they must buy adds and sell deletes regardless of price. |
| Concentration in time | Reconstitution takes effect on one date (last Friday of June), so the flow is compressed into a few sessions rather than spread out. |
| Small-cap illiquidity | The 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 unwind | Arbitrageurs 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/rewardRiskRatioare reported asnull(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.
| Component | Max | Awarded |
|---|---|---|
seasonalWindow | 60 | 60 when the window is Active (today is inside it), else 0. |
windowProximity | 40 | Ramps 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.
| Dimension | Ideal |
|---|---|
| Market | Small-cap US equities (IWM), normal-to-constructive tape with heavy passive participation and no dominant macro catalyst that week. |
| Trader | Passive, rules-driven, systematic — someone who wants a small, uncorrelated seasonal overlay and will take the trade every year without second-guessing. |
| Timeframe | One ~5-session window each late June; a calendar overlay, not a standalone book. |
| Avoid when | A 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{
"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_rebalancingThis 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{
"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.*