Aller au contenu
Apprendre.
  • M1 · toutes les matières15 matières : Préparation de données, API & sécurité, CI/CD, Docker, Merise, Dataviz, KNIME, ML appliqué : projet LoL, SQL & UML, SQL avancé, Machine Learning, Git, IA frugale & responsable, Qualité des données, MathématiquesAnnée
  • M2 · toutes les matières4 matières : Deep Learning, AI Act, Comex & Fundraising, Gouvernance & DataMeshAnnée
  • Deep LearningM2 · 4 modules · Réseaux de neurones, CNN, texte, modèles génératifs.Matière
  • Préparation de donnéesM1 · 3 modules · Nettoyer, transformer et fusionner des données avec Python.Matière
  • API & sécuritéM1 · 2 modules · Consommer, concevoir et sécuriser des API.Matière
  • CI/CDM1 · 1 module · Intégration et livraison continues.Matière
  • DockerM1 · 3 modules · Conteneurs, images, volumes, réseaux, Compose.Matière
  • MeriseM1 · 2 modules · Modéliser une base : MCD, MLD, MPD.Matière
  • DatavizM1 · 2 modules · Visualiser pour comprendre et décider.Matière
  • KNIMEM1 · 1 module · Explorer et nettoyer des données en workflow.Matière
  • ML appliqué : projet LoLM1 · 2 modules · Du besoin métier au POC de vision par ordinateur.Matière
  • SQL & UMLM1 · 3 modules · Modèles UML et requêtes SQL.Matière
  • SQL avancéM1 · 3 modules · Jointures, fenêtres, CTE, optimisation.Matière
  • Machine LearningM1 · 3 modules · Régression, classification, segmentation, projet.Matière

↑↓ naviguer↵ ouvre le résultat en surbrillanceesc fermer

Partie 1 · Contexte

Pourquoi SQL avancé ?

SQL n'est pas seulement un langage d'interrogation, ni un outil pour filtrer des lignes : il permet de définir des transformations analytiques sur des données structurées. L'enjeu d'un SQL avancé n'est pas d'écrire des requêtes plus longues, mais de comprendre comment une table devient un objet calculable.

Le cours a un fil rouge : une table de prix financiers prices(date, ticker, close). Chaque ligne contient une date, un actif et un prix de clôture. Nous allons calculer des rendements, des moyennes glissantes, des signaux, des classements, une performance cumulée et un pipeline complet.

datetickerclose
2024-01-01A100
2024-01-02A102
2024-01-01B50
2024-01-02B49

(Les petites valeurs A et B de ce site sont un exemple ajouté ; le cours utilise des données de marché réelles.)

La question de départ

Peut-on calculer en SQL le rendement simple ret_t = close_t − close_(t−1) ? La question est simple en apparence, mais elle force à réfléchir à trois idées : qu'est-ce qu'une ligne ? comment définir la ligne précédente ? sur quel groupe de lignes travaille-t-on ?

Le SQL relationnel élémentaire raisonne comme si les lignes étaient indépendantes, interchangeables et non ordonnées. Or ici : le rendement du jour dépend du prix d'hier, la moyenne glissante dépend d'un voisinage temporel, le classement d'un actif dépend des autres actifs à la même date. Dès qu'une ligne dépend d'autres lignes, le SQL basique ne suffit plus.

Vérifie que tu as compris

Une requête SELECT ... WHERE close > 100 traite chaque ligne isolément. Laquelle de ces quantités ne peut PAS s'écrire ainsi ?

Une rupture conceptuelle

Une ligne n'est plus traitée isolément : elle doit être interprétée dans son contexte (son passé, son futur, son voisinage local, son groupe d'appartenance, l'ensemble des lignes comparables). Dans une table ordonnée, une quantité calculée sur la ligne i s'écrit u_i ↦ f(u_(i−k), …, u_i, …, u_(i+ℓ)) : la valeur produite dépend d'un voisinage de la ligne.

FormeType de dépendance
u_i − u_(i−1)ponctuelle vers le passé
moyenne de u_(i−4) à u_ilocale glissante
somme des u_j pour j ≤ icumulative

Les window functions permettent précisément d'exprimer ces dépendances en SQL.

Vérifie que tu as compris

La quantité « moyenne des cinq dernières valeurs, ligne courante comprise » est une dépendance…

La méthode générale

Face à une question analytique, pose-toi toujours ces quatre questions :

  1. Quelle est l'unité de calcul ? Une ligne ? Une date ? Un actif ? Un couple (date, actif) ?
  2. De quelles lignes dépend cette ligne ?
  3. Faut-il séparer les calculs par groupe ? ⇒ PARTITION BY
  4. Faut-il imposer un ordre ? ⇒ ORDER BY

Dans le TP, l'unité de calcul de prices est un couple (date, actif) auquel on associe un prix de clôture. Et avant tout calcul, on valide le support : nombre de lignes, observations par actif, première et dernière date (COUNT(*), GROUP BY, MIN(date), MAX(date)). Une requête peut être correcte syntaxiquement et fausse analytiquement.

À toi de coder

Contrôler la table avant tout calcul

Un pipeline sérieux commence par la validation du support de calcul (TP, acte I) : combien de lignes, combien d'observations par actif, première et dernière date. Sans cela, tu pourrais calculer des rendements sur des séries incomplètes sans t'en rendre compte.

La table prices(date, ticker, close) est déjà créée (deux actifs A et B, 6 jours). Complète n_total (nombre de lignes de la table) puis la requête sql qui renvoie, par actif et trié par actif : ticker, COUNT(*), MIN(date), MAX(date).

Ctrl/⌘+Entrée

Vérifie que tu as compris

Dans la méthode générale, quel mot-clé répond à « faut-il séparer les calculs par groupe ? »