Cyclical Sector Timing: Revenue Growth as a Signal for Basic

Growth of $10,000 in Cyclical Sector Timing vs S&P 500, US (NYSE + NASDAQ + AMEX), 2001-2024

Cyclical Sector Timing: A Revenue Growth Signal for Basic Materials, Industrials, Energy, and Consumer Cyclical

The strategy lost only 34.3% of what the market lost in down periods over 24 years, while staying in the market most of the time.

Contents

  1. Method
  2. What Research Shows
  3. The Screen
  4. Signal Check (Is the expansion on?)
  5. Stock Selection (When signal is on)
  6. Results
  7. When It Works
  8. 2001-2009: Eight of nine years outperformed
  9. 2020: Post-COVID recovery
  10. 2021 cash: The correct call
  11. When It Fails
  12. 2010-2024: The AI/tech era
  13. 2010 and 2016 cash: Both were wrong
  14. Full Annual Returns
  15. Limitations
  16. Run It Yourself

That's the headline stat for cyclical sector timing on US stocks (NYSE + NASDAQ + AMEX), 2001-2024. The portfolio returned 8.04% annually vs 8.89% for SPY, with a max drawdown of -32.96% against SPY's -36.27%. It underperformed on raw CAGR, but the risk story is meaningful. Beta of 0.647, down capture of 34.3%, three deliberate cash periods.

The current signal: CONTRACTION. As of March 2026, only 16.7% of US cyclical companies show positive year-over-year revenue growth. The strategy is in cash.


Method

Parameter Value
Universe NYSE + NASDAQ + AMEX
Sectors Basic Materials, Industrials, Energy, Consumer Cyclical
Signal ≥ 50% of cyclical stocks with positive YoY FY revenue growth
Selection Top 30 by ROE, among stocks with positive revenue growth AND ROE ≥ 5%
Rebalancing Annual (July)
Period 2001–2024 (24 years)
Data lag 45 days after fiscal year-end
Min stocks 10
Max stocks 30
Weighting Equal weight
Transaction costs Size-tiered (0.1% / 0.3% / 0.5%), one-way
Data source Ceta Research (FMP financial data warehouse)

Cash rule: hold cash (no position) if the expansion signal is off OR fewer than 10 stocks qualify.


What Research Shows

The academic case for cyclical sector timing rests on business cycle theory. Korajczyk and Sadka (2004) demonstrated that expected returns in cyclical industries vary predictably with the economic cycle. Mitchell and Burns (1938) at the National Bureau of Economic Research established that industrial production (a direct proxy for cyclical sector revenue growth) leads stock returns. The timing logic follows directly: when most companies in cyclical sectors show revenue growth, the expansion phase is confirmed. When revenue growth stalls across the sector, contraction risk is elevated.

Fama and French (1989) showed that business conditions predict expected returns in the time series. Dividend yields and default spreads, which move with the business cycle, forecast excess stock returns. Revenue growth operates as a similar real-economy signal: it's observable, point-in-time, and captures the same expansion-contraction dynamic.

The ROE selection layer adds a quality screen within the cyclical universe. Among companies already showing revenue growth, high ROE identifies those generating the most return on invested capital. This is consistent with Novy-Marx (2013), who found that gross profitability (a related quality measure) predicts returns even after controlling for the value factor.


The Screen

Signal Check (Is the expansion on?)

Run this to check the current state of the US cyclical expansion signal:

WITH rev_growth AS (
 SELECT
 p.symbol,
 p.exchange,
 p.sector,
 i.revenue,
 LAG(i.revenue) OVER (PARTITION BY i.symbol ORDER BY i.calendarYear) AS prev_rev,
 i.calendarYear
 FROM income_statement i
 JOIN profile p ON i.symbol = p.symbol
 WHERE p.sector IN ('Basic Materials', 'Industrials', 'Energy', 'Consumer Cyclical')
 AND p.exchange IN ('NYSE', 'NASDAQ', 'AMEX')
 AND i.period = 'FY'
 AND p.isActivelyTrading = true
 AND i.revenue IS NOT NULL
 AND i.calendarYear >= EXTRACT(YEAR FROM CURRENT_DATE) - 3
),
latest AS (
 SELECT symbol,
 revenue,
 prev_rev,
 calendarYear,
 CASE WHEN prev_rev > 0 AND revenue > prev_rev THEN 1 ELSE 0 END AS growing,
 ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY calendarYear DESC) AS rn
 FROM rev_growth
 WHERE prev_rev IS NOT NULL
)
SELECT
 COUNT(*) AS total_stocks,
 SUM(growing) AS growing_count,
 ROUND(100.0 * SUM(growing) / COUNT(*), 1) AS pct_growing,
 CASE WHEN 100.0 * SUM(growing) / COUNT(*) >= 50 THEN 'EXPANSION - INVEST' ELSE 'CONTRACTION - CASH' END AS signal
FROM latest
WHERE rn = 1

View current signal: cetaresearch.com/data-explorer?q=2KL65Exb2W

Stock Selection (When signal is on)

When the expansion signal fires, this screen selects the top 30 stocks by ROE:

WITH rev_growth AS (
 SELECT
 i.symbol,
 i.revenue,
 LAG(i.revenue) OVER (PARTITION BY i.symbol ORDER BY i.calendarYear) AS prev_rev,
 i.calendarYear,
 ROW_NUMBER() OVER (PARTITION BY i.symbol ORDER BY i.calendarYear DESC) AS rn
 FROM income_statement i
 WHERE i.period = 'FY'
),
latest_rev AS (
 SELECT symbol, revenue, prev_rev
 FROM rev_growth
 WHERE rn = 1
 AND prev_rev > 0
 AND revenue > prev_rev
),
latest_metrics AS (
 SELECT
 k.symbol,
 k.returnOnEquityTTM AS roe,
 k.marketCap,
 ROW_NUMBER() OVER (PARTITION BY k.symbol ORDER BY k.date DESC) AS rn
 FROM key_metrics_ttm k
),
qualified AS (
 SELECT
 lr.symbol,
 p.companyName,
 p.sector,
 p.exchange,
 ROUND(lm.roe * 100, 2) AS roe_pct,
 ROUND(lm.marketCap / 1e9, 2) AS mktcap_b
 FROM latest_rev lr
 JOIN profile p ON lr.symbol = p.symbol
 JOIN latest_metrics lm ON lr.symbol = lm.symbol AND lm.rn = 1
 WHERE p.sector IN ('Basic Materials', 'Industrials', 'Energy', 'Consumer Cyclical')
 AND p.exchange IN ('NYSE', 'NASDAQ', 'AMEX')
 AND p.isActivelyTrading = true
 AND lm.roe >= 0.05
 AND lm.marketCap > 300000000
)
SELECT *
FROM qualified
ORDER BY roe_pct DESC
LIMIT 30

View current screen: cetaresearch.com/data-explorer?q=Y5QuSNOuj7


Results

Metric Portfolio SPY
CAGR (2001–2024) 8.04% 8.89%
Excess CAGR -0.86%
Max drawdown -32.96% -36.27%
Sharpe ratio 0.304
Sortino ratio 0.72
Beta 0.647 1.0
Alpha 1.57%
Down capture 34.34% 100%
Up capture 82.57% 100%
Cash periods 3 of 24 (12%)
Avg stocks held 24.7

The 34.3% down capture is the defining number. When SPY had a losing year, this portfolio on average lost only a third as much. That combination with 82.6% up capture produces a risk-adjusted profile that holds up across market cycles, even when raw CAGR trails the index.

The negative excess CAGR (-0.86%) reflects the period breakdown. The strategy dominated in 2001-2009 and struggled in 2010-2024 when AI and tech drove markets. More on that below.


When It Works

2001-2009: Eight of nine years outperformed

The commodity supercycle of the early 2000s was exactly the environment this strategy was built for. Basic materials and energy expanded through the China demand boom. Revenue growth was broad-based across cyclical sectors. The strategy was invested and picking the highest-ROE names in expanding industries.

Year Portfolio SPY Excess
2001 +10.8% -20.8% +31.6%
2003 +34.8% +16.4% +18.4%
2004 +44.1% +7.9% +36.2%
2005 +22.2% +8.9% +13.4%
2006 +37.0% +20.9% +16.1%

2001 is the standout. The strategy went into that year with cyclical stocks already showing expansion signals from the late 1990s industrial build-out. While the S&P 500 fell 20.8% as the dot-com bubble deflated, cyclical quality names delivered +10.8%.

2004 is the commodity surge year: +44.1% as energy and materials companies posted explosive revenue growth on the back of rising oil and metal prices.

2020: Post-COVID recovery

2020 was the best year in the second half of the backtest: +49.9% vs +40.7% for SPY. After the March 2020 crash, cyclical companies with strong balance sheets recovered fastest. The signal correctly identified broad revenue recovery, and the ROE screen captured the quality operators who came out of the crisis in the strongest position.

2021 cash: The correct call

The strategy went to cash in July 2021. Over the next year (through July 2022), the S&P 500 fell 10.2% as interest rate fears and inflation hit growth stocks. This was the only cash call of the three that correctly avoided a down market.


When It Fails

2010-2024: The AI/tech era

After 2009, US market returns increasingly concentrated in technology and mega-cap growth stocks. Cyclical sectors expanded, but their revenue growth underperformed the broad market's appreciation. The strategy stayed invested in industrials and materials while SPY was being lifted by Apple, Microsoft, and Nvidia.

Year Portfolio SPY Excess
2015 -16.9% +3.4% -20.2%
2019 -14.4% +7.1% -21.5%
2023 -5.7% +24.6% -30.3%
2024 -3.9% +14.7% -18.6%

2023 is the worst year: -30.3% excess. The strategy held cyclical stocks while the S&P 500 surged on AI enthusiasm. This isn't a signal failure. The expansion signal was on, cyclical stocks did expand, but the market allocated its premium to a narrow set of tech names.

2010 and 2016 cash: Both were wrong

Two of the three cash calls were missed rallies: - 2010 (CASH): SPY returned +32.9%. Missing this hurt. - 2016 (CASH): SPY returned +17.7%. Another missed rally.

The signal flagged contraction. In both cases, the broad economy recovered faster than cyclical sector revenue growth suggested. The 2010 miss is the most painful. It came right after the strong 2008-2009 run and erased some of the accumulated edge.


Full Annual Returns

All returns are July-to-July periods. A "2021 CASH" year means the strategy held cash from July 2021 to July 2022.

Year Portfolio SPY Excess
2001 +10.8% -20.8% +31.6%
2002 +7.1% +3.3% +3.8%
2003 +34.8% +16.4% +18.4%
2004 +44.1% +7.9% +36.2%
2005 +22.2% +8.9% +13.4%
2006 +37.0% +20.9% +16.1%
2007 -8.0% -13.7% +5.7%
2008 -27.1% -26.1% -1.0%
2009 +25.9% +13.4% +12.5%
2010 0.0% (CASH) +32.9% -32.9%
2011 -1.1% +4.1% -5.2%
2012 +31.2% +20.9% +10.3%
2013 +21.2% +24.5% -3.3%
2014 +3.5% +7.4% -3.9%
2015 -16.9% +3.4% -20.2%
2016 0.0% (CASH) +17.7% -17.7%
2017 +11.9% +14.3% -2.4%
2018 +6.0% +10.9% -4.9%
2019 -14.4% +7.1% -21.5%
2020 +49.9% +40.7% +9.2%
2021 0.0% (CASH) -10.2% +10.2%
2022 +5.0% +18.3% -13.3%
2023 -5.7% +24.6% -30.3%
2024 -3.9% +14.7% -18.6%

SPY returns are July-to-July periods to match rebalancing dates.


Limitations

  • Survivorship bias. The universe is current active stocks with available FMP data. Companies delisted between 2001 and 2024 are underrepresented. This likely flatters the early-period results modestly.
  • Revenue growth as a lagging indicator. FY revenue data with a 45-day lag can be 12-16 months old at rebalancing. The signal captures past expansion, not current momentum.
  • Tech era underperformance is structural. From 2010 onward, US market returns concentrated in sectors not covered by this strategy (Technology, Communication Services). Unless the next cycle rotates back to cyclical leadership, the structural drag remains.
  • Three cash calls: two were wrong. The signal missed the 2010 and 2016 rallies. The method has limited precision at calling turning points. It identifies broad contraction, not the precise inflection.
  • Energy P/E distortion. For strategies that use P/E signals (like sector-06-pe-compression), energy earnings collapses during downturns create signal distortion. This strategy uses revenue growth, not P/E, which partially avoids that problem, but energy revenue can also collapse in commodity downturns, creating similar signal suppression.

Part of a Series: Global | UK | Switzerland | Sweden | India | Germany | Canada | Australia

Run It Yourself

Current signal (March 2026): CONTRACTION

Only 16.7% of US cyclical companies show positive year-over-year revenue growth. The strategy is in cash. The bar is 50%. We're far from it.

Check the live signal: cetaresearch.com/data-explorer?q=2KL65Exb2W

Run the stock screen (for when signal returns): cetaresearch.com/data-explorer?q=Y5QuSNOuj7

Full backtest code: github.com/ceta-research/backtests/tree/main/cyclical-timing


Data: Ceta Research (FMP financial data warehouse). Universe: NYSE + NASDAQ + AMEX cyclical sectors. Period: 2001-2024, annual rebalance (July), 45-day data lag. Past performance doesn't guarantee future results. This is educational content, not investment advice.

Read more