Captures the small-cap bounce around the annual Russell reconstitution — long IWM from just after June 23 to the first session of July.
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.
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:
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.
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.
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.
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.
entryPrice/stopLoss/firstTarget/riskPercent/rewardRiskRatio are reported as null (never invented).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. |
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:
| 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. |
Real responses from the live endpoints for this 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"
}
]
}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.
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
}lib/market-data/prices.ts).*Past behaviour does not ensure future results. confidenceScore measures setup quality, not the probability of profit.*