Moving Average Crossover Ensemble
Instead of betting on one fast and slow moving average pair, run many pairs at once and average their signals, which keeps the trend edge while removing the luck of a single parameter choice.
Thesis (edge)
A moving average crossover says: when the recent average price is above the longer average price, the market is trending up, so be long. It is the oldest systematic rule in the book and it still works, but it has one embarrassing weakness. If you test 20/100 and it looks great, and 25/100 looks mediocre, you have learned almost nothing about trends. You have learned that history happened to be kind to one pair of numbers.
The ensemble fix is to stop choosing. Run several pairs covering different speeds, convert each into a position, then average them. The result is a strategy whose performance is close to the average of all reasonable parameter choices rather than the best one, which is a far more honest estimate of what you will actually get going forward.
There is a second benefit that is not just about honesty. Different speeds catch different trends. A fast pair catches a two-month move in natural gas that a slow pair sleeps through. A slow pair rides a two-year bond bear market that a fast pair keeps getting shaken out of. Blending them gives a book that participates in both, and the sub-signals are far from perfectly correlated, so the blend is genuinely smoother.
Where it works (regimes)
Same broad answer as any trend system: it needs markets that move and keep moving. The ensemble's specific advantage shows up in mixed regimes, where some markets are trending fast and others slowly. It also protects you from the year where your one chosen pair happens to be exactly out of phase with the market.
It does not rescue you from a genuinely trendless year. If nothing moves anywhere, every speed loses a little, and averaging losses still leaves a loss.
Signals
- Take a fast average and a slow average of price. Subtract to get a raw crossover value.
- Divide by a measure of the market's price volatility. Without this step, a crossover of 3 dollars means something different in crude oil than in the 10-year note, and you cannot compare or combine them.
- Pass the result through a squashing function so the signal saturates. Beyond a certain strength, more trend should not mean more position, because the largest signals often come right before exhaustion.
- Use several pairs whose speeds are spaced out, roughly doubling each time. Pairs that are too close together are nearly the same signal and add nothing but cost.
- Average the sub-signals. Equal weighting is the sensible default. Optimising the weights is exactly the parameter-fitting you were trying to escape.
Portfolio construction
The blended signal gives you a target position between fully short and fully long for each market. Multiply by the inverse of that market's volatility to convert a view into a size, then scale the whole portfolio to a volatility target.
Group markets into sectors, such as equities, bonds, short rates, FX, energy, metals and agriculture, and cap the risk in any one sector. Trend books have a habit of piling into whatever has been moving, and that is usually one macro theme wearing several different tickers.
Risk model
The failure to plan for is a fast reversal after a long trend, when the slow pairs are still long and holding maximum size. The fast pairs will flip first, which is exactly why the ensemble hurts less than a pure slow system, but it still hurts.
Set a drawdown ladder that reduces risk in steps rather than a single cliff. Track the dispersion between sub-signals: when the fast and slow pairs disagree strongly across many markets at once, the regime is turning, and that is a good moment to be a little smaller than the model suggests.
Costs & implementation
Cost is the price you pay for the ensemble. Faster pairs trade more, and their gross edge is smaller, so they are the first casualties of realistic slippage. Test each speed net of costs before including it. If the 8/24 pair only works with zero costs, drop it rather than hoping.
The no-trade buffer matters a lot here. Because you are averaging several continuously varying signals, the target position is always drifting slightly, and a naive implementation would trade every day for no reason. Only rebalance when the target moves meaningfully away from the current position, for example by more than 10 percent of a full-size position.
Failure modes
- Adding more and more pairs and believing the smoother backtest line means lower real risk. It mostly means you have averaged away your parameter luck, which is good, but the underlying trend risk is unchanged.
- Optimising the ensemble weights and reintroducing overfitting through the back door.
- Including fast pairs that are not viable after costs.
- Rebalancing continuously and giving away the edge in slippage.
- Assuming the ensemble makes trend safe. It does not. It makes it honest.
Our Notes & Suggestions
Start with three or four speeds, equal weighted. That is enough to get most of the diversification benefit. Beyond about six, extra pairs are nearly duplicates.
Report the performance of each sub-signal separately, even though you trade only the blend. If one speed is carrying everything, you have a fragile strategy wearing an ensemble costume.
Be honest that this is a construction improvement, not a new source of return. It should reduce the odds of a nasty surprise between backtest and live, which is worth a great deal, but it will not turn a mediocre trend edge into a good one.
Our Notes & Suggestions
See the "Our Notes" subsection in the body above for practical guidance, gotchas, and best practices. Always validate regime assumptions and transaction cost assumptions before scaling.
Implementation Checklist
- Choose a set of fast/slow pairs, for example 8/24, 16/48, 32/96 and 64/192 days, so each is roughly double the previous
- For each pair compute the raw crossover: fast average minus slow average
- Normalize each raw crossover by the market's price volatility so the number is comparable across markets
- Squash the normalized signal into a bounded range so a huge move cannot produce a huge position
- Average the sub-signals into one target position per market, with equal weight unless you have strong evidence otherwise
- Volatility-scale the position and then scale the whole book to a portfolio volatility target
- Add a no-trade buffer so the position only updates when the target moves by more than a set amount
- Charge realistic costs per market and confirm the fastest pair still earns its keep after costs
- Walk forward across decades and check that no single pair carries the whole result
- Monitor live turnover against backtested turnover as the main early warning of trouble