Une ligne lisse qui a vu le futur
Un filtre transforme une suite d'entrées xₜ en une sortie yₜ par une somme pondérée d'entrées récentes et de sorties récentes. La moyenne mobile exponentielle est le plus simple : yₜ=αxₜ+(1-α)yₜ₋₁. Dans scipy.signal, un filtre est un couple de listes de coefficients, b pour les entrées et a pour les sorties, et ici yₜ=b₀xₜ-a₁yₜ₋₁ avec b = [alpha] et a = [1, -(1 - alpha)]. signal.lfilter(b, a, x) le fait tourner vers l'avant dans le temps, exactement comme un système en direct, donc yₜ ne dépend que de xₛ avec s≤t. Par défaut il part du repos (état nul), ce qui fausse les premières valeurs pour un prix proche de 100 ; passez zi = signal.lfilter_zi(b, a) * x[0] pour partir de la première valeur. Le résultat concorde avec pd.Series(x).ewm(alpha=alpha, adjust=False).mean() à la précision machine.
signal.filtfilt(b, a, x) fait tourner le même filtre vers l'avant puis vers l'arrière. Le retard s'annule, donc la courbe lissée colle aux données, ce qui est parfait sur un graphique, mais chaque sortie dépend désormais d'entrées postérieures. Pour construire un signal de trading, c'est une fuite. Prenez un signal de tendance, le log du prix moins sa moyenne, et corrélez-le au rendement du lendemain : pour SPY sur 2 501 jours et α=0,1, le signal causal a une corrélation de -0,055 (une faible réversion à la moyenne), celui à phase nulle -0,33 ; pour α=0,3, les chiffres sont -0,076 et -0,54. Aucun trader ne pourrait gagner ces chiffres à phase nulle, car la valeur filtrée contient déjà le prix de demain. Le test d'un signal est simple : tronquez les données à une date et vérifiez que les valeurs antérieures ne changent pas.
lfilterest le direct,filtfiltest le recul : seul le premier peut tourner sur une table de trading.- Fixez l'état initial :
lfilter_zi(b, a) * x[0]supprime le régime transitoire de départ. - Test de troncature : coupez les données à une date ; un signal valide ne change pas avant elle.
Lab : ce qui est noté
- Coefficients du filtre10 pts
- La moyenne causale20 pts
- La version pandas10 pts
- La moyenne à phase nulle15 pts
- Signaux et rendement du lendemain25 pts
- L'étude de SPY20 pts