Partie 5 · Rigueur
Pièges, méthode, SQL et Python
Les erreurs les plus fréquentes
- oublier
PARTITION BY; - oublier
ORDER BY; - confondre calcul global et calcul local ;
- mal définir la fenêtre ;
- utiliser le futur sans le vouloir ;
- mal interpréter les
NULLde bord.
Comparer AVG(close) OVER (PARTITION BY ticker) (moyenne globale par actif) à la version avec ORDER BY date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW (moyenne locale glissante).
Fuite d'information
Il y a fuite d'information lorsqu'un calcul censé être disponible au temps t utilise des données du futur : une fenêtre qui inclut t+1, t+2… ou un LEAD utilisé sans s'en rendre compte. En finance cela conduit à des stratégies artificiellement excellentes mais irréalistes : l'interprétation causale du calcul est détruite, l'évaluation est invalide, les comparaisons entre méthodes sont faussées. Dès qu'un calcul est censé être utilisable en temps réel, vérifie qu'il n'utilise que l'information disponible à cette date.
Vérifie que tu as compris
À toi de coder
ROWS contre RANGE, ordre, NULL
Dans beaucoup de moteurs, ROWS compte un nombre de lignes, alors que RANGE raisonne sur des valeurs de l'ordre et peut inclure plusieurs lignes ex æquo. Les confondre peut changer subtilement ou fortement le résultat ; pour un premier apprentissage rigoureux, ROWS est plus simple à interpréter.
Une table relationnelle n'a pas d'ordre intrinsèque : LAG, LEAD, ROW_NUMBER et les cumuls exigent un ORDER BY explicite. Le fait qu'une requête « tourne » ne signifie pas qu'elle calcule quelque chose de bien défini.
Les NULL apparaissent souvent : début de série avec LAG, variance locale nulle, données absentes. Faut-il les conserver, les filtrer, les remplacer ? Il n'y a pas de réponse universelle : cela dépend du sens du calcul.
À toi de coder
Lire, concevoir, vérifier
Lire une requête complexe : (1) la table de départ, (2) chaque CTE, (3) ce que chaque étape ajoute, (4) tous les PARTITION BY, (5) tous les ORDER BY, (6) la fenêtre de chaque calcul, (7) l'absence de fuite d'information.
Concevoir : (1) la grandeur finale, (2) sa décomposition en sous-quantités, (3) l'unité de calcul de chaque sous-quantité, (4) groupe, ordre et fenêtre, (5) implémentation étape par étape dans des CTE lisibles.
Valider : sens métier, unité de calcul, cohérence des partitions et de l'ordre, définition des fenêtres, traitement des bords, absence de futur non désiré. En SQL analytique, la correction ne se réduit pas à l'absence d'erreur de syntaxe.
SQL et pandas
| SQL | pandas |
|---|---|
LAG(x) | shift(1) |
LEAD(x) | shift(-1) |
AVG(x) OVER (... ROWS ...) | rolling(...).mean() |
SUM(x) OVER (...) | cumsum() |
ROW_NUMBER() | rank(method='first') ou index après tri |
La logique mathématique est la même ; seul le langage change. SQL décrit ce que l'on veut calculer ; Python décrit souvent comment enchaîner les opérations.
Vérifie que tu as compris
LAG(x) le cours propose-t-il ?