Une mesure de risque sert à estimer la perte qu'un portefeuille pourrait subir au cours d'une mauvaise journée. Toutefois, un modèle peut produire un nombre précis et manquer les pertes qu'il devait annoncer. Le présent projet compare donc six modèles sur le même portefeuille canadien et juge leurs prévisions sur des données qu'ils n'ont pas utilisées pour s'ajuster.
Deux mesures sont étudiées. La valeur à risque indique un seuil de perte qui ne devrait être dépassé qu'une fois sur cent. La perte moyenne au-delà de ce seuil décrit ensuite la gravité des journées les plus mauvaises. Les contrôles réglementaires vérifient à la fois le nombre de dépassements et leur concentration dans le temps.
Résultat principal. Sur 5 476 jours ouvrés entre novembre 2004 et août 2026, la simulation historique filtrée est le seul des six modèles qui passe le test de fréquence de Kupiec. Elle compte 69 dépassements, contre 54,8 attendus, avec une probabilité critique de 0,063. Elle est également la seule méthode sans année classée en zone rouge par le barème de Bâle. En comparaison, les modèles fondés sur une queue normale manquent entre 121 et 140 pertes.
Afin d'expliquer ce classement, nous présenterons d'abord le portefeuille et les deux mesures de risque. Dans un deuxième temps, nous construirons les six modèles dans l'ordre de leur complexité. Ensuite, nous appliquerons les contrôles de Kupiec, de Christoffersen, de Bâle et d'Acerbi-Székely. Enfin, nous étudierons les années de crise, les limites de chaque méthode et les commandes de reproduction.
Le même contenu en PDF : rapport/rapport.pdf.
Résumé en anglais
English summary. A risk engine for the balanced Canadian ETF portfolio of repo 03: six one-day VaR and Expected Shortfall models (historical, Gaussian, Student-t, RiskMetrics EWMA, filtered historical simulation, and a GARCH(1,1) fitted by maximum likelihood written from scratch), backtested over 5,476 out-of-sample days with Kupiec, Christoffersen, year-by-year Basel traffic lights and Acerbi-Székely. Filtered historical simulation is the only model that passes Kupiec coverage (69 violations vs 54.8 expected, p = 0.063) and the only one with zero red Basel years; normal-tail models violate 121 to 140 times, and plain historical VaR violates in clusters (22 times in 2008).
Une banque annonce chaque matin sa VaR à 99 %, la perte quotidienne qu'elle ne devrait dépasser qu'un jour sur cent. En mots simples : « demain, sauf malchance rare, je ne perdrai pas plus que ce chiffre ». Le régulateur ne juge pas la formule, il compte les dépassements : si la perte réelle excède la VaR annoncée beaucoup plus d'un jour sur cent, ou plusieurs jours de suite, le modèle est faux et le capital exigé monte. La question du dépôt : parmi six façons classiques de calculer cette VaR, lesquelles survivent à vingt-deux ans de données canadiennes réelles, crises de 2008, 2020 et 2022 comprises ?
La boîte à outils vient de quatre papiers et d'un standard d'industrie : RiskMetrics (J.P. Morgan, 1996) pour la volatilité EWMA, Bollerslev (1986) pour le GARCH, Barone-Adesi, Giannopoulos et Vosper (1999) pour la simulation historique filtrée, Kupiec (1995) et Christoffersen (1998) pour les tests, et le cadre de Bâle (feux tricolores de 1996, puis la FRTB qui impose l'Expected Shortfall à 97,5 %). Ce que ce dépôt apporte :
- Le juge avant le modèle. Les six modèles sont soumis aux mêmes 5 476 jours et aux mêmes quatre tests ; aucun chiffre de qualité de modèle n'est affirmé sans son test sur les données passées.
- Un GARCH(1,1) écrit et vérifié ici même, vraisemblance maximisée sans bibliothèque spécialisée, avec un test qui retrouve les paramètres d'une série simulée connue.
- Aucun regard sur le futur, testé : la prévision du jour t n'utilise que les jours antérieurs, et un test choque le dernier jour pour vérifier qu'aucune prévision passée ne bouge.
- La lecture réglementaire : la carte des feux de Bâle année par année, le format que les comités de risque regardent réellement.
Le portefeuille suivi est le profil équilibré du moteur d'allocation : six FNB de Toronto aux poids
25 % actions canadiennes, 20 % actions américaines, 15 % actions internationales, 5 % immobilier
coté, 25 % obligations univers, 10 % obligations court terme. Son rendement QUOTIDIEN, l'échelle de
temps de la VaR réglementaire, est calculé aux poids cibles tenus constants ; l'approximation est
déclarée et de second ordre, le dépôt 03 mesure une rotation réelle de 2,8 % par an. Prix ajustés
Yahoo Finance téléchargés par rke fetch, jamais commités (usage personnel) ; 5 977 rendements
quotidiens d'octobre 2002 à août 2026, mesuré.
Chaque modèle refait chaque jour le même geste : estimer sur les 500 jours ouvrés précédents (deux ans), annoncer la VaR et l'ES du lendemain, puis passer au jour suivant. La VaR au niveau alpha est moins le quantile alpha des rendements, rapportée en positif ; l'Expected Shortfall, la perte moyenne des jours où la VaR est dépassée, en positif aussi. Les six modèles :
- Historique : le quantile empirique des 500 derniers jours, tel quel.
- Gaussien : moyenne et écart-type de la fenêtre, quantile de la loi normale.
- Student-t : une loi de Student, dont les queues épaisses donnent plus de poids aux jours extrêmes, ajustée par maximum de vraisemblance et réajustée tous les 21 jours.
- EWMA : la volatilité RiskMetrics, une moyenne des carrés de rendements qui oublie exponentiellement le passé (lambda = 0,94), avec un quantile normal.
- Simulation historique filtrée (FHS) : chaque rendement passé est divisé par la volatilité EWMA de son jour, puis remis à l'échelle de la volatilité prévue pour demain ; le quantile est pris sur ces rendements re-scalés. La queue reste empirique, le niveau suit la volatilité.
- GARCH(1,1) : la variance de demain est une combinaison estimée de la variance d'aujourd'hui et du choc d'aujourd'hui, réestimée tous les 21 jours par maximum de vraisemblance, innovations normales.
Les quatre juges, appliqués aux mêmes jours pour tous les modèles : le test de Kupiec compare le NOMBRE de dépassements à l'attendu ; le test de Christoffersen vérifie qu'ils n'arrivent pas en grappes (un dépassement hier ne doit rien dire sur demain) ; les feux de Bâle comptent par année civile (vert 0 à 4, jaune 5 à 9, rouge 10 et plus) ; la statistique Z2 d'Acerbi-Székely (2014) vaut zéro si l'ES annoncé égale la perte moyenne des jours de dépassement, elle est négative s'il la sous-estime.
Tous les chiffres viennent de results/tables/backtests_var99.csv et backtests_es975.csv,
régénérés par uv run rke backtest ; 5 476 jours communs, novembre 2004 à août 2026, VaR à 99 %.
| Modèle | Dépassements (54,8 attendus) | Taux | p Kupiec | p indépendance | VaR moyenne |
|---|---|---|---|---|---|
| FHS | 69 | 1,26 % | 0,063 | 0,012 | 1,62 % |
| Historique | 89 | 1,63 % | 0,000 | 0,000 | 1,74 % |
| Student-t | 89 | 1,63 % | 0,000 | 0,000 | 1,78 % |
| GARCH(1,1) normal | 121 | 2,21 % | 0,000 | 0,192 | 1,29 % |
| EWMA | 128 | 2,34 % | 0,000 | 0,277 | 1,30 % |
| Gaussien | 140 | 2,56 % | 0,000 | 0,000 | 1,42 % |
Comment lire ce tableau, en trois constats. D'abord, les deux familles échouent pour des raisons opposées : les modèles à volatilité dynamique et queue normale (EWMA, GARCH) réagissent vite, donc leurs dépassements sont indépendants (p = 0,19 à 0,28), mais la queue normale en produit deux fois trop ; les modèles à queue riche mais niveau figé (historique, Student) ont le bon ordre de grandeur de dépassements mais les font en grappes (p d'indépendance nulle), le pire moment possible. Ensuite, la FHS, qui combine queue empirique et volatilité EWMA, est la seule à passer Kupiec ; son p d'indépendance de 0,012 reste sous 5 %, aucun modèle n'est parfait et c'est écrit. Enfin, le prix de la prudence se lit dans la dernière colonne : l'historique immobilise une VaR moyenne de 1,74 % pour échouer quand même, la FHS fait mieux avec 1,62 %.
Comment lire cette figure : le trait gris est le rendement quotidien du portefeuille, les deux courbes sont moins la VaR 99 % annoncée la veille (historique en bleu, FHS en vermillon), et chaque triangle un jour où la perte a traversé la VaR de la FHS. La courbe historique forme des marches : elle descend après les crises et reste basse environ deux ans, le temps que la fenêtre de 500 jours oublie ; la courbe FHS descend pendant la crise et remonte quelques semaines après.
Comment lire cette figure : une ligne par modèle, une colonne par année, le chiffre est le nombre de dépassements de la VaR 99 % et la couleur la zone de Bâle. La ligne FHS est la seule sans case rouge (18 années vertes, 5 jaunes) ; l'historique est rouge en 2008 (22 dépassements) et 2020 (10) ; le gaussien cumule six années rouges. C'est le tableau qu'un comité de risque regarde, et il suffit à classer les modèles.
Comment lire cette figure : les barres grises sont les rendements quotidiens de janvier à septembre 2020, les courbes moins la VaR 99 % de trois modèles. L'historique (bleu) met deux semaines à réagir puis reste figé à 3,2 % jusqu'en mars 2022 ; l'EWMA et la FHS plongent avec le choc (la FHS jusqu'à 13,5 %) puis reviennent en quelques mois. La VaR historique est en retard dans les deux sens : trop basse pendant la crise, trop haute longtemps après.
Sur l'Expected Shortfall à 97,5 %, le niveau de la FRTB (backtests_es975.csv) : la FHS reste
première (158 dépassements pour 136,9 attendus, p = 0,075) et le gaussien dernier, le Student
reculant derrière le GARCH ; la FHS affiche le Z2 le plus proche de zéro (−0,16) et un ratio perte
réalisée sur ES annoncé de 0,97 les jours de dépassement, contre 1,36 pour le gaussien, qui
sous-estime donc ses pertes de queue d'un bon tiers.
Dans un service de risque, personne ne relit du Python. On relit un classeur, on change une case, et
on regarde ce que le résultat devient. reports/tests_depassement.xlsx permet cela : ses 450
formules sont écrites en Excel, rien n'est calculé en Python puis collé.
Trois feuilles. La notice dit ce que le classeur contient. La feuille « Kupiec » refait le test de
dépassement pour les six modèles, et ses valeurs p redonnent exactement celles de
results/tables/backtests_var99.csv, dont 0,0630 pour la simulation historique filtrée. La
feuille « Feux de Bâle » classe chaque année en vert, jaune ou rouge, avec les seuils de 5 et 10
mis à l'échelle du nombre de jours réellement observés, ce que la formule montre au lieu de le
cacher.
Il n'y a pas de macro, et ce n'est pas un oubli. Un script ne peut pas en écrire : mesuré le
30 août 2026, un fichier enregistré sous l'extension des classeurs à macros ne contient aucun projet
de macros, et Excel l'ouvre comme un classeur ordinaire. Le même test est donc livré en Visual Basic
dans vba/KupiecTest.bas, à importer par Alt+F11 puis Fichier, Importer un fichier ; les fonctions
KUPIEC et ZONE_BALE deviennent alors disponibles dans les cellules. Le classeur fonctionne
entièrement sans elles.
Un piège de format a été évité au passage. Les fonctions Excel ajoutées après 2007 doivent porter un
préfixe technique dans le fichier, faute de quoi Excel affiche une erreur de nom sur chaque cellule.
Le classeur emploie donc CHIDIST, la forme ancienne, qui fonctionne dans toutes les versions, et un
test le vérifie.
uv sync --locked --all-extras # environnement verrouillé (Python 3.12, scipy, sans bibliothèque GARCH)
uv run pytest # 10 tests synthétiques, sans réseau (quantiles, fuite, GARCH, juges)
uv run rke fetch # prix quotidiens des six FNB (quelques secondes, non commités)
uv run rke backtest # 6 modèles x 5 476 jours x 2 niveaux : tables + 3 figures (12 s mesurées)| Limite | Statut |
|---|---|
| Le GARCH utilise des innovations normales ; un GARCH-t ou un GARCH-FHS ferait mieux en queue | reconnu ; la FHS joue déjà ce rôle avec la volatilité EWMA |
| La statistique Z2 est rapportée sans p-valeur simulée (Acerbi-Székely la calculent par simulation du modèle) ; le seuil indicatif de −0,7 est un précepte, pas une mesure | déclaré |
| Poids du portefeuille tenus constants aux cibles (la rotation réelle mesurée au dépôt 03 est de 2,8 % par an) | approximation déclarée |
| Un seul portefeuille testé ; les conclusions valent pour un profil équilibré, pas pour un livre de dérivés | reconnu |
| Fenêtre unique de 500 jours et réajustement tous les 21 jours, non optimisés | choix déclarés |
| Classeur Excel/VBA de restitution pour comité de risque | à venir |
Kupiec, P. (1995), « Techniques for Verifying the Accuracy of Risk Measurement Models » ; Christoffersen, P. (1998), « Evaluating Interval Forecasts » ; Barone-Adesi, G., Giannopoulos, K. et Vosper, L. (1999), « VaR without Correlations for Portfolios of Derivative Securities » ; Bollerslev, T. (1986) ; Acerbi, C. et Székely, B. (2014), « Backtesting Expected Shortfall » ; J.P. Morgan (1996), RiskMetrics Technical Document ; Comité de Bâle (1996, 2019). Données : Yahoo Finance, usage personnel, non redistribuées. Code : Guillaume Vaudescal, 2026, licence MIT.


