# Les Modèles de Forecasting à Plusieurs Variables
Dans le monde de la Data Science, la prévision (forecasting) est une compétence essentielle. Jusqu'à présent, nous avons principalement exploré les modèles de séries temporelles univariées, où une seule variable est analysée et prédite en fonction de ses propres valeurs passées. Cependant, de nombreux phénomènes réels sont intrinsèquement multivariés, c'est-à-dire qu'ils impliquent plusieurs variables qui interagissent les unes avec les autres.
> [!note] Rappel sur les séries temporelles
> Une série temporelle est une séquence d'observations mesurées à des intervalles de temps successifs. En univarié, nous prédisons $Y_t$ en fonction de $Y_{t-1}, Y_{t-2}, \dots$.
Imaginez que vous essayiez de prévoir le cours d'une action en bourse. Bien que son historique soit crucial, d'autres facteurs comme les taux d'intérêt, le prix du pétrole, ou des indicateurs économiques globaux peuvent également influencer son évolution. Ignorer ces interdépendances pourrait conduire à des prévisions sous-optimales.
Ce chapitre se propose d'explorer les modèles de forecasting à plusieurs variables. Nous verrons comment ces modèles capturent les relations dynamiques entre différentes séries temporelles pour améliorer la précision de nos prévisions. Nous aborderons les fondements théoriques, puis nous plongerons dans l'implémentation pratique avec Python, en utilisant des bibliothèques comme `statsmodels`.
> [!tip] Pré-requis
> Ce chapitre s'appuie sur les connaissances acquises en *Data Mining avec Python*, notamment sur la manipulation de données, l'analyse exploratoire et les bases des séries temporelles univariées. Une familiarité avec les concepts de stationnarité et d'autocorrélation sera très utile.
# Fondements des Séries Temporelles Multivariées
## Qu'est-ce qu'une Série Temporelle Multivariée ?
Une série temporelle multivariée est un ensemble de plusieurs séries temporelles mesurées simultanément sur la même période. Ces séries sont souvent interdépendantes, ce qui signifie que la valeur future d'une série peut dépendre non seulement de ses propres valeurs passées, mais aussi des valeurs passées des autres séries du système.
> [!definition] Série Temporelle Multivariée
> Une série temporelle multivariée $Y_t$ de dimension $k$ est un vecteur aléatoire $Y_t = (Y_{1,t}, Y_{2,t}, \dots, Y_{k,t})'$ observé à chaque instant $t$.
>
> $ Y_t = \begin{pmatrix} Y_{1,t} \\ Y_{2,t} \\ \vdots \\ Y_{k,t} \end{pmatrix} $
>
> où $Y_{i,t}$ représente la valeur de la $i$-ème variable au temps $t$.
> [!example] Exemples concrets
> * **Économie** : PIB, Taux d'inflation, Taux de chômage.
> * **Finance** : Prix de plusieurs actions ou indices boursiers.
> * **Météorologie** : Température, Pression atmosphérique, Humidité dans une région donnée.
> * **Énergie** : Consommation électrique, Production solaire, Température ambiante.
## Pourquoi utiliser des Modèles Multivariés ?
L'utilisation de modèles multivariés présente plusieurs avantages par rapport à l'approche univariée :
1. **Capturer les interdépendances** : Les modèles multivariés peuvent explicitement modéliser les relations de causalité ou de corrélation entre les différentes séries. Par exemple, une augmentation du prix du pétrole peut entraîner une augmentation des coûts de transport, ce qui affecte l'inflation.
2. **Améliorer la précision des prévisions** : En tenant compte des informations contenues dans les séries liées, les modèles multivariés peuvent souvent produire des prévisions plus précises que les modèles univariés qui traitent chaque série isolément.
3. **Analyse des chocs et des dynamiques** : Ils permettent d'analyser comment un choc sur une variable se propage à travers le système (analyse d'impulsion-réponse) et de comprendre les contributions relatives de chaque variable aux mouvements des autres.
> [!warning] Complexité accrue
> Bien que puissants, les modèles multivariés sont intrinsèquement plus complexes à spécifier, estimer et interpréter que leurs homologues univariés. Ils nécessitent plus de données et une attention particulière aux hypothèses.
# Modèles de Forecasting Multivariés Classiques
## Modèles AutoRégressifs Vectoriels (VAR)
Les modèles VAR sont une généralisation multivariée des modèles AR univariés. Ils sont parmi les plus populaires pour l'analyse et la prévision de séries temporelles multivariées.
### Théorie du VAR(p)
Un modèle VAR(p) (Vector Autoregression de d'ordre $p$) exprime chaque variable du système comme une fonction linéaire de ses propres valeurs passées et des valeurs passées de toutes les autres variables du système, jusqu'à un ordre $p$.
> [!definition] Modèle VAR(p)
> Pour une série temporelle multivariée $Y_t = (Y_{1,t}, \dots, Y_{k,t})'$ de dimension $k$, un modèle VAR(p) est donné par :
>
> $ Y_t = c + A_1 Y_{t-1} + A_2 Y_{t-2} + \dots + A_p Y_{t-p} + \epsilon_t $
>
> où :
> * $Y_t$ est un vecteur $k \times 1$ de variables au temps $t$.
> * $c$ est un vecteur $k \times 1$ de constantes (intercepts).
> * $A_i$ sont des matrices $k \times k$ de coefficients pour $i=1, \dots, p$.
> * $\epsilon_t$ est un vecteur $k \times 1$ de termes d'erreur (chocs), qui sont des bruits blancs multivariés avec $E[\epsilon_t] = 0$ et $E[\epsilon_t \epsilon_t'] = \Sigma_\epsilon$ (matrice de covariance constante et définie positive).
> * Les termes d'erreur sont non corrélés avec les valeurs passées de $Y_t$.
> [!note] Conditions de stationnarité
> Pour qu'un modèle VAR soit stable et que ses prévisions convergent, les racines du polynôme caractéristique associé doivent se situer en dehors du cercle unité. En pratique, on applique souvent le VAR à des séries déjà stationnarisées (par différenciation si nécessaire).
### Choix de l'ordre $p$
Le choix de l'ordre $p$ (nombre de lags) est crucial. Un $p$ trop faible peut omettre des informations importantes, tandis qu'un $p$ trop élevé peut entraîner un surapprentissage et une perte d'efficacité. On utilise généralement des critères d'information.
> [!tip] Critères d'information
> Les critères les plus courants pour choisir l'ordre $p$ sont :
> * **Akaike Information Criterion (AIC)** : $AIC = -2 \log(L) + 2k$
> * **Bayesian Information Criterion (BIC)** : $BIC = -2 \log(L) + k \log(N)$
> * **Hannan-Quinn Information Criterion (HQIC)**
>
> où $L$ est la vraisemblance maximale, $k$ le nombre de paramètres du modèle, et $N$ le nombre d'observations. On choisit l'ordre $p$ qui minimise ces critères.
### Implémentation en Python avec `statsmodels`
La bibliothèque `statsmodels` offre une implémentation robuste des modèles VAR.
**Étapes générales :**
1. **Préparation des données** : Charger les données, s'assurer qu'elles sont au bon format (DataFrame pandas, index temporel).
2. **Vérification de la stationnarité** : Tester chaque série. Si non stationnaire, appliquer la différenciation.
3. **Sélection de l'ordre $p$** : Utiliser les critères d'information.
4. **Estimation du modèle** : Entraîner le modèle VAR sur les données d'entraînement.
5. **Diagnostic du modèle** : Vérifier les résidus (bruit blanc, normalité, absence d'autocorrélation).
6. **Prévisions** : Générer des prévisions pour les périodes futures.
### Exemple Pratique (VAR)
Utilisons un jeu de données synthétique ou simple pour illustrer un modèle VAR. Nous allons utiliser un exemple classique en économie : l'interdépendance entre l'indice de production industrielle (IP) et le taux de chômage (UNEMP).
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.api import VAR
from statsmodels.tsa.stattools import adfuller
from statsmodels.tools.eval_measures import rmse, aic
# 1. Génération de données synthétiques (pour l'exemple)
# En réalité, vous chargereriez un fichier CSV ou Excel.
np.random.seed(42)
dates = pd.date_range(start='2000-01-01', periods=100, freq='MS')
# Série 1: Production Industrielle (IP)
ip = np.cumsum(np.random.randn(100)) + 50
# Série 2: Taux de Chômage (UNEMP)
unemp = np.cumsum(np.random.randn(100)) / 2 + 5
# Ajout d'une relation simple pour l'exemple
# Le chômage est légèrement influencé par le passé de l'IP et inversement
ip[1:] = ip[1:] + 0.3 * unemp[:-1] + np.random.randn(99)
unemp[1:] = unemp[1:] - 0.1 * ip[:-1] + np.random.randn(99) / 2
data = pd.DataFrame({'IP': ip, 'UNEMP': unemp}, index=dates)
print("Aperçu des données :")
print(data.head())
data.plot(figsize=(12, 6))
plt.title("Séries Temporelles IP et UNEMP")
plt.show()
# 2. Vérification de la stationnarité (Test ADF)
print("\n--- Tests de Stationnarité (ADF) ---")
for name, col in data.items():
result = adfuller(col)
print(f'{name}: ADF Statistic={result[0]:.2f}, p-value={result[1]:.2f}')
if result[1] > 0.05:
print(f' -> {name} est non stationnaire. Différenciation nécessaire.')
else:
print(f' -> {name} est stationnaire.')
# Si non stationnaire, différencier les séries
data_diff = data.diff().dropna()
print("\nAperçu des données différenciées :")
print(data_diff.head())
# Re-vérification de la stationnarité après différenciation
print("\n--- Tests de Stationnarité (ADF) sur données différenciées ---")
for name, col in data_diff.items():
result = adfuller(col)
print(f'{name}: ADF Statistic={result[0]:.2f}, p-value={result[1]:.2f}')
if result[1] > 0.05:
print(f' -> {name} est non stationnaire après différenciation. Problème ou ordre d\'intégration > 1.')
else:
print(f' -> {name} est stationnaire après différenciation.')
# 3. Sélection de l'ordre p
print("\n--- Sélection de l'ordre p du VAR ---")
# Utilisons le jeu de données différenciées pour l'entraînement
model = VAR(data_diff)
results_aic = []
for p in range(1, 6): # Tester les ordres de 1 à 5
result = model.fit(p)
results_aic.append({'p': p, 'AIC': result.aic, 'BIC': result.bic, 'HQIC': result.hqic})
results_df = pd.DataFrame(results_aic)
print(results_df)
# Le critère BIC est souvent préféré pour sa parcimonie
best_p_bic = results_df.loc[results_df['BIC'].idxmin()]['p']
print(f"\nOrdre p optimal selon BIC : {int(best_p_bic)}")
# 4. Estimation du modèle VAR
optimal_p = int(best_p_bic) # Ou un autre critère
model_fitted = model.fit(optimal_p)
print(f"\n--- Résumé du modèle VAR({optimal_p}) ---")
print(model_fitted.summary())
# 5. Diagnostic du modèle (résidus)
# On peut inspecter les résidus pour s'assurer qu'ils sont du bruit blanc
# model_fitted.plot_acorr() # Plot de la fonction d'autocorrélation des résidus
# plt.show()
# 6. Prévisions
n_forecast = 10 # Nombre de périodes à prévoir
forecast_input = data_diff.values[-optimal_p:] # Derniers p points pour la prévision
# Prévisions
fc = model_fitted.forecast(y=forecast_input, steps=n_forecast)
df_forecast = pd.DataFrame(fc, index=pd.date_range(start=data.index[-1] + data.index.freq, periods=n_forecast, freq=data.index.freq), columns=data.columns)
print(f"\n--- Prévisions pour les {n_forecast} prochaines périodes (différenciées) ---")
print(df_forecast)
# Pour obtenir les prévisions sur les données originales, il faut inverser la différenciation (cumul)
# C'est une étape délicate et dépend de l'ordre de différenciation.
# Ici, pour une première différenciation:
last_values = data.iloc[-1].values
forecast_original = np.cumsum(df_forecast.values, axis=0) + last_values
df_forecast_original = pd.DataFrame(forecast_original, index=df_forecast.index, columns=data.columns)
print(f"\n--- Prévisions pour les {n_forecast} prochaines périodes (originales) ---")
print(df_forecast_original)
# Visualisation des prévisions
plt.figure(figsize=(14, 7))
plt.plot(data.index, data['IP'], label='IP Réel')
plt.plot(data.index, data['UNEMP'], label='UNEMP Réel')
plt.plot(df_forecast_original.index, df_forecast_original['IP'], label='IP Prévu', linestyle='--')
plt.plot(df_forecast_original.index, df_forecast_original['UNEMP'], label='UNEMP Prévu', linestyle='--')
plt.title(f"Prévisions VAR({optimal_p}) sur IP et UNEMP")
plt.legend()
plt.show()
```
> [!note] Interprétation des coefficients VAR
> Les matrices $A_i$ du modèle VAR(p) montrent l'impact des lags de chaque variable sur toutes les autres variables du système. Par exemple, $A_1[0,1]$ représente l'impact de $Y_{2,t-1}$ sur $Y_{1,t}$. C'est la force de ces modèles : comprendre ces interdépendances.
## Modèles à Correction d'Erreur Vectoriels (VECM)
Les modèles VAR sont adaptés aux séries stationnaires. Que se passe-t-il si nos séries sont non stationnaires mais co-intégrées ? Dans ce cas, un modèle VECM est plus approprié.
### Théorie du VECM
Un VECM est une forme restreinte d'un VAR qui est conçue pour être utilisée avec des séries co-intégrées. Il modélise les changements (différences) des variables en fonction des lags de ces changements et d'un terme de correction d'erreur qui capture la relation d'équilibre à long terme.
> [!definition] Modèle VECM(p)
> Pour une série temporelle multivariée $Y_t$ de dimension $k$ qui est $I(1)$ (intégrée d'ordre 1) et co-intégrée avec $r$ relations de co-intégration, un modèle VECM(p) est donné par :
>
> $ \Delta Y_t = \Pi Y_{t-1} + \sum_{i=1}^{p-1} \Gamma_i \Delta Y_{t-i} + \epsilon_t $
>
> où :
> * $\Delta Y_t = Y_t - Y_{t-1}$ est le vecteur des premières différences.
> * $\Pi = \alpha \beta'$ est une matrice $k \times k$ de rang $r$ (le nombre de relations de co-intégration).
> * $\alpha$ est une matrice $k \times r$ des coefficients d'ajustement (speed of adjustment).
> * $\beta'$ est une matrice $r \times k$ des vecteurs de co-intégration, représentant les relations d'équilibre à long terme.
> * $\Gamma_i$ sont des matrices $k \times k$ de coefficients pour les dynamiques à court terme.
> * $\epsilon_t$ est un vecteur de bruits blancs multivariés.
>
> Le terme $\Pi Y_{t-1}$ est le **terme de correction d'erreur**. Il représente la déviation des variables par rapport à leur relation d'équilibre à long terme à l'instant $t-1$. Si $Y_{t-1}$ s'écarte de l'équilibre, ce terme "corrige" les changements futurs ($\Delta Y_t$) pour ramener le système vers l'équilibre.
### Test de Co-intégration (Johansen)
Avant d'estimer un VECM, il est impératif de tester la présence de co-intégration et de déterminer le nombre de relations de co-intégration ($r$). Le test de Johansen est le plus couramment utilisé.
> [!theorem] Test de Johansen
> Le test de Johansen évalue la présence de relations de co-intégration en examinant le rang de la matrice $\Pi$. Il utilise deux statistiques : la statistique de trace et la statistique de la valeur propre maximale.
### Implémentation en Python avec `statsmodels`
`statsmodels` propose également des outils pour les VECM.
**Étapes générales :**
1. **Préparation des données** : Charger les données.
2. **Vérification de la non-stationnarité individuelle** : S'assurer que les séries sont $I(1)$.
3. **Test de co-intégration de Johansen** : Déterminer le nombre de relations de co-intégration ($r$).
4. **Sélection de l'ordre $p$** : Pour les termes en différence du VECM.
5. **Estimation du modèle VECM** : Entraîner le modèle.
6. **Diagnostic du modèle** : Vérifier les résidus.
7. **Prévisions** : Générer des prévisions.
### Exemple Pratique (VECM)
Prenons un exemple où deux séries sont non stationnaires mais co-intégrées, comme les prix de deux matières premières substituts ou les taux de change de deux devises liées.
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.vector_ar.vecm import coint_johansen, VECM
from statsmodels.tsa.stattools import adfuller
# 1. Génération de données synthétiques co-intégrées
np.random.seed(42)
dates = pd.date_range(start='2000-01-01', periods=150, freq='MS')
# Deux séries I(1)
series_a = np.cumsum(np.random.randn(150)) + 100
series_b = np.cumsum(np.random.randn(150)) + 100
# Créons une relation de co-intégration: series_a et series_b ont une relation à long terme
# Par exemple, series_b est environ 0.8 * series_a + bruit
error_term = np.random.randn(150) * 2
series_b_cointegrated = 0.8 * series_a + 10 + error_term
data_vecm = pd.DataFrame({'SeriesA': series_a, 'SeriesB': series_b_cointegrated}, index=dates)
print("Aperçu des données co-intégrées :")
print(data_vecm.head())
data_vecm.plot(figsize=(12, 6))
plt.title("Séries Temporelles Co-intégrées (ex: Prix de deux actifs)")
plt.show()
# 2. Vérification de la non-stationnarité individuelle (Test ADF)
print("\n--- Tests de Stationnarité (ADF) ---")
for name, col in data_vecm.items():
result = adfuller(col)
print(f'{name}: ADF Statistic={result[0]:.2f}, p-value={result[1]:.2f}')
if result[1] > 0.05:
print(f' -> {name} est non stationnaire (I(1) probable).')
else:
print(f' -> {name} est stationnaire.')
# 3. Test de co-intégration de Johansen
# Le test de Johansen nécessite des données non différenciées
# On doit spécifier l'ordre du VAR sous-jacent (lags du VECM + 1)
# Utilisons un lag de 2 pour commencer (correspond à p-1 = 1 pour VECM(p))
print("\n--- Test de Co-intégration de Johansen ---")
# On utilise un lag de 1 pour les différences dans le VECM, donc p=2 pour le VAR sous-jacent
# `k_diff` est le nombre de lags des termes en différence dans le VECM.
# `k_diff = 1` correspond à un VAR(2) sous-jacent.
johansen_test = coint_johansen(data_vecm, det_order=0, k_diff=1) # det_order=0 pour pas de constante dans la relation de co-intégration
# Les valeurs propres sont cruciales pour déterminer le nombre de relations de co-intégration
print("Valeurs propres (eigenvalues) :", johansen_test.eig)
print("Statistiques de trace :", johansen_test.lr1)
print("Valeurs critiques (trace, 90%, 95%, 99%) :\n", johansen_test.cvt)
print("Statistiques de la valeur propre maximale :", johansen_test.lr2)
print("Valeurs critiques (max_eig, 90%, 95%, 99%) :\n", johansen_test.cvm)
# Interprétation: Comparer les statistiques de trace/max_eig avec les valeurs critiques.
# Si lr1[i] > cvt[i, 1] (95%), on rejette l'hypothèse de (i) relations de co-intégration.
# On cherche le plus grand 'r' pour lequel on ne rejette PAS l'hypothèse.
# Généralement, on regarde le premier 'r' pour lequel la statistique est inférieure à la valeur critique.
# Par exemple, si lr1[0] > cvt[0,1] mais lr1[1] < cvt[1,1], alors il y a 1 relation de co-intégration.
# Supposons qu'on ait trouvé 1 relation de co-intégration (r=1) pour cet exemple.
num_cointegrating_relations = 1 # Déterminé par l'analyse du test de Johansen
# 4. Sélection de l'ordre p pour le VECM (lags des différences)
# On peut utiliser les mêmes critères que pour le VAR, mais sur les données différenciées pour les lags internes.
# Pour le VECM, l'ordre p fait référence aux lags des termes en différence.
# Pour un VECM(p), on a p-1 lags de différences.
# statsmodels utilise `k_ar_diff` pour l'ordre des termes en différence.
# Il est souvent recommandé de choisir `k_ar_diff` en minimisant l'AIC/BIC pour un VAR sur les séries différenciées.
# Ou, on peut simplement essayer quelques valeurs. Choisissons 1 pour cet exemple (correspond à VAR(2) sous-jacent).
k_ar_diff = 1 # Nombre de lags des termes en différence
# 5. Estimation du modèle VECM
model_vecm = VECM(data_vecm, k_ar_diff=k_ar_diff, coint_rank=num_cointegrating_relations)
vecm_res = model_vecm.fit()
print(f"\n--- Résumé du modèle VECM(k_ar_diff={k_ar_diff}, coint_rank={num_cointegrating_relations}) ---")
print(vecm_res.summary())
# 6. Diagnostic du modèle (résidus)
# vecm_res.plot_acorr()
# plt.show()
# 7. Prévisions
n_forecast_vecm = 10
forecast_vecm = vecm_res.predict(steps=n_forecast_vecm)
df_forecast_vecm = pd.DataFrame(forecast_vecm, index=pd.date_range(start=data_vecm.index[-1] + data_vecm.index.freq, periods=n_forecast_vecm, freq=data_vecm.index.freq), columns=data_vecm.columns)
print(f"\n--- Prévisions VECM pour les {n_forecast_vecm} prochaines périodes ---")
print(df_forecast_vecm)
# Visualisation des prévisions
plt.figure(figsize=(14, 7))
plt.plot(data_vecm.index, data_vecm['SeriesA'], label='SeriesA Réel')
plt.plot(data_vecm.index, data_vecm['SeriesB'], label='SeriesB Réel')
plt.plot(df_forecast_vecm.index, df_forecast_vecm['SeriesA'], label='SeriesA Prévu', linestyle='--')
plt.plot(df_forecast_vecm.index, df_forecast_vecm['SeriesB'], label='SeriesB Prévu', linestyle='--')
plt.title(f"Prévisions VECM (k_ar_diff={k_ar_diff}, coint_rank={num_cointegrating_relations})")
plt.legend()
plt.show()
```
> [!note] Interprétation des coefficients VECM
> * **Matrice $\beta'$** : Les lignes de $\beta'$ sont les vecteurs de co-intégration. Elles décrivent la relation d'équilibre à long terme. Si $\beta' = (1, -0.8)$, cela signifie que $Y_{1,t} - 0.8 Y_{2,t}$ est stationnaire, donc $Y_{1,t} \approx 0.8 Y_{2,t}$ à long terme.
> * **Matrice $\alpha$** : Les colonnes de $\alpha$ sont les coefficients d'ajustement. Elles indiquent à quelle vitesse chaque variable s'ajuste pour corriger les déviations de la relation d'équilibre à long terme. Un coefficient négatif et significatif pour une variable $Y_i$ indique que $Y_i$ réagit aux déséquilibres pour ramener le système à l'équilibre.
## Autres Modèles et Approches (Bref aperçu)
Bien que les modèles VAR et VECM soient des piliers du forecasting multivarié, d'autres approches existent :
* **VARMAX (Vector AutoRegressive Moving Average with eXogenous regressors)** : Une extension des modèles VAR qui inclut des termes de moyenne mobile (MA) et la possibilité d'ajouter des variables exogènes (X) qui ne sont pas modélisées mais influencent les variables endogènes.
* **Modèles à Espaces d'États (State-Space Models)** : Une formulation très générale qui peut englober de nombreux modèles de séries temporelles (y compris VAR, VECM, ARIMA) et qui est particulièrement utile pour les systèmes complexes, les données manquantes ou les modèles à coefficients variables.
* **Modèles basés sur le Machine Learning (ML) et le Deep Learning (DL)** :
* **Gradient Boosting (XGBoost, LightGBM)** : Peuvent être adaptés au forecasting multivarié en transformant le problème en une série de prédictions univariées ou en utilisant des approches multivariées spécifiques.
* **Réseaux de Neurones Récurrents (RNN) et Long Short-Term Memory (LSTM)** : Particulièrement efficaces pour capturer les dépendances temporelles complexes dans les séries multivariées, surtout avec de grandes quantités de données. Ces modèles seront probablement abordés dans des chapitres futurs sur le Deep Learning pour les séries temporelles.
# Étapes Clés pour le Forecasting Multivarié
La construction d'un modèle de forecasting multivarié robuste suit un processus structuré.
## Préparation des Données
1. **Collecte et Nettoyage** : Assurer la qualité des données, gérer les valeurs manquantes (imputation, suppression).
2. **Synchronisation** : Toutes les séries doivent être mesurées à la même fréquence et sur la même période.
3. **Transformation** :
* **Logarithme** : Pour stabiliser la variance et rendre les relations plus linéaires.
* **Différenciation** : Pour rendre les séries stationnaires (essentiel pour VAR).
4. **Normalisation/Standardisation** : Peut être utile pour certains algorithmes de ML, mais moins critique pour VAR/VECM qui sont basés sur des régressions linéaires.
## Sélection du Modèle
1. **Analyse Exploratoire des Données (EDA)** : Visualiser les séries, calculer les matrices de corrélation croisée (CCF) pour identifier les dépendances.
2. **Tests de Stationnarité** : Appliquer les tests ADF ou KPSS à chaque série.
3. **Tests de Co-intégration** : Si les séries sont non stationnaires $I(1)$, utiliser le test de Johansen pour déterminer le nombre de relations de co-intégration.
* Si les séries sont stationnaires : VAR sur les données originales.
* Si les séries sont non stationnaires mais co-intégrées : VECM.
* Si les séries sont non stationnaires et non co-intégrées : Différencier jusqu'à stationnarité et utiliser un VAR sur les données différenciées.
4. **Sélection de l'Ordre de Lag (p)** : Utiliser les critères d'information (AIC, BIC, HQIC) pour le VAR ou le VECM.
## Évaluation des Prévisions
1. **Division Train/Test** : Toujours séparer les données en un ensemble d'entraînement et un ensemble de test, en respectant l'ordre temporel.
2. **Métriques d'Évaluation** :
* **RMSE (Root Mean Squared Error)** : $\sqrt{\frac{1}{N} \sum_{i=1}^N (y_i - \hat{y}_i)^2}$
* **MAE (Mean Absolute Error)** : $\frac{1}{N} \sum_{i=1}^N |y_i - \hat{y}_i|$
* **MAPE (Mean Absolute Percentage Error)** : $\frac{100}{N} \sum_{i=1}^N \left| \frac{y_i - \hat{y}_i}{y_i} \right|$
* Pour les modèles multivariés, ces métriques peuvent être calculées pour chaque série ou agrégées.
3. **Validation Croisée pour Séries Temporelles** : Les techniques de validation croisée traditionnelles (k-fold) ne sont pas adaptées aux séries temporelles en raison de la dépendance temporelle. Des méthodes comme la **validation croisée glissante (rolling forecast origin)** sont préférables.
> [!warning] Piège des régressions fallacieuses
> Utiliser des séries non stationnaires (I(1) ou plus) dans un modèle de régression linéaire standard (ou VAR sans co-intégration) peut conduire à des résultats trompeurs, où des corrélations apparentes n'existent pas réellement. C'est pourquoi la stationnarité et la co-intégration sont si importantes.
# ➡️ C'est la fin !
- Cours précèdent: [[Cours 2 - Forecasting]]
- Prochain cours: [[Exercices - Forecasting]]
- Page d'accueil de la compétence: [[Forecasting]]
# 🗓️ Historique
- Dernière MAJ: `20-Octobre-2025`
- Rédigé par: [[Hamilton DE ARAUJO]]