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
| Method | Sharpe | Max DD | Turnover | IS/OOS Decay |
|---|---|---|---|---|
| Best Single Signal | 0.51 | −14.2% | 340% | — |
| Equal Weight | 0.83 | −8.7% | 280% | 0% |
| Inverse-Vol | 0.79 | −9.1% | 290% | 3% |
| Performance Weight | 0.71 | −11.3% | 410% | 18% |
| Ridge Regression | 0.91 | −7.4% | 260% | 12% |
| Gradient Boosted | 0.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
- Bates, J.M. and Granger, C.W.J. (1969). "The Combination of Forecasts." Operations Research Quarterly, 20(4), 451–468.
- Timmermann, A. (2006). "Forecast Combinations." Handbook of Economic Forecasting, 1, 135–196.
- DeMiguel, V., Garlappi, L. and Uppal, R. (2009). "Optimal Versus Naive Diversification." Review of Financial Studies, 22(5), 1915–1953.
- Rapach, D.E., Strauss, J.K. and Zhou, G. (2010). "Out-of-Sample Equity Premium Prediction." Review of Financial Studies, 23(2), 821–862.