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
- 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
- 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.
- 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.
| Measure | Plain | 10-month trend filter |
|---|---|---|
| CAGR | 11.0% | 8.5% |
| Volatility (annualized) | 15.2% | 11.5% |
| Maximum drawdown | -50.8% | -26.4% |
| Sharpe ratio | 0.77 | 0.77 |
| Growth of $10,000 | $699,226 | $269,835 |
| Months in cash | 0 | 106 of 487 (22%) |
| Changes in or out, per year | none | 1.5 |
| Whipsaws | none | 22 |
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.
| Choice | How it is computed | In the code |
|---|---|---|
| Data | Monthly total returns (dividends reinvested). Funds younger than the period shown are extended backward with older funds, spliced on returns, not prices. | |
| Window | The 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 streams | A 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 filter | The 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 filtered | The 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 |
| Signal | The 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 |
| Timing | Decided 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 taxes | Out 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 |
| Window | Plain 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 |
| Whipsaw | An 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-check | An 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 functions | The 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
| Approach | What decides | When it helps | What it costs |
|---|---|---|---|
| Buy and hold | Nothing | Rising markets and quick recoveries | Takes every bear market in full |
| 10-month trend filter (whole portfolio) | The portfolio's value against its own 10-month average | Long, slow declines | Whipsaws, missed rebounds, cash drag |
| Time-series momentum | The sign of the trailing 12-month return | Long, slow declines | Similar to the moving-average filter; reacts at a different pace |
| Momentum rotation | Which holding has the strongest trailing return | Persistent leadership by one asset | Turnover and concentration in one or a few holdings |
| Rebalancing to fixed weights | The calendar | Mean-reverting markets | Buys more of what keeps falling in a long decline |
| Holding more bonds | A fixed mix | Stock crashes when bonds rise | Lower 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
- Faber, M. T. (2007) A Quantitative Approach to Tactical Asset Allocation. Journal of Wealth Management 9(4). The 10-month moving-average timing model.
- 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.
- Siegel, J. J. (1994) Stocks for the Long Run. McGraw-Hill. Tests a 200-day moving-average rule and the effect of transaction costs.
- Moskowitz, T. J., Ooi, Y. H. and Pedersen, L. H. (2012) Time Series Momentum. Journal of Financial Economics 104(2).
- 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.