← Tous les exercices
Appliquer le signal de la veille (hors cours)
Partie 5 · ★★★★
Hors cours. Dans le pipeline du cours, strategy_ret = signal * ret utilise le signal du jour t (calculé avec close_t) pour pondérer le rendement close_t - close_(t-1) : le signal « connaît » déjà le prix de la journée qu'il est censé prédire. Pour une stratégie utilisable en temps réel, on applique plutôt le signal de la veille : LAG(signal).
Complète le pipeline pour que la performance totale par actif (ticker, perf, triée par ticker) utilise LAG(signal) à la place de signal. Compare avec l'exercice du pipeline : 9, 7, 78 avec le signal du jour.
import sqlite3 con = sqlite3.connect(":memory:") con.execute("CREATE TABLE prices(date TEXT, ticker TEXT, close REAL)") A = [100, 102, 101, 105, 107, 108] B = [50, 49, 51, 50, 52, 55] C = [80, 90, 83, 110, 79, 120] for i in range(6): d = f"2024-01-0{i + 1}" for t, s in (("A", A), ("B", B), ("C", C)): con.execute("INSERT INTO prices VALUES (?, ?, ?)", (d, t, s[i])) sql = """ WITH returns AS ( SELECT *, close - LAG(close) OVER (PARTITION BY ticker ORDER BY date) AS ret FROM prices ), ma AS ( SELECT *, AVG(close) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) AS ma5 FROM returns ), signal AS ( SELECT *, CASE WHEN close > ma5 THEN 1 ELSE 0 END AS signal FROM ma ), veille AS ( SELECT *, ___(signal) OVER (PARTITION BY ticker ORDER BY date) AS sig_veille FROM signal ) SELECT ticker, SUM(sig_veille * ret) AS perf FROM veille GROUP BY ticker ORDER BY ticker """ rows = con.execute(sql).fetchall()
Ctrl/⌘+Entrée