← Tous les exercices
Croisement de deux moyennes
Partie 4 · ★★★
Le cours compare une moyenne courte et une moyenne longue (5 et 20 jours). Nos séries ne durent que 6 jours : (exemple adapté) nous prenons 2 et 4 lignes. Signal : 1 si ma_short > ma_long, sinon -1. Renvoie date, signal pour l'actif A, trié par date.
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 f AS ( SELECT date, AVG(close) OVER (ORDER BY date ROWS BETWEEN ___ PRECEDING AND CURRENT ROW) AS ma_short, AVG(close) OVER (ORDER BY date ROWS BETWEEN ___ PRECEDING AND CURRENT ROW) AS ma_long FROM prices WHERE ticker = 'A' ) SELECT date, CASE WHEN ma_short > ma_long THEN 1 ELSE -1 END AS signal FROM f ORDER BY date """ rows = con.execute(sql).fetchall()
Ctrl/⌘+Entrée