σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft AcademyFeuilles de routeParcours
Ctrl K
AO
+1,2 k apprenants
ConnexionRejoindre ↗
Feuilles de routeParcours
AO
+1,2 k apprenants
Connexion
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft AcademyFeuilles de routeParcours
Ctrl K
AO
+1,2 k apprenants
ConnexionRejoindre ↗
Feuilles de routeParcours
AO
+1,2 k apprenants
Connexion
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Parcours SciPy›Module 3 · Matrices, signaux et structure›Sujet 3.6·~45 minIntermédiaire

Filtres causaux pour des signaux de trading

Position dans le parcoursModule 3 sur 3 · Sujet 6 sur 10
3.6 Filtres causaux pour des signaux de trading
—Score du lab— / 100XP total—Série—

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.

  • lfilter est le direct, filtfilt est 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
Explorateur · lab-sp-21
▾ lab-sp-21
▾ data
…
bash · dans le navigateur
learner@quantcraft:~/lab-sp-21$
Python pas encore chargéPythonLn 1, Col 1Spaces: 4UTF-8

Réinitialiser ce sujet ?

Tout le contenu de lab-sp-21 revient aux fichiers de départ et le terminal est vidé. Votre solution actuelle sera perdue : cette action est irréversible.

Sera réinitialisé
  • main.py → code de départ
  • Historique du terminal et sortie des tests
  • Modifications non soumises
Sera conservé
  • Meilleur score du lab
  • Votre XP et votre série
  • Progression du cours et notes

Connectez-vous pour exécuter votre code.

Tous les cours sont gratuits à lire. Créez un compte ou connectez-vous pour exécuter du code, lancer les tests et soumettre ce lab.

  • IDE dans le navigateur avec terminal bash — rien à installer
  • Correction instantanée, XP et votre place dans le parcours
Créer un compteSe connecter
OU
Continuer avec GitHub