Partie 2 · Comparer
Classement et analyse cross-sectionnelle
Jusqu'ici nous avons raisonné dans le temps, actif par actif. Une autre forme d'analyse est essentielle : comparer plusieurs actifs à une même date, sélectionner les meilleurs, produire un classement instantané. On ne regarde plus seulement le passé d'un actif, mais sa position relative parmi les autres.
Trois fonctions de classement : ROW_NUMBER() attribue un rang strict, RANK() gère les ex æquo avec trous, DENSE_RANK() les gère sans trous. Selon l'objectif, on ne veut pas toujours traiter les ex æquo de la même façon.
| Valeur | ROW_NUMBER | RANK | DENSE_RANK |
|---|---|---|---|
| 10 | 1 | 1 | 1 |
| 10 | 2 | 1 | 1 |
| 8 | 3 | 3 | 2 |
| 7 | 4 | 4 | 3 |
Vérifie que tu as compris
À toi de coder
Rang des actifs à chaque date
ROW_NUMBER() OVER (PARTITION BY date ORDER BY close DESC)
Pour chaque date, on classe les actifs du plus grand prix au plus petit et on attribue un numéro de ligne. Pour sélectionner les 5 premiers :
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY date ORDER BY close DESC) AS rank_ FROM prices ) t WHERE rank_ <= 5
On obtient une sélection top-k par date. (Hors cours : le résultat d'une window function ne peut pas être filtré dans le WHERE de la même requête, d'où la sous-requête ou une CTE.)
Ce classement peut servir à sélectionner les actifs les plus chers, les plus performants ou les plus liquides, construire une stratégie « top performers », ordonner un univers d'investissement à chaque date, comparer des signaux standardisés entre plusieurs actifs.
À toi de coder
Vérifie que tu as compris
PARTITION BY date (et non ticker) dans le classement des actifs ?