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.
Daily IC Weighting (Recommended)
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:
- Accounts for different forecast horizons
- Naturally balances IC against costs
- Robust to estimation error with shrinkage
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:
- PCA-based combination - Extract independent components
- Hierarchical clustering - Group similar signals, weight clusters equally
- 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:
- Constraints differ significantly (e.g., factor-neutral vs unconstrained)
- Rebalancing frequencies are very different
- Risk management approaches differ
Otherwise, unified estimation with per-portfolio optimization is simpler and more consistent.