Trading Signal Generation: From Research to Production
Module: Fintech AI | Difficulty: Advanced
Signal Decay
Signal Combination
Information Ratio
where .
import numpy as np
class SignalCombiner:
def __init__(self, signals, method='ic_weighted'):
self.signals = signals; self.method = method
def combine(self, forward_returns):
if self.method == 'equal_weight':
return np.mean(self.signals, axis=0)
elif self.method == 'ic_weighted':
ics = [np.corrcoef(s, forward_returns)[0,1] for s in self.signals]
weights = np.array(ics) / np.sum(np.abs(ics))
return np.average(self.signals, weights=weights, axis=0)
def evaluate(self, signal, returns):
ic = np.corrcoef(signal, returns)[0,1]
rank_ic = np.corrcoef(np.argsort(np.argsort(signal)), np.argsort(np.argsort(returns)))[0,1]
return {'IC': ic, 'Rank IC': rank_ic}
Research Insight: Signal combination is more important than individual signal quality. A portfolio of 50 mediocre signals (IC=0.02 each) can outperform one strong signal (IC=0.06) because uncorrelated signals diversify noise.