A monthly ETF rotation strategy across two parallel sleeves, tested across 60 parameter combinations spanning momentum lookback periods, SPY drawdown filter methods, and sleeve allocation rules. All 60 results reported.
This strategy allocates capital across two independent sleeves each month: a Factor sleeve and a Sector sleeve. At the end of each calendar month, the strategy scores every ETF in each sleeve by its N-month total return. The single top-ranked ETF in each sleeve receives the full sleeve allocation for the following month. This is pure momentum rotation, applied separately to two distinct groups of ETFs.
The Factor sleeve covers four style-factor ETFs: momentum, quality, value, and small-cap. These capture systematic risk premia that have been documented extensively in academic finance literature. The Sector sleeve covers nine SPDR sector ETFs spanning the full S&P 500 industry landscape, from technology to utilities. The two sleeves are designed to capture different dimensions of market leadership at any given point in the economic cycle.
Capital is split between the two sleeves either with a fixed 50/50 allocation (Split A) or dynamically based on the prior month's actual sleeve returns (Split B). Each sleeve's weight equals its prior-month return as a fraction of the total, floored at zero; if both sleeves had negative returns the prior month, the allocation reverts to 50/50. A third dimension tests six methods for filtering out adverse market regimes using SPY as a proxy for broad market health. Monthly filters (F1, F2) check the signal once at the start of the month and hold the position for the full month. Daily filters (F3, F4, F5) check the SPY signal at each day's close and exit or re-enter at the next day's open, allowing intra-month participation when the trend recovers.
The strategy makes no fundamental judgements and no macroeconomic forecasts. It follows momentum mechanically, checks one market regime signal, and rebalances once per month. Execution is assumed at month-end closing prices with no transaction costs or slippage.
All price and total return data is sourced from Compustat Security Daily (comp.secd) via WRDS. Returns are computed using the total return index, calculated as prccd × trfd (the Compustat total return factor), which adjusts closing prices for dividend reinvestment. This ensures returns reflect what an investor actually received, not just price appreciation.
| Ticker | Name | Sleeve | Inception | Rationale |
|---|---|---|---|---|
| MTUM | iShares MSCI USA Momentum Factor | Factor | Nov 2013 | Pure large/mid-cap US momentum exposure |
| QUAL | iShares MSCI USA Quality Factor | Factor | Jul 2013 | High ROE, low leverage, stable earnings growth |
| IWD | iShares Russell 1000 Value | Factor | May 2000 | Broad value factor; longest live history in the sleeve |
| IWM | iShares Russell 2000 | Factor | May 2000 | Small-cap risk premium; diversifies large-cap bias |
| XLK | Technology Select Sector SPDR | Sector | Dec 1998 | Highest-returning sector in the post-GFC cycle |
| XLF | Financial Select Sector SPDR | Sector | Dec 1998 | Rate-sensitive; rotates with the yield curve |
| XLE | Energy Select Sector SPDR | Sector | Dec 1998 | Commodity cycle exposure; low correlation to tech |
| XLV | Health Care Select Sector SPDR | Sector | Dec 1998 | Defensive growth; useful in drawdown regimes |
| XLI | Industrial Select Sector SPDR | Sector | Dec 1998 | Cyclical; tracks manufacturing and capex cycles |
| XLY | Consumer Discretionary SPDR | Sector | Dec 1998 | Consumer cycle bellwether; high beta |
| XLP | Consumer Staples SPDR | Sector | Dec 1998 | Defensive; flight-to-safety rotation target |
| XLU | Utilities Select Sector SPDR | Sector | Dec 1998 | Rate-sensitive defensive; strong in risk-off |
| XLB | Materials Select Sector SPDR | Sector | Dec 1998 | Commodities proxy; inflation-cycle exposure |
The common backtest start date of July 2014 is determined by the latest inception among all 13 ETFs (QUAL, July 2013), plus a 12-month lookback buffer for momentum scoring. SPY is used solely as a drawdown filter signal and benchmark; it is not part of the rotatable universe.
The parameter space spans three independent dimensions. Every combination is evaluated over the identical date range using the same data, so Sharpe ratios and drawdown statistics are directly comparable across the full grid.
At each month-end, every ETF in a sleeve is ranked by its N-month total return. The ETF with the highest score receives the full sleeve allocation for the following month. There is no blending or smoothing across lookback periods. For the total return calculation, the Compustat trfd factor is used throughout.
| ID | Filter Rule (go to cash if…) | Series used |
|---|---|---|
| F0 | No filter — always invested | Baseline |
| F1 | SPY 12-month total return < 0 | Monthly |
| F2 | SPY month-end close < 10-month SMA | Monthly |
| F3 | SPY daily close < 200-day SMA at month-end | Daily |
| F4 | SPY 21-day SMA < 210-day SMA | Daily |
| F5 | SPY 50-day SMA < 200-day SMA (death cross) | Daily |
Monthly filters (F1, F2) are checked once at the start of each month using prior month-end data. If triggered, both sleeves earn 0% for the entire month. Daily filters (F3, F4, F5) are evaluated at each day's close; if triggered, both sleeves exit at that day's close and re-enter when the signal reverses, capturing partial-month returns. No cash interest is applied to idle days in either case. Split A allocates 50/50 between sleeves each month. Split B weights each sleeve proportionally to its prior month's actual return, floored at zero; falls back to 50/50 if both were zero or negative.
Top 10 of 60 combinations sorted by Sharpe ratio. Top-3 rows highlighted. Click any column header to re-sort.
| Rank | Lookback | Filter | Split | CAGR | Sharpe | Calmar | Max DD | Win Rate | % In Mkt |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 1m | F3 Price < 200d SMA | A | 9.45% | 0.813 | 0.56 | -16.98% | 53.2% | 82.2% |
| 2 | 1m | F0 No filter | B | 11.66% | 0.809 | 0.55 | -21.40% | 62.4% | 100.0% |
| 3 | 1m | F3 Price < 200d SMA | B | 9.37% | 0.804 | 0.52 | -17.98% | 56.7% | 82.2% |
| 4 | 1m | F4 1m SMA < 10m SMA | A | 9.27% | 0.779 | 0.42 | -22.23% | 53.2% | 82.7% |
| 5 | 1m | F0 No filter | A | 11.25% | 0.771 | 0.42 | -26.69% | 61.7% | 100.0% |
| 6 | 1m | F4 1m SMA < 10m SMA | B | 8.93% | 0.764 | 0.39 | -23.11% | 53.9% | 82.7% |
| 7 | 1m | F1 12m return < 0 | B | 9.40% | 0.738 | 0.44 | -21.40% | 55.3% | 87.9% |
| 8 | 1m | F1 12m return < 0 | A | 9.33% | 0.733 | 0.45 | -20.50% | 53.9% | 87.9% |
| 9 | 6m | F0 No filter | B | 10.93% | 0.689 | 0.62 | -17.74% | 63.8% | 100.0% |
| 10 | 3m | F0 No filter | A | 10.37% | 0.684 | 0.55 | -18.98% | 62.4% | 100.0% |
The three heatmaps show how Sharpe ratio varies across the (lookback, filter) grid for each split method, plus the cell-wise best across both. Warmer green indicates higher risk-adjusted returns. A robust strategy shows a broad green region, not a single outlier cell.
| 1m | 3m | 6m | 9m | 12m | |
|---|---|---|---|---|---|
| F0 No filter | 0.771 | 0.684 | 0.585 | 0.596 | 0.657 |
| F1 12m return < 0 | 0.733 | 0.612 | 0.491 | 0.485 | 0.534 |
| F2 Price < 10m SMA | 0.644 | 0.539 | 0.258 | 0.278 | 0.331 |
| F3 Price < 200d SMA | 0.813 | 0.666 | 0.401 | 0.390 | 0.501 |
| F4 1m SMA < 10m SMA | 0.779 | 0.635 | 0.376 | 0.359 | 0.443 |
| F5 Death cross (50d<200d) | 0.604 | 0.521 | 0.266 | 0.272 | 0.362 |
| 1m | 3m | 6m | 9m | 12m | |
|---|---|---|---|---|---|
| F0 No filter | 0.809 | 0.585 | 0.689 | 0.643 | 0.615 |
| F1 12m return < 0 | 0.738 | 0.543 | 0.668 | 0.532 | 0.523 |
| F2 Price < 10m SMA | 0.603 | 0.411 | 0.353 | 0.308 | 0.278 |
| F3 Price < 200d SMA | 0.804 | 0.573 | 0.524 | 0.454 | 0.466 |
| F4 1m SMA < 10m SMA | 0.764 | 0.493 | 0.500 | 0.402 | 0.423 |
| F5 Death cross (50d<200d) | 0.564 | 0.383 | 0.362 | 0.335 | 0.347 |
| 1m | 3m | 6m | 9m | 12m | |
|---|---|---|---|---|---|
| F0 No filter | 0.809 | 0.684 | 0.689 | 0.643 | 0.657 |
| F1 12m return < 0 | 0.738 | 0.612 | 0.668 | 0.532 | 0.534 |
| F2 Price < 10m SMA | 0.644 | 0.539 | 0.353 | 0.308 | 0.331 |
| F3 Price < 200d SMA | 0.813 | 0.666 | 0.524 | 0.454 | 0.501 |
| F4 1m SMA < 10m SMA | 0.779 | 0.635 | 0.500 | 0.402 | 0.443 |
| F5 Death cross (50d<200d) | 0.604 | 0.521 | 0.362 | 0.335 | 0.362 |
The highest-Sharpe combination uses a 1-month lookback, price < 200d sma as the drawdown filter, and 50/50 fixed sleeve allocation.
| Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2014 | 0.0% | +3.8% | -3.9% | +1.5% | +0.6% | -0.9% | ||||||
| 2015 | -0.5% | -0.5% | -1.0% | -1.8% | -2.0% | -0.4% | +1.9% | +0.1% | 0.0% | -1.2% | -0.7% | -7.5% |
| 2016 | 0.0% | 0.0% | +1.8% | +5.4% | +0.3% | -0.8% | +1.0% | +1.5% | -0.9% | -3.7% | +9.8% | +3.3% |
| 2017 | +0.8% | +2.2% | -0.3% | +2.3% | +2.9% | -1.2% | +1.3% | +2.2% | +0.0% | -0.1% | +2.1% | +1.7% |
| 2018 | +3.7% | -2.5% | -3.6% | +1.5% | +4.6% | +0.2% | +2.8% | +0.8% | +0.5% | -7.4% | -0.0% | -2.3% |
| 2019 | 0.0% | +2.1% | +1.3% | +5.1% | -6.9% | +3.4% | +0.6% | -0.6% | +1.6% | +2.0% | +4.5% | +3.6% |
| 2020 | -5.8% | -6.6% | -4.7% | 0.0% | -1.0% | +5.2% | +6.4% | +3.4% | -4.6% | -1.0% | +9.5% | +6.6% |
| 2021 | +1.5% | +14.3% | +2.2% | +4.1% | +1.9% | +1.5% | +3.6% | +2.6% | -2.6% | +7.3% | -1.2% | +3.4% |
| 2022 | -2.6% | +3.0% | +1.8% | -1.2% | 0.0% | 0.0% | 0.0% | -1.4% | 0.0% | 0.0% | 0.0% | -2.0% |
| 2023 | -2.1% | -1.9% | -0.7% | +0.8% | -5.5% | +6.2% | +4.2% | -1.7% | -1.2% | -3.6% | +5.7% | +4.5% |
| 2024 | -2.4% | +7.0% | +1.4% | -2.6% | +6.1% | -1.2% | -2.6% | +1.6% | +1.1% | -1.0% | +8.7% | -3.6% |
| 2025 | +3.2% | +0.5% | -2.0% | 0.0% | +2.6% | +6.9% | +2.7% | +2.8% | +2.5% | +2.9% | -1.9% | -0.4% |
| 2026 | +1.0% | +5.1% | -6.2% |
Performance across distinct SPY trend regimes over the backtest period.
| Regime | Period | Strategy | SPY | Relative |
|---|---|---|---|---|
| Volatile bull / oil shock | 2014-01 to 2016-02 | -12.2% | +2.0% | Underperform |
| Bull market | 2016-03 to 2018-09 | +47.0% | +58.4% | Underperform |
| Q4 2018 selloff | 2018-10 to 2019-01 | -9.6% | -6.6% | Underperform |
| Late-cycle rally | 2019-02 to 2020-01 | +10.4% | +21.4% | Underperform |
| COVID crash | 2020-02 to 2020-03 | -11.0% | -19.4% | Outperform |
| Post-COVID recovery | 2020-04 to 2021-12 | +83.0% | +89.1% | Underperform |
| 2022 rate shock bear | 2022-01 to 2022-10 | -0.5% | -17.7% | Outperform |
| Rate normalisation rally | 2022-11 to 2024-12 | +14.4% | +56.8% | Underperform |
All three series evaluated over the identical period: July 2014 to March 2026. Equal-weight buy-and-hold is rebalanced monthly across all 13 ETFs in the universe.
| Strategy | Total Ret | CAGR | Sharpe | Calmar | Max DD | Win Rate | Best Yr | Worst Yr |
|---|---|---|---|---|---|---|---|---|
| Best Combo (L1, F3, A) | 189.0% | 9.45% | 0.813 | 0.56 | -16.98% | 53.2% | 44.8% | -13.0% |
| SPY Buy-and-Hold | 294.2% | 12.38% | 0.868 | 0.52 | -23.93% | 68.1% | 31.2% | -18.2% |
| Equal-Weight B&H | 176.0% | 9.03% | 0.630 | 0.39 | -23.39% | 66.7% | 27.9% | -8.9% |
Across 60 parameter combinations, momentum-based ETF rotation produces Sharpe ratios ranging from 0.26 to 0.81 over the 2014–2026 period. The top combinations approach but do not exceed SPY's Sharpe ratio of 0.868. Short lookback periods (1 month) dominate the top of the ranking; longer windows of 6 months or more produce markedly weaker results over this period. The inclusion of daily drawdown filters (F3, F4) meaningfully reduces maximum drawdown, particularly during the 2022 bear market, while preserving most of the upside through intra-month re-entry. The difference between Split A and Split B is modest, suggesting that the rotation signal itself matters more than the weighting rule between sleeves.
This strategy is suited to an investor who wants systematic, rules-based exposure to relative equity strength without individual stock selection. It requires monthly attention and tolerance for periods of full cash when filters trigger. The results presented here should not be extrapolated without accounting for the data mining, short live-history, and execution-timing caveats described above. Walk-forward or out-of-sample testing on data after 2024 would be the appropriate next step before any live implementation.