← Back to Learn
IV ExpertWeek 15 • Lesson 47Duration: 45 min

CMB Alpha Combination

Why combining mediocre signals creates something far better than any one alone

Learning Objectives

  • Understand the mathematical basis for signal combination benefits
  • Implement and compare different signal weighting methods
  • Recognize and account for signal correlation in combination
  • Know when combination helps and when it does not

Explain Like I'm 5

Combining signals works for the same reason diversification works in portfolios: uncorrelated sources of information add up. Three 0.03 IC signals combined can outperform a single 0.06 IC signal.

Think of It This Way

Think of it like asking multiple experts for directions. Each one might be slightly wrong, but if their errors are independent, the average of their answers gets you closer to the destination than any single opinion.

1Why Combination Works

The mathematical foundation is straightforward. If you have NN signals with average IC and average pairwise correlation ρˉ\bar{\rho}, the combined IC is approximately:
ICcombinedICˉ×N1+(N1)ρˉIC_{combined} \approx \bar{IC} \times \sqrt{\frac{N}{1 + (N-1) \bar{\rho}}}
When signals are uncorrelated (ρˉ=0\bar{\rho} = 0), this simplifies to:
ICcombinedICˉ×NIC_{combined} \approx \bar{IC} \times \sqrt{N}
This is profound. Four uncorrelated signals with IC = 0.03 each produce a combined IC of 0.06. That's not a marginal improvement — it's a qualitative change from "barely usable" to "solidly profitable." But here's the catch: the word uncorrelated is doing heavy lifting. In practice, most trading signals are positively correlated because they're derived from similar data and capture similar market dynamics.

2Weighting Methods

How you weight signals matters, sometimes as much as which signals you include: Equal weight. The default, and surprisingly hard to beat in practice. Simple, robust, no parameter estimation risk. If you can't justify something fancier, use equal weights. IC-weighted. Weight each signal proportional to its historical IC. Better in theory, but introduces estimation error — your IC estimates are noisy, and weighting by noisy estimates adds noise. Inverse variance-weighted. Weight inversely proportional to forecast variance. Gives more weight to stable signals. Works well when signal volatilities differ substantially. Optimized (ML-based). Train a model to learn optimal combination weights. Can capture nonlinear interactions and time-varying optimal weights. But adds substantial overfitting risk unless you have a lot of data and rigorous cross-validation. The research consensus (notably Clemen, 1989 — "Combining Forecasts") is that simple averages are remarkably robust. Complex weighting schemes beat simple averages only when you have many observations, stable signal relationships, and the combination problem is well-specified.

3The Correlation Trap

The biggest mistake in signal combination is treating correlated signals as if they were independent. The effective number of independent signals is:
Neff=N1+(N1)ρˉN_{eff} = \frac{N}{1 + (N-1) \cdot \bar{\rho}}
This means 10 signals with average pairwise correlation of 0.6 give you the equivalent of about 2.5 independent signals — not 10.

4How Production Systems Combine Signals

In practice, production signal combination looks like this: Step 1: Standardize. Each signal is z-scored (subtract mean, divide by standard deviation) using a rolling window. This puts all signals on the same scale regardless of their original units. Step 2: Weight. Apply combination weights. Start with equal weighting; add IC-weighting only if you have 2+ years of stable IC estimates. Step 3: Winsorize. Cap the combined signal at +/- 3 standard deviations. Outliers in combined signals usually indicate one signal is misbehaving, not that there's a massive opportunity. Step 4: Normalize. Rescale the final combined signal to have unit variance. This ensures consistent position sizing downstream. Step 5: Regime-condition (optional). If correlation between signals varies by regime, adjust weights accordingly. This is where sophistication can pay off — but it also doubles your overfitting risk. The critical insight: signal combination is itself a modeling decision. The more complex your combination method, the more data you need to validate it, and the more likely you are to overfit.

5When Combination Does Not Help

Signal combination isn't always the answer. Five cases where adding more signals hurts: 1. Highly correlated signals. If your new signal has 0.8+ correlation with existing signals, you're adding noise and complexity without meaningful diversification. 2. Very different horizons. Combining a signal that's predictive at 1-hour with one that's predictive at 1-month creates confusion — the optimal holding period becomes ambiguous. 3. Unstable IC. A signal with IC = 0.04 +/- 0.08 (frequently negative) adds more noise than signal. 4. Different asset universes. A signal that works for equities combined with one that works for FX doesn't create magic — it creates something that works well nowhere. 5. Estimation error exceeds combination benefit. If you need a 5-year window to estimate stable combination weights, but signals decay in 2 years, you're always fitting yesterday's model. The general principle: combination helps most when signals are individually modest but genuinely independent, share the same prediction horizon and asset universe, and have stable IC over the estimation window.

Key Formulas

Combined IC

Theoretical combined IC from N signals with average IC and average pairwise correlation rho

Effective Independent Signals

The number of truly independent signal sources after accounting for cross-correlation

Hands-On Code

Signal Combination Methods

python
import numpy as np

def combine_signals(signals, method='equal', ic_values=None, lookback=252):
    """
    Combine multiple trading signals using various weighting methods.
    
    Parameters:
        signals: array of shape (T, N) with standardized signal values
        method: 'equal', 'ic_weighted', 'inverse_var'
        ic_values: array of IC values per signal (for ic_weighted)
        lookback: rolling window for variance estimation
    """
    T, N = signals.shape
    
    if method == 'equal':
        weights = np.ones(N) / N
        combined = signals @ weights
        
    elif method == 'ic_weighted':
        positive_ics = np.maximum(ic_values, 0)
        weights = positive_ics / positive_ics.sum() if positive_ics.sum() > 0 else np.ones(N) / N
        combined = signals @ weights
        
    elif method == 'inverse_var':
        combined = np.zeros(T)
        for t in range(lookback, T):
            window = signals[t-lookback:t]
            variances = np.var(window, axis=0) + 1e-8
            inv_var_weights = (1 / variances) / np.sum(1 / variances)
            combined[t] = signals[t] @ inv_var_weights
    
    # Winsorize at +/- 3 std
    std = np.std(combined[combined != 0]) if np.any(combined != 0) else 1.0
    combined = np.clip(combined, -3 * std, 3 * std)
    
    # Normalize to unit variance
    final_std = np.std(combined[combined != 0]) if np.any(combined != 0) else 1.0
    combined = combined / final_std if final_std > 0 else combined
    
    return combined

Implements three signal combination approaches (equal weight, IC-weighted, inverse variance) with winsorization and normalization for production use.

Knowledge Check

Q1.Four uncorrelated signals, each with IC = 0.03, produce a combined IC of approximately:

Q2.Ten signals with average pairwise correlation of 0.7 are effectively equivalent to how many independent signals?

Q3.Which combination method is the hardest to beat in practice?

Assignment

Construct three simple FX signals (momentum, mean-reversion, volatility-based) for EUR/USD. Compute the pairwise correlations and individual ICs. Then combine using equal weighting and IC-weighting. Compare the combined IC to the individual ICs and calculate the theoretical vs. realized improvement.