Résolution des modèles DSGE

Macro II - Fluctuations - ENSAE, 2025-2026

Author

Pablo Winant

Published

March 18, 2026

Introduction

Quelle est la principale spécificité de la modélisation économique ?

En économie, nous modélisons le comportement des agents économiques en spécifiant :

  • leur objectif \[\max_{c_t} E_t \sum_{s\geq t} \beta^s U(c_s)\] \[\max \pi_t\] \[\cdots\]
  • leurs contraintes (contrainte budgétaire, environnement éco…)

. . .

En macro-économie, cette approche a été développée par les nouveaux classiques (Lucas, Sargent, Barro, Kydland & Prescott, etc.): on parle de micro-fondations.

. . .

Cela a des implications importantes :

  • les modèles macro donnent une part importante aux anticipations
  • les modèles macro doivent être résolus

Dans de nombreux cas, il n’existe pas de forme fermée pour la solution -> il faut des techniques numériques

Dynare

  • 1996 : Michel Juillard crée un logiciel open source pour résoudre des modèles DSGE
    • DSGE : Dynamic Stochastic General Equilibrium
      • historiquement: extensions du modèle RBC
      • maintenant utilisés pour une large classe de modèles
    • généralement résolus autour d’un état stationnaire
  • Aujourd’hui, environ 10 contributeurs.
    • \(+\) des power users qui ont contribué au code
  • Il a été largement adopté :
    • premières versions sous Gauss
    • puis Matlab/Octave/Scilab
    • dernière version en Julia
  • Dans ce cours, on utilise dyno 🦖, une variante en python
    • compatible avec les modfiles dynare
    • syntax simplifiée + interface graphique

Michel Juillard

Modèles DSGE dans les institutions

Aujourd’hui, la plupart des modèles DSGE développés dans les institutions ont une version Dynare (FMI/GIMF, CE/Quest, BCE/, NYFed/FRBNY)

  • ils sont généralement basés sur le modèle de taille intermédiaire de Smets & Wouters (10 équations)
  • mais ils ont beaucoup grandi (>>100 équations)

. . .

Les institutions, portées par les chercheurs, diversifient leurs modèles

  • Modèles semi-structurels
  • Modèles d’équilibre général calculable
  • Modèles de réseaux
  • Modèles à agents
  • Modèles à agents hétérogènes

Plan

Plan des séances:

  • Comment les modèles sont résolus (aujourd’hui)
  • Petite économie ouverte (aka modèle IRBC)
  • Hétérogénéité (T.B.C.)
  • Intermédiation financière (T.B.C.)
NoteObjectifs pédagogiques
  • consolider les connaissances sur le modèle RBC et la méthodologie associée
  • utiliser la modélisation DSGE (dynare) analyser un modèle
  • développer la culture des cycles réels en discutant quelques extensions

Résolution d’un modèle

RBC in Dynare

var y, c, k, a, h, b;
varexo e, u;
parameters beta, rho, alpha, delta, theta, psi, tau, phi;

alpha = 0.36;
rho   = 0.95;
tau   = 0.025;
beta  = 0.99;
delta = 0.025;
psi   = 0;
theta = 2.95;

model;
c*theta*h^(1+psi)=(1-alpha)*y;
k = beta*(((exp(b)*c)/(exp(b(+1))*c(+1)))
    *(exp(b(+1))*alpha*y(+1)+(1-delta)*k));
y = exp(a)*(k(-1)^alpha)*(h^(1-alpha));
k = exp(b)*(y-c)+(1-delta)*k(-1);
a = rho*a(-1)+tau*b(-1) + e;
b = tau*a(-1)+rho*b(-1) + u;
end;

steadystate_model;
y = 1.08068253095672;
c = 0.80359242014163;
h = 0.29175631001732;
k = 11.08360443260358;
a = 0;
b = 0;
e = 0;
u = 0;
end;

shocks;
var e; stderr 0.009;
var u; stderr 0.009;
var e, u = phi*0.009*0.009;
end;

stoch_simul;

Les symboles

Un modèle peut contenir différent symboles:

  • variables (endogènes): résolues par le modèles
    • variable de saut : apparaît en \(t\) ou \(t+1\)
    • variable prédéterminée : apparaît en \(t-1\) et \(t\) (éventuellement \(t+1\))
    • variable statique : apparaît seulement en \(t\)
      • peut être exprimée en fonction d’autres variables
  • variable exogène : les chocs i.i.d.
  • paramètres: quantités fixes
Tip

Dans un modefile dynare, tous les symboles sont déclarés avant d’être utilisés:

  • var y, c, k, a, h, b; : définit les variables \(y_t, c_t, k_t, a_t, h_t, b_t\)

  • varexo e, u; : définit les chocs i.i.d. \(e_t\) et \(u_t\)

    • les chocs sont ensuite spécifiés dans le block shocksend
  • parameters alpha, ....;: déclare les constantes

    • les valeurs sont données en ligne
var y, c, k, a, h, b;
varexo e, u;
parameters beta, rho, alpha, delta, theta, psi, tau, phi;

alpha = 0.36;
rho   = 0.95;
tau   = 0.025;
beta  = 0.99;

Le timing des équations

Tip

Dans un modefile dynare, les équations du modèle sont codées dans le bloc model; ... ; end;.

La variable \(v_t\) (resp \(v_{t-1}\), \(v_{t+1}\)) est notée v ou v(0) (resp v(-1), v(+1)).

Il doit y avoir une équation par variable.

model;
c*theta*h^(1+psi)=(1-alpha)*y;
k = beta*(((exp(b)*c)/(exp(b(+1))*c(+1)))
    *(exp(b(+1))*alpha*y(+1)+(1-delta)*k));
y = exp(a)*(k(-1)^alpha)*(h^(1-alpha));
k = exp(b)*(y-c)+(1-delta)*k(-1);
a = rho*a(-1)+tau*b(-1) + e;
b = tau*a(-1)+rho*b(-1) + u;
end;

Convention générale de timing

  • La nouvelle information arrive avec les innovations \(\epsilon_t\).

  • À la date \(t\), l’ensemble d’information est engendré par \(\mathcal{F}_t = \mathcal{F} (\cdots, \epsilon_{t-3}, \epsilon_{t-2}, \epsilon_{t-1}, \epsilon_t)\)

  • Par convention, une variable endogène a l’indice \(t\) si elle est connue pour la première fois à la date \(t\).

. . .

Le timing des équations: examples

Avec les conventions de timing de Dynare :

  • Écrire la fonction de production dans le modèle RBC

  • Écrire la loi de mouvement du capital \(k\), avec un taux de dépréciation \(\delta\) et l’investissement \(i\)

    • quand le capital est-il connu ?
    • quand l’investissement est-il connu ?
  • Ajouter un choc multiplicatif d’efficacité de l’investissement \(\chi_t\). Supposer qu’il suit un \(AR1\) piloté par l’innovation \(\eta_t\) et l’autocorrélation \(\rho_{\chi}\)

    • comment écrivez-vous la loi de mouvement du capital ?

Modèle

Une représentation très concise d’un modèle

\[\mathbb{E}_t \left[ f(y_{t+1}, y_t, y_{t-1}, \epsilon_t) \right]= 0\]

Le problème :

  • \(y_t\in\mathbb{R}^n\) : le vecteur des variables endogènes
  • \(\epsilon_t\in\mathbb{R}^{n_e}\) : le vecteur des variables exogènes
    • on suppose que \(\epsilon_t\) est un processus gaussien centré
  • \(f: \mathbb{R}^n\rightarrow \mathbb{R}^n\) : les équations du modèle

La solution :

  • \(g\) telle que \(\forall t, y_t = g(y_{t-1},\epsilon_t)\)
  • \(g\) est la règle de décision / politique
  • elle caractérise la dynamique du modèle résolu

La situation est différente lorsqu’on réalise une simulation en prévision parfaite.

État stationnaire

L’état stationnaire déterministe vérifie :

\[f(\overline{y},\overline{y}, \overline{y}, 0)= 0\]

Souvent, il existe une solution en forme fermée.

Sinon, il faut recourir à un solveur numérique pour résoudre

\[\overline{y}\rightarrow f(\overline{y},\overline{y}, \overline{y}, 0)\]

Dans dynare, les valeurs d’état stationnaire sont fournies dans le bloc steadystate_model; ... ; end;.

On peut vérifier qu’elles sont correctes avec l’instruction check;.

Pour trouver numériquement l’état stationnaire : steady;.

steadystate_model;
y = 1.08068253095672;
c = 0.80359242014163;
h = 0.29175631001732;
k = 11.08360443260358;
end;

Le système implicite

En remplaçant la solution \[y_t = \color{red}{g}(y_{t-1},\epsilon_t)\] dans le système \[\mathbb{E}_t \left[ f(y_{t+1}, y_t, y_{t-1}, \epsilon_t) \right]= 0\]

on obtient :

\[\mathbb{E}_t \left[ f(\color{red}{g}(\color{red}{g}(y_{t-1},\epsilon_{t}),\epsilon_{t+1}), \color{red}{g}(y_{t-1},\epsilon_t), y_{t-1}, \epsilon_t) \right]= 0\]

C’est une équation qui définit implicitement la fonction \(\color{red}{g}()\)

L’espace d’état

\[\mathbb{E}_t \left[ f(\color{red}{g}(\color{red}{g}(y_{t-1},\epsilon_{t}),\epsilon_{t+1}), \color{red}{g}(y_{t-1},\epsilon_t), y_{t-1}, \epsilon_t) \right]= 0\]

Dans cette expression, \(y_{t-1},\epsilon_t\) est l’espace d’état :

  • il contient toute l’information disponible en \(t\) pour prédire l’évolution future de \((y_s)_{s\geq t}\)

. . .

En supprimant les indices temporels, l’équation doit être satisfaite pour toute réalisation de \((y,\epsilon)\) \[\forall (y,\epsilon)\ \Phi(\color{red}{g})(y,\epsilon) = \mathbb{E}_{\epsilon'} \left[ f(\color{red}{g}(\color{red}{g}(y,\epsilon),\epsilon'), \color{red}{g}(y,\epsilon), y, \epsilon) \right]= 0\]

C’est une équation fonctionnelle \(\Phi(\color{red}{g})=0\)

Chocs anticipés

Approximation du premier ordre :

  • Supposer \(|\epsilon|<<1\),\(|\epsilon'|<<1\)

Effectuer un développement de Taylor par rapport au choc futur :

\[\begin{align} & & \mathbb{E}_{\color{green}{\epsilon'}} \left[ f(g(g(y,\epsilon),\color{green}{\epsilon'}), g(y,\epsilon), y, \epsilon) \right] \\ = & & \mathbb{E}_{\color{green}{\epsilon'}}\left[ f(g(g(y,\epsilon),0), g(y,\epsilon), y, \epsilon) \right] \\ & & + \mathbb{E}_{\color{green}{\epsilon'}} \left[ f^{\prime}_{y_{t+1}}(g(g(y,\epsilon),0), g(y,\epsilon), y, \epsilon) g^{\prime}_{\epsilon} \color{green}{\epsilon'}\right] + o(\epsilon^{\prime}) \\ \approx & & f(g(g(y,\epsilon),0), g(y,\epsilon), y, \epsilon) \end{align}\]

. . .

On utilise le fait que \(\mathbb{E}\left[ \epsilon^{\prime}\right] = 0\).

Au premier ordre, les chocs anticipés ne jouent aucun rôle.

Pour capturer les comportements de précaution (comme les primes de risque), il faut augmenter l’ordre d’approximation.

Perturbation du premier ordre

Il nous reste le système :

\[F(y,\epsilon) = f(g(g(y,\epsilon),0), g(y,\epsilon), y, \epsilon) = 0\]

Une variante du théorème des fonctions implicites donne alors l’existence d’une première approximation de \(g\) :

\[g(y,\epsilon) = \overline{y} + g^{\prime}_{y} (y-\overline{y}) + g^{\prime}_e \epsilon_t \]

. . .

Les quantités inconnues \(g^{\prime}_y\), et \(g^{\prime}_e\) sont obtenues avec la méthode des coefficients indéterminés. On injecte la première approximation dans le système et on écrit les conditions \[F^{\prime}_y(\overline{y}, 0) = 0\] \[F^{\prime}_\epsilon(\overline{y}, 0) = 0\]

Calcul de \(g^{\prime}_y\)

Rappel du système : \[F(y,\epsilon) = f(g(g(y,\epsilon),0), g(y,\epsilon), y, \epsilon) = 0\]

On a \[F^{\prime}_y(\overline{y}, 0) = f^{\prime}_{y_{t+1}} g^{\prime}_y g^{\prime}_y + f^{\prime}_{y_{t}} g^{\prime}_y + f^{\prime}_{y_{t-1}} = 0 \]

. . .

\(g^{\prime}_y\) est la solution d’une équation de Riccati spécifique \[A X^2 + B X + C\]\(A,B,C\) et \(X=g^{\prime}_y\) sont des matrices carrées \(\in \mathbb{R}^n \times \mathbb{R}^n\)

Modèle déterministe du premier ordre

Faisons une pause pour observer le modèle déterministe du premier ordre : \[A X^2 + B X + C\]

D’après notre intuition en dimension 1, on sait qu’il doit y avoir plusieurs solutions

  • comment les trouver ?
  • comment sélectionner les bonnes ?

En l’absence de chocs, la dynamique du modèle est donnée par \[y_t = X y_{t-1}\]

Quelle est la condition pour que le modèle soit stationnaire ?

. . .

-> la plus grande valeur propre de \(X\) doit être inférieure à 1

Développer l’intuition en dimension 1.

Multiplicité des solutions

On peut montrer que le système est associé à \(2 n\) valeurs propres généralisées :

\[|\lambda_1| \leq \cdots \leq |\lambda_{2 n}|\]

Pour chaque choix \(C\) de \(n\) valeurs propres (\(|C|=n\)), une solution récursive spécifique \(X_C\) peut être construite. Elle a pour valeurs propres \(C\).

. . .

Cela donne au moins \(\left(\begin{matrix} 2 n \\ n \end{matrix}\right)\) combinaisons différentes.

. . .

Un modèle est bien défini lorsqu’il existe exactement une solution non divergente.

Ceci est équivalent à :

\[|\lambda_1| \leq \cdots \leq |\lambda_{n}| \leq 1 < |\lambda_{n+1}| \leq \cdots \leq |\lambda_{2 n}|\]

Exemple 1

Inflation orientée vers le futur :

\[\pi_t = \alpha \pi_{t+1}\] avec \(\alpha<1\).

Le modèle est-il bien défini ?

. . .

On peut réécrire le système :

\[\alpha \pi_{t+1} - \pi_t + 0 \pi_{t-1} = 0\]

ou

\[\pi_{t+1} - \left(\frac{1}{\alpha} + 0 \right)\pi_t + \left(\frac{1}{\alpha} 0\right) \pi_{t-1} = 0\]

. . .

Les valeurs propres généralisées sont \(0\leq 1 < \frac{1}{\alpha}\).

. . .

La solution stable unique est \(\pi_t=0 \pi_{t-1}\)

Exemple 2

Équation d’accumulation de dette par un agent rationnel :

\[b_{t+1} - (1+\frac{1}{\beta}) b_t + \frac{1}{\beta} b_{t-1} = 0\]

Le modèle est-il bien défini ?

. . .

Deux valeurs propres généralisées \(\lambda_1=1 < \lambda_2=\frac{1}{\beta}\)

. . .

La solution unique non divergente est \(b_t = b_{t-1}\).

  • c’est une racine unitaire : toute déviation initiale de \(b_{t-1}\) a des effets persistants

Exemple 3

Processus de productivité : \[z_t = \rho z_{t-1}\] avec \(\rho<1\) : bien défini

. . .

Dans ce cas, il existe une valeur propre infinie cachée \(\infty\) associée à \(z_{t+1}\).

. . .

Pour voir pourquoi, considérer le système associé aux valeurs propres \(m\) et \(\rho\) : \[z_{t+1} - (m+\rho) z_t + m \rho z_{t-1} = 0\]

\[\frac{1}{m} z_{t+1} - (1+\frac{\rho}{m}) z_t + \rho z_{t-1} = 0\]

Ce qui correspond au modèle initial quand \(m=\infty\)

. . .

Les valeurs propres généralisées sont \(\lambda_1 = \rho \leq 1 < \lambda_2 = \infty\)

Plus généralement, toute variable qui n’apparaît pas en \(t+1\) crée une valeur propre généralisée infinie.

Un critère de bonne définition

En regardant à nouveau la liste des valeurs propres, on met de côté les valeurs infinies.

Le modèle est bien spécifié ssi on peut ordonner les valeurs propres comme suit :

\[|\lambda_1| \leq \cdots \leq |\lambda_{n}| \leq 1 < |\lambda_{n+1}| \leq \cdots |\lambda_{n+k}| \leq \underbrace{|\lambda_{n+k+1}| \cdots \leq |\lambda_{2 n}|}_{\text{valeurs propres infinies}}\]

NoteCritère de Blanchard-Kahn

Le modèle satisfait le critère de Blanchard-Kahn si le nombre de valeurs propres supérieures à un est exactement égal au nombre de variables apparaissant en \(t+1\).

Dans ce cas, le modèle est bien défini.

Dans Dynare, la résolution échoue si le critère n’est pas satisfait. La commande check en plus de vérifier l’état stationnaire, vérifie aussi les conditions de BK.

Calcul de la solution

Il existe plusieurs méthodes classiques pour calculer la solution de l’équation algébrique de Riccati : \[A X^2+ B X + C=0\]

  • décomposition qz
    • traditionnellement utilisée dans la littérature DSGE depuis Chris Sims
    • un peu contre-intuitive
  • réduction cyclique
    • nouveau défaut dans dynare, mieux adaptée aux grands modèles
  • itération temporelle linéaire cf @sec:linear_time_iteration
    • conceptuellement très simple

Calcul de \(g^{\prime}_{e}\)

Maintenant que nous avons \(g^{\prime}_y\), comment obtenir \(g^{\prime}_{e}\) ?

Rappel : \[F(y,\epsilon) = f(g(g(y,\epsilon),0), g(y,\epsilon), y, \epsilon) = 0\]

On a \[F^{\prime}_e(\overline{y}, 0) = f^{\prime}_{y_{t+1}} g^{\prime}_y g^{\prime}_e + f^{\prime}_{y_{t}} g^{\prime}_e + f^{\prime}_{\epsilon_t} = 0 \]

Maintenant c’est facile :

\[g^{\prime}_e = - (f^{\prime}_{y_{t+1}} g^{\prime}_y + f^{\prime}_{y_{t}} )^{-1} f^{\prime}_{\epsilon_t} = 0 \]

La solution du modèle

Le résultat de la résolution du modèle : \[y_t = g_y y_{t-1} + g_e \epsilon_t\]

C’est un AR1, piloté par le choc exogène \(\epsilon_t\).

. . .

Comme c’est une structure bien connue, on peut analyser le modèle avec

  • des fonctions de réponse impulsionnelle
  • des simulations stochastiques

. . .

Puis, pour comparer le modèle aux données, on calcule

  • les moments implicites :
    • covariances, autocorrélation
  • la vraisemblance

Optimiser l’ajustement aux données s’appelle l’estimation du modèle

Conclusion

Que faire avec la solution

La solution d’un modèle trouvée par Dynare a une forme particulièrement simple : un AR1

  • \(y_t = X y_{t-1} + Y \epsilon_t\)
  • où les covariances \(\Sigma\) de \(\epsilon_t\) peuvent être choisies par le modélisateur

. . .

Avec cette solution, on peut (cf prochain TD)

  • calculer des moments (conditionnels et inconditionnels)
  • réaliser des simulations stochastiques, fonctions de réponse impulsionnelle

. . .

Aller plus loin

Amener le modèle aux données avec Dynare

  • “estimer” le modèle : calculer la vraisemblance d’une solution et la maximiser en choisissant les bons paramètres
  • “identifier” les chocs dans les données

Autres fonctions

  • approximation d’ordre supérieur
  • simulations en prévision parfaite (non linéaires)
  • plan de Ramsey
  • politique discrétionnaire

À venir

De nombreux modèles

Annexe : itération temporelle linéaire

Itération temporelle linéaire

Rappel du système à résoudre : \[F(y,\epsilon) = f(g(g(y,\epsilon),0), g(y,\epsilon), y, \epsilon) = 0\]

mais supposons maintenant que les règles de décision aujourd’hui et demain soient différentes :

  • aujourd’hui : \(y_t = g(y_{t-1}, \epsilon_t) = \overline{y} + X y_{t-1} + g_y \epsilon_t\)
  • demain : \(y_{t+1} = \tilde{g}(y_t, \epsilon_{t+1}) = \overline{y} + \tilde{X} y_{t-1} + \tilde{g}_y \epsilon_t\)

L’équation de Riccati s’écrit alors :

\[A \tilde{X} X + B X + C = 0\]

Itération temporelle linéaire (2)

L’algorithme d’itération temporelle linéaire consiste à résoudre la règle de décision \(X\) aujourd’hui en fonction de la règle de décision demain \(\tilde{X}\).

Cela correspond à la formule simple :

\[X = -(A\tilde{X} + B)^{-1} C\]

Et l’algorithme complet peut être décrit ainsi :

  • choisir \(X_0\)
  • pour tout \(X_n\), calculer \(X_{n+1} = T(X_n) = -(A X_n + B)^{-1} C\)
    • répéter jusqu’à convergence

Itération temporelle linéaire (3)

On peut montrer qu’en partant d’une valeur initiale aléatoire, l’algorithme d’itération temporelle linéaire converge vers la solution \(X\) de plus petit module :

\[\underbrace{|\lambda_1| \leq \cdots \leq |\lambda_n|}_{\text{Valeurs propres sélectionnées}} \leq |\lambda_{n+1}|\cdots \leq |\lambda_{2n}|\]

Autrement dit, il trouve la bonne solution lorsque le modèle est bien spécifié.

Comment vérifier qu’il est bien spécifié ?

  • \(\lambda_n\) est la plus grande valeur propre de la solution \(X\)
  • et pour \(\lambda_{n+1}\) ?
    • \(\frac{1}{\lambda_{n+1}}\) est la plus grande valeur propre de \((AX+B)^{-1}A\)

Itération temporelle linéaire (4)

Définir \[M(\lambda) = A\lambda^2 + B \lambda + C\]

Pour toute solution \(X\), \(M(\lambda)\) peut être factorisée comme : 1

\[M(\lambda)=(\lambda A + A X + B)(\lambda I -X)\]

et

\[det(M(\lambda)) = \underbrace{det(\lambda A + A X + B)}_{Q(\lambda)}det(\lambda I -X)\]

Par construction, \(Q(\lambda)\) est un polynôme dont les racines sont celles qui ne sont pas sélectionnées par la solution, c.-à-d. \(\Lambda\setminus Sp(X)\).

Itération temporelle linéaire (5)

Pour \(\lambda \neq 0\) on a :

\[\lambda \in Sp((A X +B )^{-1} A)\] \[\iff\det( (A X +B )^{-1})A - I\lambda )=0\] \[\iff\det( \frac{1}{\lambda} A - I (A X +B ) )=0\] \[\iff Q(\frac{1}{\lambda})=0\] \[\iff \frac{1}{\lambda} \in G \setminus Sp(X)\]

En mots, \((AX+B)^{-1}\) contient toutes les valeurs propres qui ont été rejetées par la sélection de \(X\).

En particulier, \(\rho((AX+B)^{-1})A)=1/\min(G\setminus Sp(X))\)

Footnotes

  1. Cas particulier du théorème de Bezout. Facile à vérifier dans ce cas↩︎