Overview

Once you have multiple alpha signals, the key question is how to combine them into a unified portfolio. The approach depends on signal characteristics and portfolio constraints.

Weight signals proportional to their net daily IC:

\[w_i = \frac{IC_{daily,i} - TC_i/252}{\sum_j (IC_{daily,j} - TC_j/252)}\]

where $IC_{daily,i}$ is the daily information coefficient and $TC_i$ is the annual transaction cost.

Advantages:

Shrinkage Toward Equal Weight

\[w_i^{final} = \lambda \cdot \frac{1}{N} + (1-\lambda) \cdot w_i^{IC}\]

Typical values: $\lambda = 0.3$ to $0.5$

Correlation Management

When signals are correlated, consider:

  1. PCA-based combination - Extract independent components
  2. Hierarchical clustering - Group similar signals, weight clusters equally
  3. Penalized optimization - Add correlation penalty to objective

Practical Example

def combine_signals(daily_ics, costs, corr_matrix, shrinkage=0.4):
    """
    Combine signals using daily IC weighting with shrinkage.
    
    Parameters
    ----------
    daily_ics : array
        Daily IC for each signal
    costs : array  
        Annual transaction costs (fraction)
    corr_matrix : array
        Signal correlation matrix
    shrinkage : float
        Shrinkage toward equal weight
    """
    # Net daily IC after costs
    net_ic = daily_ics - costs / 252
    net_ic = np.maximum(net_ic, 0)  # No negative weights
    
    # IC-based weights
    ic_weights = net_ic / net_ic.sum()
    
    # Equal weight
    n = len(daily_ics)
    equal_weights = np.ones(n) / n
    
    # Shrinkage combination
    weights = shrinkage * equal_weights + (1 - shrinkage) * ic_weights
    
    return weights

When to Use Multiple Books

Consider separate books if:

Otherwise, unified estimation with per-portfolio optimization is simpler and more consistent.