The 10-month trend filter: how it works, what it costs, whipsaws

On this page

Key takeaways

  • The rule: at each month-end, compare the portfolio's value with the average of its last 10 month-end values. Above the average, stay invested next month; at or below it, hold cash next month.
  • The filter's purpose is to step aside during long, deep declines. In the worst bear markets it has cut the depth of the fall sharply, because those declines unfold over many months.
  • The cost comes in rising and choppy markets: exits that reverse within a few months (whipsaws), the gains missed while in cash, and buying back in at a higher level. Over long windows that usually means a lower growth rate than simply holding.
  • Volatility and drawdowns fall more than return, so the risk-adjusted result is often similar to holding, sometimes better, sometimes worse, depending on the window.
  • MarketHeist applies the filter to the whole portfolio's value, decides at month-end, acts in the next month, and earns nothing on cash, with no trading costs, the same rule as its trend-filter pages and the app's overlay.

Definition

A trend-following filter holds an investment only while its price, or a portfolio's value, is above its own moving average, and moves to cash when it falls below. The most widely cited version, popularised by Mebane Faber in 2007, checks the 10-month simple moving average once a month, which is close to the 200-day average traders watch.

Also known as: 10-month moving average rule, 200-day moving average, Faber trend following, market timing with a moving average, trend filter whipsaws, tactical asset allocation timing model, SMA filter.

How it works

Build the portfolio's value month by month, with its own rebalancing. At the end of each month, average the last 10 month-end values. If the latest value is above that average, the trend is up and the portfolio is held for the coming month; otherwise the money sits in cash for the coming month. Nothing is decided inside a month, and the decision only uses prices that were known when it was made.

The rule works when declines are slow. A bear market such as 2000 to 2002 or 2008 takes many months to unfold, so the value crosses below its average early in the fall, and the filter spends most of the decline in cash. It works poorly when declines are fast and reverse quickly, such as the October 1987 crash or the March 2020 sell-off: by the time the monthly check fires, much of the fall has happened, and the rebound can start while the money is still out.

In a bull market the filter is mostly invested, and its cost comes from the exceptions. A short dip pushes the value under its average, the filter sells, the market recovers within a month or two, and the filter buys back at a higher level than it sold. That round trip is a whipsaw. A run of them in a choppy but rising market is the main way a trend filter loses ground to holding.

A trend filter is like an umbrella you open whenever it has been raining for a while: in a long storm it keeps you dry, but in a day of passing showers you spend the afternoon opening and closing it and get wet anyway.

The window is a trade-off. A shorter average reacts faster to a real decline but whipsaws more; a longer one whipsaws less but gets out later and back in later. Faber published the 10-month version; MarketHeist's trend-filter pages also show 6 and 12 months so the sensitivity to the choice is visible, and the lab here lets you slide it.

Formula

The portfolio's value and its N-month average
Lt=∏s=1t(1+rs),At=1N∑k=0N−1Lt−k
rₛ
the portfolio's monthly total return in month s
Lₜ
the portfolio's value at the end of month t (growth of 1)
Aₜ
simple moving average of the last N month-end values, month t included
N
window in months: 10 in Faber's rule
The signal and the filtered return (one-month delay, cash at zero)
st={1Lt/At>10otherwise,rt+1filt=st·rt+1
sₜ
the decision taken at the end of month t: 1 = hold the portfolio next month, 0 = cash
rₜ₊₁ᶠⁱˡᵗ
the filtered portfolio's return in month t + 1

The decision at the end of month t applies to month t + 1, so a month's return never decides whether that same month is held. Cash earns 0 here; a version with Treasury bills in place of cash earns a little more in the months out.

Activity: time invested, switches and whipsaws
in market=1T∑t=1Tst,switches per year=12·#{t:st≠st−1}T
T
number of months in the window
#{…}
count of months where the state changed from the month before

A whipsaw is a stretch out of the market of at most three months, with invested months on both sides inside the window, during which the plain portfolio rose: an exit that was reversed and cost the gain it sat out.

Worked example

The S&P 500 (SPY, extended back with its index mutual fund), with and without the 10-month filter, from Mar 1986 to Sep 2026, about 41 years.

Held without a filter, the S&P 500 grew 11.0% a year, and its worst decline from a peak was -50.8%. With the filter, growth was 8.5% a year and the worst decline -26.4%: roughly half the worst loss, paid for with 2.6% a year of growth.

That cost builds up in rising markets, which is where traders feel it. The filter was invested in 78.2% of months and spent 106 months in cash. It changed between invested and cash 1.5 times a year, and 22 of its exits were whipsaws: out for three months or less while the S&P 500 rose, then back in at a higher level.

Risk fell about as much as return. Volatility dropped from 15.2% to 11.5%, and the Sharpe ratio, return per unit of volatility at a zero risk-free rate, was 0.77 without the filter and 0.77 with it, close to the same. The filter changed the kind of ride, not the reward per unit of risk.

The cash in this test earns nothing. With Treasury bills earning interest in the months out, as on the S&P 500 trend-filter page, part of the gap closes, and that page also shows what the 6- and 12-month windows did.

Data through Sep 2026. Reproduce id 03a6d054e39ff001 (this guide, its lab setup and the data month).

Interactive lab

Growth of $10,000 with and without the trend filter, the months the filter spent in cash shaded, and the table of return, volatility, drawdown, Sharpe ratio, switches and whipsaws. Slide the window or switch portfolios.

Growth of $10,000, plain and with a 10-month trend filter: S&P 500 (100%)S&P 500 (100%), Mar 1986 to Sep 2026. The book is held while its value is above its 10-month average and sits in cash otherwise (cash earns 0). $10,000 grows to $699,226 plain and $269,835 filtered. The filter spent 106 of 487 months in cash. In cash: 1986-10; 1987-01; 1987-11 to 1988-06; 1990-02 to 1990-03; 1990-05; 1990-09 to 1990-12; 1991-12; 1994-04 to 1994-07; 1994-12; 1998-09 to 1998-10; 1999-10; 2000-10 to 2002-03; 2002-05 to 2003-04; 2004-09; 2008-01 to 2009-06; 2010-07; 2010-09; 2011-09 to 2012-01; 2015-09 to 2015-10; 2016-02 to 2016-03; 2018-11; 2019-01 to 2019-02; 2019-06; 2020-03 to 2020-05; 2022-03; 2022-05 to 2022-11; 2023-01; 2023-11; 2025-04 to 2025-05; 2026-04.$10k$20k$50k$100k$200k$500k1986199219982004201020162022Plain10-month filterIn cash
Growth of $10,000 on a log scale. Shaded: the months the 10-month filter sat in cash. Mar 1986 to Sep 2026.
MeasurePlain10-month trend filter
CAGR11.0%8.5%
Volatility (annualized)15.2%11.5%
Maximum drawdown-50.8%-26.4%
Sharpe ratio0.770.77
Growth of $10,000$699,226$269,835
Months in cash0106 of 487 (22%)
Changes in or out, per yearnone1.5
Whipsawsnone22

Risk-free rate 0; cash earns 0. A whipsaw is a stretch of at most three months in cash, between two months invested, during which the plain book gained. Mar 1986 to Sep 2026.

How MarketHeist computes it

Every choice an implementation has to make, as the code makes it today. The page is checked against the code each time it is built.

ChoiceHow it is computedIn the code
DataMonthly total returns (dividends reinvested). Funds younger than the period shown are extended backward with older funds, spliced on returns, not prices.
WindowThe worked example and the lab compare the plain book and the filtered book over the same Mar 1986 to Sep 2026 (487 months), which starts once the longest of the 6, 10 and 12-month filters has its first signal, so the window does not move when the filter length does.
Portfolio streamsA fund is its proxy-extended monthly return stream. A built-in portfolio is read as the MarketHeist MCP reads it: its composed stream with its own rebalancing rule and overlay. A custom mix is rebalanced yearly.
Trend filterThe book's value is rebased to 1 at its start. At each month-end the filter is invested when that value is above its average over the last N month-ends, and holds cash otherwise; the decision applies to the following month and cash earns 0. A whipsaw is a stretch of at most three months in cash, between two months invested, during which the plain book gained.
What is filteredThe whole portfolio's monthly total return series, composed first with its own rebalancing rule; the filter then switches the entire book between invested and cash. It never times individual holdings.applyPortfolioOverlaypackages/portfolio/engine/overlay.ts
SignalThe portfolio's value (cumulative product of 1 + monthly return) divided by its simple moving average over the last N month-end values, month t included. Invested when that ratio is strictly above 1, otherwise cash. Run by the backtest engine as a 1-month versus N-month moving-average crossover with a threshold of 1.overlayToBacktestConfigpackages/portfolio/engine/overlay.ts
TimingDecided at month-end t and applied to month t + 1's return (an execution delay of one month). The first N + 1 months of the portfolio are warm-up and have no filtered return.trendSignalpackages/portfolio/engine/overlay-activity.ts
Cash, costs and taxesOut of the market the return is exactly 0: no interest, no trading costs, no taxes. The trend-filter pages add a Treasury-bill cash variant for comparison; this page and the app's overlay use 0.checkOverlayConsistencypackages/portfolio/engine/overlay-activity.ts
WindowPlain and filtered are measured over the same months, starting after a 12-month warm-up whatever N is, so with N = 6, 10 or 12 the figures equal those on the portfolio's trend-filter page.OVERLAY_ANCHOR_MONTHScontent-engine/lab/compute.ts
WhipsawAn out-of-market stretch of at most 3 months, bounded by invested months on both sides inside the window, during which the plain portfolio's compounded return was positive. Switches count every change between invested and cash; the starting state is not a switch.WHIPSAW_MAX_MONTHSpackages/portfolio/engine/overlay-activity.ts
Cross-checkAn independent recomputation of the in/out state is compared with the engine's filtered returns month by month; a page or lab whose two disagree is refused.checkOverlayConsistencypackages/portfolio/engine/overlay-activity.ts
Engine functionsThe functions the portfolio app and the MarketHeist MCP tools run, called here on the same monthly returns.applyPortfolioOverlaypackages/portfolio/engine/overlay.tstrendSignalpackages/portfolio/engine/overlay-activity.tsoverlayActivitypackages/portfolio/engine/overlay-activity.tsmetricsFromReturnspackages/portfolio/engine/portfolio.ts

Trend-following filter (10-month moving average) compared with its neighbours

A trend filter compared with other ways to manage a portfolio's downside
ApproachWhat decidesWhen it helpsWhat it costs
Buy and holdNothingRising markets and quick recoveriesTakes every bear market in full
10-month trend filter (whole portfolio)The portfolio's value against its own 10-month averageLong, slow declinesWhipsaws, missed rebounds, cash drag
Time-series momentumThe sign of the trailing 12-month returnLong, slow declinesSimilar to the moving-average filter; reacts at a different pace
Momentum rotationWhich holding has the strongest trailing returnPersistent leadership by one assetTurnover and concentration in one or a few holdings
Rebalancing to fixed weightsThe calendarMean-reverting marketsBuys more of what keeps falling in a long decline
Holding more bondsA fixed mixStock crashes when bonds riseLower long-run growth; both can fall together

Limitations

  • The result depends on the window chosen and on the period tested. A rule tuned to the past, such as a window picked because it looked good, tends to do worse on new data; MarketHeist's pages fix the window in advance and show neighbours.
  • Fast crashes defeat a monthly check. A fall that happens inside a month, or a V-shaped recovery, is mostly taken in full on the way down and partly missed on the way up.
  • The test ignores trading costs, bid-ask spreads and taxes. In a taxable account every exit can realise gains, which can cost more than the filter saves.
  • Cash earns 0 here. In periods of high interest rates that understates the filtered portfolio's return in the months out.
  • The figures describe one historical path. Long histories are extended backward with older funds or indexes, and a filter's record rests on a small number of large declines, so a few events dominate the outcome.

Frequently asked questions

How much does a trend filter cost in a bull market?
In a steady bull market the filter is invested most of the time, and the cost comes from whipsaws: short exits after a dip that reverse within a few months, each one selling low and buying back higher, plus the months sitting in cash while the market rises. The worked example on this page counts the whipsaws and the yearly cost over the whole window; the S&P 500 trend-filter page breaks the result down by decline and by year.
Is the 10-month moving average the same as the 200-day moving average?
Close. Ten months is about 210 trading days, and both are long-term trend measures. The 10-month version is checked once a month on month-end values, so it trades less often than a daily 200-day rule and reacts a little later. The daily rule on SPY, with other windows and trading costs, is tested on the 200-day moving average robustness page.
What is a whipsaw in trend following?
An exit that turns out to be wrong quickly: the filter sells after a dip, the market recovers, and the filter buys back at a higher level. MarketHeist counts an out-of-market stretch of at most three months, reversed inside the window, during which the plain portfolio rose.
Why does the filter not avoid crashes like 1987 or 2020?
Because it checks once a month and needs the value to fall below a 10-month average first. A crash that happens within a few weeks is mostly over by the next check, and a fast recovery can begin while the filter is still in cash.
Did Faber apply the rule to a whole portfolio?
Faber's paper applied the 10-month rule to each asset class separately, holding each one's slice in cash when that asset was below its own average. MarketHeist's overlay applies the same rule to the whole portfolio's value at once, which switches the entire book together; its trend-timing strategy applies it to the US stock market.
Does a trend filter improve risk-adjusted returns?
Sometimes. It usually cuts volatility and the worst drawdown and gives up some growth, so the Sharpe ratio moves little; whether it rises or falls depends on the portfolio and the period. Portfolios that already have shallow drawdowns have less for a filter to protect.

References

  1. Faber, M. T. (2007) A Quantitative Approach to Tactical Asset Allocation. Journal of Wealth Management 9(4). The 10-month moving-average timing model.
  2. Brock, W., Lakonishok, J. and LeBaron, B. (1992) Simple Technical Trading Rules and the Stochastic Properties of Stock Returns. Journal of Finance 47(5). Moving-average rules on the Dow Jones index.
  3. Siegel, J. J. (1994) Stocks for the Long Run. McGraw-Hill. Tests a 200-day moving-average rule and the effect of transaction costs.
  4. Moskowitz, T. J., Ooi, Y. H. and Pedersen, L. H. (2012) Time Series Momentum. Journal of Financial Economics 104(2).
  5. Hurst, B., Ooi, Y. H. and Pedersen, L. H. (2017) A Century of Evidence on Trend-Following Investing. Journal of Portfolio Management 44(1).

Try it on your own holdings

See the S&P 500 with a 10-month trend filter, decline by decline →

Or ask an assistant connected to the MarketHeist MCP server (https://marketheist.io/mcp), which computes the same figures:

Using MarketHeist.io, what did a 10-month moving-average trend filter do to the S&P 500 since 1986: how much annual return did it give up, how many whipsaws did it have, and how much did it reduce the worst drawdown?

Ask an AI assistant

The prompt opens in a new tab, already filled in. An assistant without the MarketHeist connector answers from its own knowledge, not from the figures on this page.

Historical simulation, not advice. Computed by the MarketHeist portfolio engine from monthly total returns, data through Sep 2026. Markdown version of this page: trend-filter.md.