Trend Following and Momentum Trading: A Complete Guide
Trend following (time-series momentum trading) is the single most documented anomaly in systematic finance: assets with positive trailing returns tend to deliver positive forward returns over horizons of one to twelve months. This is not a chart pattern — it is a measurable, slowly-decaying risk premium with a convex payoff and well-understood failure modes. This guide is about how to estimate it, size it, and avoid the ways it quietly stops working.
The canonical academic result (Moskowitz, Ooi, Pedersen 2012; Hurst, Ooi, Pedersen on a century of data) is that a simple sign-of-past-return rule produces a Sharpe near 0.7–1.0 gross across a diversified futures book. The catch every practitioner learns: that number is before turnover costs, before crowding, and before the multi-year drawdowns that have dominated the post-2010 sample. The edge is real but thin, and most of the work is in not destroying it.
What is actually being estimated
Strip away the indicators and a trend signal is an estimate of the conditional drift of returns given recent realized returns. The two workhorse specifications:
- Time-series momentum (TSMOM): signal is
sign(r_{t-k:t})for each asset
independently. You are betting an asset's own trailing return predicts its own forward return.
- Cross-sectional momentum (XSMOM): rank a universe by trailing return, long
the top decile, short the bottom. You are betting on dispersion between assets, which is closer to statistical arbitrage and carries strong negative skew ("momentum crashes," Daniel & Moskowitz).
These are not the same factor. TSMOM has long volatility / "crisis alpha" behavior; XSMOM has crash risk on sharp reversals. Most managed-futures programs are predominantly TSMOM because its convexity is what allocators pay for.
A moving-average crossover, a Donchian breakout, and a sign-of-return rule are monotonic transforms of the same underlying state — they are ~90% correlated once you control for lookback. Choosing among them is second-order; choosing the lookback, the volatility estimator, and the rebalance frequency is first-order.
Signal construction that survives contact with data
The right way to combine lookbacks is not to pick one. Use a panel of horizons and average the standardized signals:
import numpy as np
import pandas as pd
def tsmom_signal(close: pd.Series, lookbacks=(21, 63, 126, 252)):
"""Volatility-normalized, multi-horizon time-series momentum signal in [-1, 1]."""
ret = np.log(close).diff()
sigs = []
for lb in lookbacks:
mom = np.log(close).diff(lb) # trailing log return
vol = ret.rolling(lb).std() * np.sqrt(lb) # scale to same horizon
sigs.append((mom / vol).clip(-2, 2)) # standardized, capped
raw = pd.concat(sigs, axis=1).mean(axis=1)
return np.tanh(raw).shift(1) # squash + lag to avoid look-ahead
Two non-obvious choices matter here. First, standardizing by horizon volatility turns the raw return into something comparable across assets and regimes — without it, your signal is dominated by whatever is most volatile. Second, the tanh squash caps position size on extreme readings; raw z-scores let a single asset dominate the book exactly when it is most likely to reverse.
| Design choice | Common default | Why it matters | Failure if wrong |
|---|---|---|---|
| Lookback | single 12M | sets which cycle you harvest | overfit to one regime |
| Vol estimator | rolling std | normalizes risk | std lags vol spikes (use EWMA) |
| Rebalance freq | daily | controls turnover | daily = cost bleed on slow signal |
| Signal cap | none | limits concentration | one name blows up the book |
| Universe size | <10 markets | drives diversification | tiny N = regime coin-flip |
Volatility targeting is most of the Sharpe
The largest single improvement to a naive trend system is ex-ante volatility targeting — scaling each position so its forecast contribution to portfolio volatility is roughly constant. This is not a tweak; in TSMOM research the volatility-scaled version has a materially higher and more stable Sharpe because it deleverages into turbulence and re-levers in calm.
def vol_targeted_position(close, signal, target_vol=0.15, halflife=33, cap=2.0):
"""Scale a [-1,1] signal to a target annualized vol using EWMA realized vol."""
ret = np.log(close).diff()
ewma_vol = ret.ewm(halflife=halflife).std() * np.sqrt(252)
lever = (target_vol / ewma_vol).clip(upper=cap) # cap leverage in calm regimes
return (signal * lever).shift(1).fillna(0) # lag: trade on next bar
Use EWMA, not a simple rolling window, for the volatility forecast: a trailing 20-day std responds to a vol spike with a step function and a cliff 20 days later, injecting artificial turnover. The leverage cap is essential — in ultra-low-vol regimes target/realized explodes and a naive scaler will put on ruinous size right before a vol regime change.
Honest performance: where the edge isn't
Trend following has had a brutal 2011–2019 stretch (the "CTA winter") where diversified programs were flat-to-down while equities rallied. This is not noise to be explained away — it is the structural cost of a strategy that needs sustained directional moves and gets chopped up by mean-reverting, central-bank-anchored markets. You will hold this strategy through multi-year drawdowns or you will not capture its convexity.
Where it has little or no edge after honest accounting:
- Single equities. Idiosyncratic single-name "trend" is mostly noise plus
short-horizon reversal; cross-sectional equity momentum is a real factor but is heavily crowded and decays fast.
- Short lookbacks on liquid futures. Anything under ~1 month is dominated by
microstructure and turnover costs; the gross signal is real but net is negative for most retail cost structures.
- High-turnover daily rebalancing of a slow signal. You pay spread and impact
to express a view that changes monthly. Trade the signal at the frequency the signal actually changes.
Signal decay is measurable: regress forward returns on the lagged signal and track the information coefficient (IC) over rolling windows. A trend IC that was 0.04 in the 1990s and is 0.01 today is telling you the premium is being arbitraged, not that your code is broken. Indicators that retail communities treat as edge — fast MA crosses, RSI, MACD — are simply low-IC, high-turnover features; test them with the same IC/decay lens and most fail to clear costs.
Diversification is the only free lunch
A single-market trend system is a bet on one regime; its Sharpe is dominated by sampling luck. The CTA model works because trend signals across ~50–100 weakly-correlated instruments (rates, FX, commodities, equity indices, crypto) diversify the idiosyncratic timing error while preserving the common crisis-alpha exposure. The realistic ceiling: gross Sharpe scales roughly with sqrt(Neffective) where Neffective is far smaller than your instrument count because asset-class blocks co-move in risk-off.
Crypto specifics
Crypto trends are violent and the signal IC has historically been higher than in mature futures, but three frictions dominate:
- Funding on perps is a real carry cost on multi-week holds; net it against
the trend PnL or you will overstate returns. See carry trade.
- Vol-of-vol is extreme, so EWMA vol targeting matters more here than
anywhere — see measuring volatility and volatility targeting.
- Capacity is small and crowding is fast. Crypto trend edges decay in
quarters, not decades; assume the signal you read about publicly is already half-arbitraged.
Capacity and crowding
Trend following is capacity-constrained at the slow, liquid end and crowding-constrained at the fast end. When too much capital chases the same breakout, the move that used to follow-through instead reverses as everyone's stops cluster — turning the convex payoff concave. Monitor your own market impact: if your fills are consistently worse than your backtest's mid-price assumption, you are the liquidity, not the taker.
Validation that won't lie to you
The 50/200 that looks perfect in-sample is the classic overfit. Defenses that actually work:
- Walk-forward, not single split. Re-estimate parameters on a rolling window
and trade only out-of-sample — see walk-forward optimization.
- Deflate for the search. If you tried 40 lookback/asset combinations, your
best Sharpe is inflated; apply deflated Sharpe and multiple-testing corrections.
- Model costs first, signal second. Put realistic spread, impact, and funding
into the backtest before you admire any equity curve, and watch for backtesting biases.
Judge results on risk-adjusted terms — Sharpe, Sortino, and especially Calmar / max drawdown, since trend equity curves have long, deep dips that a Sharpe alone hides.
Sizing the convex payoff
The payoff is positively skewed: many small losses, rare large gains. This breaks naive Kelly sizing, which assumes a stable return distribution — practitioners trade a small fraction of Kelly because full Kelly on a fat-tailed, autocorrelated return stream produces ruinous variance and path dependence. The discipline that matters most:
- Take every signal. The edge lives in the rare large winner; cherry-picking
"obvious" trades deletes exactly the trades that pay for the year.
- Size by ex-ante volatility, never conviction.
- Trail, don't target. A fixed profit target truncates the right tail that
is the entire source of edge — see position sizing.
Conclusion
Trend following is a thin, convex, slowly-decaying premium — not a chart trick. The real work is volatility-scaled sizing, broad diversification, honest cost modeling, and the institutional stamina to sit through multi-year drawdowns. It is the structural opposite of mean reversion and pairs naturally with breakout exits. Treat published lookbacks as starting hypotheses to be re-estimated out-of-sample, assume your edge is decaying, and you will keep what little of the premium survives crowding and costs.
