← Back to archive

1. The Case for Combination

The forecasting literature consistently demonstrates that combining multiple forecasts outperforms individual forecasts, even via simple averaging. Bates and Granger (1969) formalised this; Timmermann (2006) extended it across domains. Each signal captures some aspect of the return-generating process but misses others. Momentum captures trends but fails during reversals; carry captures rate differentials but fails in risk-off events. Combining them diversifies model risk.

2. Signal Universe

Our 20 FX signals span four categories across 8 G10 pairs. Momentum (6): EWMA crossovers at 1w/1m, 1m/3m, 3m/12m horizons on spot and total return. Carry (4): forward rate bias, 1m and 3m carry, PPP-adjusted carry. Value (5): REER z-score, PPP deviation, terms of trade, productivity differential, current account. Volatility (5): implied-realised spread, vol risk premium, skew, term structure, cross-currency dispersion. Each signal is normalised to a z-score and winsorised at ±3σ.

3. Five Combination Methods

Equal weighting: 1/K per signal. Requires no estimation, zero IS/OOS decay. Inverse-volatility: weight by 1/σ of historical signal returns. Performance weighting: trailing 12-month Sharpe, zeroing negative-Sharpe signals. Ridge regression: L2-regularised regression of forward returns on signal vector, λ selected by 5-fold CV. Gradient boosted trees: LightGBM with max_depth=3, 100 estimators, retrained monthly.

from sklearn.linear_model import RidgeCV
import numpy as np

def ridge_signal_weights(signals, forward_returns,
                         alphas=np.logspace(-4, 2, 50)):
    """Optimal signal weights via cross-validated Ridge."""
    model = RidgeCV(alphas=alphas, cv=5,
                    scoring='neg_mean_squared_error')
    model.fit(signals, forward_returns)
    weights = model.coef_
    weights = weights / np.sum(np.abs(weights))
    return weights, model.alpha_

4. Results

MethodSharpeMax DDTurnoverIS/OOS Decay
Best Single Signal0.51−14.2%340%
Equal Weight0.83−8.7%280%0%
Inverse-Vol0.79−9.1%290%3%
Performance Weight0.71−11.3%410%18%
Ridge Regression0.91−7.4%260%12%
Gradient Boosted0.87−8.9%350%22%

Table 1: Out-of-sample (2015–2024) performance of five combination methods on 20 FX signals.

Ridge regression achieves the highest OOS Sharpe (0.91), but equal weighting is remarkably competitive (0.83) with zero decay and lower turnover. Performance weighting is worst — it creates momentum-on-momentum effects that amplify drawdowns during signal reversals.

5. When Equal Weighting Wins

When signals are highly diverse (average pairwise correlation below 0.2), equal weighting matches ridge because optimal weights are approximately equal anyway. When signals are redundant (correlation above 0.5), ridge dominates by down-weighting redundancies. Our universe has average correlation 0.28 — in the competitive zone. For more correlated universes, ridge provides larger improvements.

6. Conclusion

Signal combination is one of the most reliable improvements in systematic trading. Moving from the best single signal (Sharpe 0.51) to equal weighting (0.83) is a 63% improvement at zero cost. Invest efforts in generating diverse signals rather than optimising weights — the diversification benefit of additional signals far exceeds the benefit of more precise weighting.

References

  1. Bates, J.M. and Granger, C.W.J. (1969). "The Combination of Forecasts." Operations Research Quarterly, 20(4), 451–468.
  2. Timmermann, A. (2006). "Forecast Combinations." Handbook of Economic Forecasting, 1, 135–196.
  3. DeMiguel, V., Garlappi, L. and Uppal, R. (2009). "Optimal Versus Naive Diversification." Review of Financial Studies, 22(5), 1915–1953.
  4. Rapach, D.E., Strauss, J.K. and Zhou, G. (2010). "Out-of-Sample Equity Premium Prediction." Review of Financial Studies, 23(2), 821–862.