Cross-Sectional Sector Momentum Rotation Strategy
Final Project — FinTech 533 | Duke University
Strategy Overview
In this project we have implemented a cross-sectional sector momentum rotation strategy across 11 different sectors that make up the S&P 500. The main idea is that we rank all 11 sectors by their trailing 3-month price return, we go long on the top 3 sectors, and short the bottom 3 sectors. We do this rebalancing every month.
This hypothesis comes from (Jegadeesh & Titman, 1993), which captures the following market phenomenon: Institutional capital rotates slowly and persistently across economic sectors in response to macro cycle shifts. Sectors that have been winning recently tend to continue winning in the near term because institutional flows are slow to adjust.
The 11 sectors in this strategy are: Technology (XLK), Financials (XLF), Energy (XLE), Healthcare (XLV), Industrials (XLI), Consumer Staples (XLP), Consumer Discretionary (XLY), Utilities (XLU), Real Estate (XLRE), Materials (XLB), and Communication Services (XLC).
I did a 2 year backtest period starting in September 2024 until April 2026 with a total of 21 monthly rebalances, the rolling window is 3 months as mentioned.
Entry Orders
How We Enter a Position
On the first trading day of each calendar month, the strategy:
- Computes the 3-month trailing momentum for all 11 sector ETFs
- Ranks all the sectors from strongest (rank 1) to weakest (rank 11)
- Goes long on the top 3 ranked sectors at the market open
- Goes short on the bottom 3 ranked sectors at the market open
Momentum Signal Formula
\[\text{Momentum}_t = \frac{\text{Close}_{t-1}}{\text{Close}_{t-1-63}} - 1\]
The signal uses yesterday’s close (not today’s), this is in order to ensure no lookahead bias, the ranking is fully formed before the market opens on the rebalance date.
Parameter Justification
- Lookback = 63 trading days (~3 months): The 3-month momentum window is the most widely validated in academic literature. I also looked into shorter windows like 1 month, but it mainly capture noise,whereas on the other hand longer windows like 12 months lag the economic cycle too much. 63 trading days = 21 trading days/month × 3 months.
- Top 3 / Bottom 3: With 11 sectors, selecting the top and bottom ~27% gives enough concentration to capture the momentum effect while maintaining minimal diversification across the long and short books.
- 100 shares per leg: I chose 100 shares per trade, because its what we have done until now, but we could definetly improve the strategy by changing this, it makes it easier to compare between trades.
- Entry at open: The momentum signal is observable from the prior day’s close. The open is the first tradeable price after the signal is formed, this is just for the no lookahead I have been mentioning.
Exit Orders
How We Exit a Position
Each position leg has two possible exit possibilities:
| Exit | Description |
|---|---|
| Rebalance | The position is held for the full month, and it is closed at the close of the last trading day of the month |
| Stop-Loss | Position closed early at the daily close on the day the 8% threshold is breached |
Stop-Loss Logic
- Long leg: Exit at close if
close < entry_price × (1 - 0.08) - Short leg: Exit at close if
close > entry_price × (1 + 0.08)
Parameter Justification
- Stop-loss = 8%: Sector ETFs are broadly diversified instruments, where intra-month moves exceeding 8% are rare under normal market conditions and typically signal a structural shift in that sector rather than noise. A loss of this magnitude indicates the momentum thesis for that leg has broken down and continued holding is not justified.
- Monthly hold: Cross-sectional momentum is documented to persist over 1–12 month horizons in research and academia. Monthly rebalancing captures the signal while keeping transaction costs reasonable and makes it easy and stable.
- Exit at close on stop-loss day: Because we use daily (not intraday) data, we conservatively assume the stop-loss fills at the closing price on the breach day. This slightly overstates the loss versus an intraday trigger, which is the correct conservative assumption.
Performance
Monthly Returns — Strategy vs SPY
Drawdown
Rolling 6-Month Sharpe Ratio
Performance Summary
| Metric | Strategy | SPY (Buy & Hold) |
|---|---|---|
| Total Return | 0.89% | 42.69% |
| Annual GMRR | 0.45% | 19.62% |
| Annual Volatility | 4.57% | 16.69% |
| Sharpe Ratio (rf=3.75%) | -0.72 | 0.95 |
| Max Drawdown | ~6.64% | ~19.00% |
Trade Statistics
| Metric | Value |
|---|---|
| Total legs traded | 126 |
| Rebalance exits | 113 (89.7%) |
| Stop-loss exits | 13 (10.3%) |
| Overall win rate | 49.2% |
| Long leg win rate | 58.7% |
| Short leg win rate | 39.7% |
| Avg return per leg | -0.054% |
| Expected P&L per leg | $7.07 |
| Avg holding period | 25.4 days |
Blotter & Ledger
The complete trade log and daily NAV record are available for download below.
⬇ Download Blotter (CSV) ⬇ Download Ledger (CSV)
Sector Analysis
Sector Rotation Heatmap
Each row is a rebalance month. Color shows 3-month momentum score (green = strong, red = weak). ▲ = long position, ▼ = short position.
Monthly Sector Exposure
Average Return by Sector
Long vs Short Decomposition
Trade Return Distribution
Momentum Spread
Alpha / Beta Analysis
Strategy Monitoring
How will we know the strategy is performing in line with expectations?
We monitor two real-time metrics at each monthly rebalance to determine if we should stop at any given moment:
1. Rolling 6-Month Sharpe Ratio : if it drops below 0.5 for three consecutive months, the strategy is underperforming its historical risk-adjusted baseline and requires us to give it a full review to understand what is going on. Maybe this change is caused by a macro regime change, but it might mean we have to adjust the strategy.
2. Momentum Spread (avg momentum of top-3 minus avg momentum of bottom-3), if this spread compresses below 2% for three consecutive months, sectors are moving together and the cross-sectional rotation signal has effectively disappeared. We might have to reduce trading size if this happens
How will we know when the strategy stops working?
We declare the strategy non-functional and we stop trading if any one of these 2 triggers happen:
Momentum reversal: The long portfolio underperforms the short portfolio for 4 consecutive months, this would mean the momentum effect has fully reversed and our hypothesis doesn’t hold anymore.
Win rate collapse: If the leg win rate drops below 40% for 3 consecutive months, if fewer than 2 of 6 legs are profitable per month, this would mean the ranking signal is no longer predictive.
Commentary
Did the strategy work?
Okay so clearly the strategy didn’t work as well as expected, we only got a 0.45% annual GMRR, vs the SPY got 19.62%. So this is a clear underperformance, but when we look at it deeper, we can see that the long book did work, it had a win rate of 58.7%, this means that the strategy is correctly identifying the winners. The signal was present all along, with cross sectional dispersion between sectors consistlently large (8-27% every month).
On the other hand, the short book did not work, thats why the overall strategy failed, the short book had a 39.7% win rate. The long book generated around $4800 in cumulative PnL, wheeras the short book lost roughly -$4000. This erased all of our returns
Why did the short book fail?
So looking a bit deeper as to why the short book failed I believe the following: from 2024 to 2026, we had a very bullish market, since cross sectional momentum is a relative signal, its telling you how the outperfom each other (the ranking). If the market is very bullish, even the bottom 3 might still go up. Shorting these bottom 3 was unprofitable, because the ones with the weakest momentum aren’t necessary equal to negative return in a bull market.
For example, if it had been a bear market we would have had the same issue with the top 3 of the ranking. So i believe that this strategy works better during more volatile market, where there is clear winners and losers. ### The April 2025 event
For example, in April 2025, when Trump announced the Tariffs, all 11 sectors dropped simultaneously and the cross sector correlation spiked towards 1. The long book got hit hard the short book did not compensate. It just shows once again that the strategy is market neutral.
How would we improve the model?
1. Market regime filter: In order to improve the main flaw of this strategy we can do the following: When the SPY is above its 200 day moving average (bull market), the strategy would go long only on the top 3 sectors, and not short on any. Whereas if its below the 200 day moving average, we would run the strategy asn normal, long top 3, short bottom 3. This is where the cross sectional momentum would be the most powerful, we wouldn’t be abadoning the strategy.
2. Inverse-volatility position sizing: Instead of 100 shares per leg, allocate capital so each leg contributes equal risk. High-volatility sectors like Energy currently receive the same share count as low-volatility sectors like Consumer Staples, creating an implicit risk concentration.
4. Transaction cost modeling: Maybe we could aslo add a realistic cost per share (e.g., $0.005) to each leg to assess whether the strategy survives after execution costs.