Étude de cas · Énergie · Séries temporelles

Prévision de charge horaire — PJM East

Prévisions de charge à l'horizon J+1 et court-terme sur 16 ans de données réelles de consommation horaire PJME — comparaison entre SARIMA, espace d'états (UnobservedComponents + Fourier exogène) et modèles gradient boostés sur une fenêtre de validation de 60 jours.

Lecture · 6 min · 1255 mots Meilleur modèle · GBM avec variables construites MAPE · 6,2 % (vs SARIMA 14,5 %, UC 19,3 %) Données · 145 392 observations horaires · 2002–2018 Couverture IP 95 % de l'UC · 99 %

Résumé

Un régresseur gradient boosté utilisant des variables construites — décalages, moyennes glissantes et harmoniques calendaires — bat SARIMA classique sur la charge PJM East à J+1 de plus de moitié — MAPE 6,2 % vs. 14,5 %. Un modèle structurel à espace d'états (UnobservedComponents avec Fourier annuel exogène) reste en retrait sur la précision ponctuelle, mais offre une calibration des intervalles de prédiction quasi parfaite (couverture empirique de 99 % au niveau nominal 95 %), ce qui compte pour un approvisionnement conscient du risque.

Le bon modèle dépend de ce que la salle des marchés cherche à optimiser. Si le seul objectif est l'erreur attendue la plus faible, GBM gagne ; si la salle dimensionne ses couvertures et a besoin de bandes d'incertitude honnêtes, l'espace d'états gagne.

La question métier

Un opérateur de réseau régional achète l'électricité à J+1 et rééquilibre en intra-journée. Les erreurs de prévision se traduisent directement par des pénalités de déséquilibre — l'opérateur est court ou long par rapport à la demande réelle et paie l'écart. Deux questions opérationnelles reposent sur la même prévision :

Une référence SARIMA était déjà en place. Un modèle à espace d'états ou un modèle ML pourrait-il faire mieux, et sur quelle dimension ?

Données

Consommation horaire mesurée réelle de PJM East (PJME) depuis le jeu de données public Kaggle robikscube/hourly-energy-consumption : 145 392 observations horaires du 1er jan. 2002 au 3 août 2018. L'étude utilise la fenêtre 2015-01-01 → 2018-08-03 (~31 400 heures / ~3,6 ans) pour garder l'entraînement gérable sur une seule machine.

CSV · KaggleRésolution horaireSérie uniqueAucun NaN après interpolation

EDA

Trois régularités dominent la série : un fort cycle journalier (pic vers 18 h, creux vers 4 h), un cycle hebdomadaire avec creux le week-end, et un cycle annuel piloté par la climatisation estivale et le chauffage hivernal. Un effet jours fériés est visible (Noël, fête nationale) mais plus petit que l'enveloppe saisonnière.

Charge PJME : 30 derniers jours horaires, moyenne journalière et moyenne mensuelle
Figure 1. Haut : 30 derniers jours de charge horaire montrant le cycle journalier et le creux du week-end. Milieu : moyenne journalière sur tout le sous-ensemble 2015–2018. Bas : moyenne mensuelle exposant le cycle annuel en U (pics de climatisation estivale et de chauffage hivernal).
Carte de chaleur heure × jour-de-semaine de la charge moyenne
Figure 2. Charge moyenne par heure-de-la-journée × jour-de-semaine. Les après-midi de semaine concentrent la charge ; les week-ends sont uniformément plus bas. Tout modèle de prévision doit absorber au moins ces deux cycles pour être compétitif.

Approche de modélisation

Trois candidats, tous entraînés sur la série de moyennes journalières pour la traçabilité, et prévisions sur une fenêtre de validation de 60 jours :

1. SARIMA en référence

SARIMAX(2,1,2)(1,1,1)7 — AR/MA non saisonnier + AR/MA saisonnier hebdomadaire. Capture directement le cycle hebdomadaire, mais n'absorbe le cycle annuel que via le terme d'intégration non stationnaire lent, ce qui sous-ajuste la forme en U.

2. Espace d'états — UnobservedComponents + Fourier exogène

UnobservedComponents(level='local linear trend', seasonal=7, exog=Fourier(365.25, order=3)). La composante de tendance localement linéaire absorbe la dérive lente, la saisonnalité hebdomadaire discrète gère le jour-de-semaine, et trois paires d'harmoniques annuelles de Fourier passées en régresseurs exogènes absorbent doucement le cycle annuel. Estimation par maximum de vraisemblance avec filtre de Kalman pour les intervalles prédictifs.

3. Concurrent ML — régression gradient boostée

GradientBoostingRegressor(n_estimators=400, max_depth=3, learning_rate=0.05) sur les variables construites :

Aucune entrée météo exogène — la température améliorerait presque certainement les trois, mais l'objectif ici est de comparer les familles de modélisation sur le même ensemble d'information purement endogène.

Résultats

Sur la fenêtre de validation de 60 jours :

ModèleMAPERMSE (MW)Couverture IP 95 %
GBM (variables construites)6.24%2,653
SARIMA(2,1,2)(1,1,1)714.45%6,67690.0%
UC + Fourier annual exog19.28%8,295100.0%
Comparaison de prévision sur 60 jours : SARIMA vs UC vs GBM
Figure 3. Prévision sur fenêtre de validation de 60 jours. Le GBM suit l'enveloppe saisonnière visiblement plus serrée que SARIMA ou UC ; l'intervalle de prédiction 95 % de SARIMA (zone ombrée) donne une incertitude bien calibrée ; l'UC dérive légèrement bas sur la moyenne mais son intervalle contient chaque observation réalisée.
Le compromis en une ligne. Si la question est « quelle sera la charge demain ? », GBM gagne (~57 % de réduction du MAPE par rapport à SARIMA). Si la question est « donnez-moi une plage à 95 % de confiance pour la charge de demain », l'espace d'états gagne — sa couverture empirique colle de près au niveau nominal, tandis que GBM n'a pas d'intervalle natif (il faudrait du boosting par régression quantile ou de la prédiction conforme pour rivaliser sur cette dimension).

Compromis

Esquisse de déploiement

En production, je livrerais l'ensemble, pas seulement le gagnant : GBM pour la prévision ponctuelle, UC pour l'intervalle de prédiction. Opérationnellement :

Leçons

  1. « Meilleur » dépend de la métrique. 6 % de MAPE paraît décisif face à 14 % — mais les intervalles calibrés du modèle à espace d'états sont opérationnellement plus utiles pour certains usages aval que la moyenne plus serrée du GBM.
  2. Les variables construites battent les priors structurels quand les données sont riches. 31 000 heures suffisent largement à GBM pour apprendre la saisonnalité que le modèle structurel doit recevoir explicitement. Avec 5 ans de données mensuelles au lieu de 4 ans de données horaires, ce classement s'inverserait probablement.
  3. Ne choisissez pas un modèle — choisissez un système de prévision. La moyenne vient du modèle ML, l'intervalle du modèle structurel, le monitoring couvre les deux.