Extension en économie ouverte

Cycles économiques et fluctuations - AE2E6

  • Modifier un fichier mod avec une extension du modèle.
  • Comparer les solutions du modèle pour différentes paramétrisations.

Importer l’émulation Dynare depuis dyno.py.

Code
from dyno import dynare

Petite économie ouverte

Partir du même modèle RBC que dans la dernière séance de TD. Supposer que l’agent représentatif peut épargner \(b^{\star}_t\) sous forme d’actifs étrangers, rémunérés à un taux d’intérêt constant \(r^{\star}-1\).

  1. Écrire la nouvelle contrainte budgétaire du ménage représentatif.

À la date t, le ménage épargne \(b^{\star}_t\) à l’étranger et reçoit le remboursement de \(b^{\star}_{t-1}\) plus les intérêts \((r^{\star} - 1)b^{\star}_{t-1}\). En partant de la contrainte RBC, la nouvelle contrainte devient : \[c_t + i_t + b^ {\star}_t \leq w_t n_t + r_t k_{t-1} + r^ {\star} b^{\star}_{t-1}\]

et le lagrangien est :

\[\mathcal{L} = E_t \sum_{j=0}^\infty \beta^j\left[\log c_{t+j} + \chi \dfrac{(1-n_{t+j})^{1-\eta}}{1-\eta} \right.\]

\[+\lambda_{t+j} (w_{t+j}n_{t+j} + r_{t+j}k_{t+j-1} - c_{t+j}-k_{t+j} + (1-\delta)k_{t+j-1} + r^* b^*_{t+j-1} - b^*_{t+j} )\Bigg]\]

  1. Écrire la nouvelle condition d’optimalité.

Il faut ajouter la condition d’optimalité relative à \(b^{\star}_t\) : le ménage représentatif choisit son niveau d’épargne pour maximiser son utilité intertemporelle de consommation. On obtient :

\[ -\lambda_t + \beta E_t[\lambda_{t+1}r^*]=0\] ou : \[ \frac{1}{c_t}=\beta r^* E_t\left[\frac{1}{c_{t+1}} \right]\]

  1. Quelle est la contrainte de long terme sur le taux d’intérêt \(r^{\star}\) ?

Dans l’état stationnaire déterministe, l’équation d’Euler implique \(r^{\star}= \frac{1}{\beta}\). En principe, \(r^{\star}\) est un taux d’intérêt étranger déterminé par des facteurs externes au pays. Pourtant, \(\frac{1}{\beta}\) est la seule valeur compatible avec l’existence d’un état stationnaire de long terme. Cela s’interprète comme une condition d’arbitrage : \(\frac{1}{\beta}\) est le taux d’intérêt domestique. S’il était plus faible ou plus élevé que le taux mondial, il y aurait des flux de capitaux infinis vers/depuis le pays.

(dans un cadre déterministe, le principe d’arbitrage implique que toutes les opportunités d’investissement doivent offrir le même rendement)

  1. Mettre à jour le fichier mod (poser \(\overline{b^{\star}}=0\)).

Pour mettre à jour le fichier mod, il faut déclarer une nouvelle variable \(b^{\star}\) et un nouveau paramètre \(r^\star\). Ce dernier est fixé à \(\frac{1}{\beta}\). Il faut aussi ajouter la condition d’optimalité ci-dessus et mettre à jour l’équation caractérisant l’équilibre sur le marché des biens. Celle-ci vient de la contrainte budgétaire. En réécrivant la contrainte budgétaire pour une petite économie ouverte, on a :

\[c_t + i_t + b^{\star}_t = w_t n_t + r_t k_{t-1} + r^{\star} b^{\star}_{t-1}\]

Comme on suppose des marchés concurrentiels, l’entreprise ne fait pas de profit. On a \(y_t = w_t n_t + r_t k_{t−1}\) et :

\[c_t + i_t + b^{\star}_t - r^{\star} b^{\star}_{t-1} = y_t\]

Ensuite, on observe que le modèle statique ne détermine pas le niveau stationnaire de \(b^{\star}\) ; on le fixe à 0, de sorte que les valeurs stationnaires de toutes les autres variables restent inchangées. On ajoute donc \(b^{\star}=0\) dans le bloc steady_state_model;.

Voici la sortie obtenue : (on peut sans risque ignore le message sur la cardinalité de i)

Code
# as we modify the modfile, we can check it runs without 
dynare("rbc_open.mod") # remove the ; to print the result
Could not normalize the dynamic model. Variable i is not in the maximum cardinality matching.

Model: rbc_open

equations 9
variables 10
  endogenous 9 y, i, c, n, a, b, k, r, w
  exogenous 1 epsilon
constants 8 alp, bet, del, eta, khi, nss, rho, rst

Check


Residuals
eq 1
0
eq 2
0
eq 3
2.22045e-16
eq 4
0
eq 5
0
eq 6
0
eq 7
0
eq 8
0
eq 9
0

Generalized Eigenvalues
1
0
2
0
3
0
4
0
5
0
6
0
7
5.54131e-16
8
0.95
9
1
10
1.02041
11
inf
12
inf
13
inf
14
inf
15
inf
16
inf
17
inf
18
inf

Decision Rule

Steady-state

y i c n a b k r w
0.876548 0.159256 0.717292 0.33 1.0 0.0 6.370239 0.045408 1.779658

Jacobian

y[t-1] i[t-1] c[t-1] n[t-1] a[t-1] b[t-1] k[t-1] r[t-1] w[t-1] epsilon[t]
y[t] 0.0 0.0 0.0 0.0 1.243780 -7.668729e-03 7.444880e-02 0.0 0.0 1.309242
i[t] 0.0 0.0 0.0 0.0 21.161664 -1.389137e-01 -1.118949e+00 0.0 0.0 22.275436
c[t] 0.0 0.0 0.0 0.0 0.268469 7.704146e-03 7.983403e-03 0.0 0.0 0.282599
n[t] 0.0 0.0 0.0 0.0 0.230977 -4.309102e-03 1.631810e-02 0.0 0.0 0.243133
a[t] 0.0 0.0 0.0 0.0 0.950000 6.824851e-18 -3.139696e-18 0.0 0.0 1.000000
b[t] 0.0 0.0 0.0 0.0 -20.186354 1.143949e+00 1.185414e+00 0.0 0.0 -21.248793
k[t] 0.0 0.0 0.0 0.0 21.161664 -1.389137e-01 -1.439490e-01 0.0 0.0 22.275436
r[t] 0.0 0.0 0.0 0.0 0.064432 -3.972662e-04 -3.271472e-03 0.0 0.0 0.067823
w[t] 0.0 0.0 0.0 0.0 1.279616 7.668729e-03 6.315169e-02 0.0 0.0 1.346964

Moments


Theoretical Moments


Mean Std. Dev. Variance
VARIABLE
y 0.8765 NaN NaN
i 0.1593 NaN NaN
c 0.7173 NaN NaN
n 0.3300 NaN NaN
a 1.0000 0.0290 0.0008
b 0.0000 NaN NaN
k 6.3702 NaN NaN
r 0.0454 0.0006 0.0000
w 1.7797 0.0737 0.0054

Unconditional Covariances


y i c n a b k r w
y NaN NaN NaN NaN 0.002889 NaN NaN 1.638272e-05 0.008644
i NaN NaN NaN NaN 0.001229 NaN NaN 1.032229e-04 0.001421
c NaN NaN NaN NaN 0.000110 NaN NaN -1.937608e-06 -0.000187
n NaN NaN NaN NaN 0.000695 NaN NaN 4.795388e-06 0.002237
a 0.002894 0.001118 0.000112 0.000695 0.000839 -0.036262 0.021017 4.877599e-06 0.002110
b NaN NaN NaN NaN -0.036409 NaN NaN -6.253319e-04 -0.163198
k NaN NaN NaN NaN 0.020930 NaN NaN 1.813458e-04 0.061056
r 0.000017 0.000103 -0.000002 0.000005 0.000005 -0.000655 0.000184 3.087781e-07 0.000008
w 0.008610 0.001164 -0.000205 0.002242 0.002095 -0.163139 0.061252 7.383436e-06 0.005438

Conditional Covariances


y i c n a b k r w
y 0.000139 0.002362 0.000030 0.000026 0.000106 -0.002253 0.002362 7.192557e-06 0.000143
i 0.002362 0.040192 0.000510 0.000439 0.001804 -0.038339 0.040192 1.223741e-04 0.002430
c 0.000030 0.000510 0.000006 0.000006 0.000023 -0.000486 0.000510 1.552511e-06 0.000031
n 0.000026 0.000439 0.000006 0.000005 0.000020 -0.000418 0.000439 1.335697e-06 0.000027
a 0.000106 0.001804 0.000023 0.000020 0.000081 -0.001721 0.001804 5.493679e-06 0.000109
b -0.002253 -0.038339 -0.000486 -0.000418 -0.001721 0.036572 -0.038339 -1.167340e-04 -0.002318
k 0.002362 0.040192 0.000510 0.000439 0.001804 -0.038339 0.040192 1.223741e-04 0.002430
r 0.000007 0.000122 0.000002 0.000001 0.000005 -0.000117 0.000122 3.725988e-07 0.000007
w 0.000143 0.002430 0.000031 0.000027 0.000109 -0.002318 0.002430 7.399787e-06 0.000147

Simulation


epsilony01000.0276-0.00609i01000.2-0.0073c01000.002540n01000.00617-0.00232a01000.0090b01000.374-0.191k01000.2-0.0443r01000.000610w01000.02270
  1. Afficher les moments théoriques. Commenter.

Dans la sortie de la question précédente, on a :

Code
report = dynare("rbc_open.mod") # remove the ; to print the result
report.simple_moments_df
Could not normalize the dynamic model. Variable i is not in the maximum cardinality matching.
Mean Std. Dev. Variance
y 0.876548 NaN NaN
i 0.159256 NaN NaN
c 0.717292 NaN NaN
n 0.330000 NaN NaN
a 1.000000 0.028960 8.386944e-04
b 0.000000 NaN NaN
k 6.370239 NaN NaN
r 0.045408 0.000556 3.087781e-07
w 1.779658 0.073741 5.437802e-03

On voit que Dynare ne peut pas calculer les moments (moyenne et écart-type) pour toutes les variables. C’est une propriété liée à l’existence d’une racine unitaire : la distribution ergodique de ces variables n’est pas définie.

On dit que le modèle est non stationnaire.

  1. Simuler le modèle sur 100 périodes. Commenter.
Code
report = dynare("rbc_open.mod")
report.simulation
report.figure
Could not normalize the dynamic model. Variable i is not in the maximum cardinality matching.

L’horizon de simulation est spécifié dans stoch_simul(irf=200, order=1) via l’argument du mot-clé irf. Ici, on sauvegarde le rapport sous un nom spécifique pour accéder à la simulation et au graphique.

L’objet de simulation est un dictionnaire dont les clés sont les noms des chocs et les valeurs les séries temporelles simulées (dataframes Python).

Code
report.simulation
{'epsilon':             y         i         c         n         a         b         k  \
 0    0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000   
 1    0.011783  0.200479  0.002543  0.002188  0.009000 -0.191239  0.200479   
 2    0.027586 -0.007305  0.002543  0.006174  0.008550 -0.162794  0.188162   
 3    0.025891 -0.006997  0.002543  0.005747  0.008122 -0.135772  0.176461   
 4    0.024281 -0.006705  0.002543  0.005341  0.007716 -0.110101  0.165345   
 ..        ...       ...       ...       ...       ...       ...       ...   
 96  -0.006037 -0.001196  0.002543 -0.002307  0.000069  0.373303 -0.043975   
 97  -0.006051 -0.001194  0.002543 -0.002310  0.000065  0.373520 -0.044069   
 98  -0.006064 -0.001191  0.002543 -0.002314  0.000062  0.373727 -0.044159   
 99  -0.006076 -0.001189  0.002543 -0.002317  0.000059  0.373924 -0.044244   
 100 -0.006088 -0.001187  0.002543 -0.002320  0.000056  0.374110 -0.044325   
 
                 r         w  
 0    0.000000e+00  0.000000  
 1    6.104088e-04  0.012123  
 2    8.524540e-18  0.022711  
 3    5.285486e-19  0.021575  
 4    6.234162e-19  0.020496  
 ..            ...       ...  
 96   5.421011e-19  0.000183  
 97   5.692061e-19  0.000174  
 98   5.692061e-19  0.000165  
 99   5.692061e-19  0.000157  
 100  5.692061e-19  0.000149  
 
 [101 rows x 9 columns]}

Au lieu de créer un graphique personnalisé à partir du dataframe, on peut accéder directement à la figure.

Code
report.figure

Le résultat est stocké dans le sous-dossier rbc_open/graphs.

Noter que dynare-matlab permet de choisir les variables à tracer en ajoutant une liste de variables après la commande (comme dans stoch_simul(irf=200, order=1) y c i b). Cette fonctionnalité n’a pas encore été portée dans Dyno, qui affiche par défaut les 8 premières variables. Vous pouvez alors :

  • réordonner les variables dans la déclaration pour placer d’abord celles que l’on veut afficher
  • construire un graphique personnalisé à partir des séries temporelles (on le fait dans la dernière question)

Même avec une racine unitaire, le modèle peut être résolu et simulé.

Avec l’ouverture de l’économie, en réponse au choc de productivité, des capitaux entrants financent un saut de l’investissement.

Les IRF montrent un effet persistant du choc sur la position de dette, ainsi que sur la plupart des autres variables.

Quand l’épargne de tous les ménages augmente, il n’y a pas de force de stabilisation pour la ramener à son niveau initial.

Les ménages, et donc le pays dans son ensemble, se comportent comme un agent ricardien : ils augmentent durablement leur consommation en consommant les intérêts de leurs actifs.

Comme leur consommation augmente, l’arbitrage consommation-loisir est aussi modifié, ce qui explique que l’offre de travail change également de façon permanente.

Comme le rendement du capital doit rester égal au taux d’intérêt mondial (condition d’arbitrage), il revient à l’état stationnaire après une période.

  1. Supposer que le taux d’intérêt étranger dépend de la quantité d’actifs étrangers.

\[r^{\star}_t=\frac{1}{\beta} + exp(-\kappa b^{\star}_t) - 1\]

  1. Avec \(\kappa=0.001\), comment interprétez-vous l’équation de \(r^{\star}_t\) ? Comment faut-il modifier les équations du modèle ?

Avec cette spécification, lorsque le ménage représentatif détient davantage d’actifs, son rendement diminue. Cela peut être un proxy du fait que les marchés internationaux ont une profondeur limitée.

Inversement, quand le ménage domestique devient plus endetté, les prêteurs internationaux exigent un taux d’intérêt plus élevé. Cela peut signifier que les investisseurs internationaux n’ont pas une capacité de financement infinie, ou s’interpréter comme une prime de risque plus élevée.

Cette spécification est aussi choisie pour se ramener à \(r^{\star}=\frac{1}{\beta}\) quand \(b^{\star}_t=0\). Cela permet de conserver essentiellement le même état stationnaire qu’avant pour toutes les autres variables.

Pour mettre à jour le fichier mod, il faut déclarer \(r^{\star}\) comme une variable (et non un paramètre) et déplacer sa valeur stationnaire \(r^{\star} = \frac{1}{\beta}\) dans le bloc steady_state_model;. Enfin, l’équation ci-dessus qui endogénéise le taux d’intérêt doit être ajoutée au bloc model;.

Noter que l’équation d’Euler est inchangée avec l’ajout du taux d’intérêt endogène. Cela vient du fait que les ménages (et donc le ménage représentatif) n’internalisent pas l’effet de leur emprunt/épargne sur le taux d’intérêt lorsqu’ils choisissent leurs décisions optimales.

  1. Mettre à jour le fichier mod et commenter les moments obtenus. Dépendent-ils du choix de \(\kappa\) ?
Code
#run modified modfile rbc_open_stationary
# save result for future comparison
report_stationary = dynare("rbc_open_stationary.mod")

Avec l’ajout d’une petite friction, on obtient les moments bien définis suivants :

Code
report_stationary.simple_moments_df
Mean Std. Dev. Variance
k 6.370239 0.397911 1.583335e-01
i 0.159256 0.132870 1.765446e-02
y 0.876548 0.057032 3.252675e-03
a 1.000000 0.028823 8.307692e-04
n 0.330000 0.010878 1.183263e-04
c 0.717292 0.027198 7.397449e-04
b 0.000000 0.625656 3.914452e-01
r 0.045408 0.000830 6.889093e-07
w 1.779658 0.076030 5.780609e-03
rst 1.020408 0.000626 3.914452e-07

On obtient les IRF suivantes :

Code
report_stationary.figure

Comme précédemment, il y a un saut de l’investissement, financé par l’emprunt extérieur (\(b\) devient négatif). Cet effet est freiné par une hausse du taux d’intérêt.

Si l’on fixe plutôt \(\kappa=0.005\), on obtient les moments théoriques suivants :

Code
report_stationary_high_kappa = dynare("rbc_open_stationary_kappa005.mod")
report_stationary_high_kappa.simple_moments_df
Mean Std. Dev. Variance
k 6.370239 0.336906 1.135055e-01
i 0.159256 0.068956 4.754994e-03
y 0.876548 0.047350 2.242031e-03
a 1.000000 0.028823 8.307692e-04
n 0.330000 0.006486 4.206958e-05
c 0.717292 0.027271 7.437281e-04
b 0.000000 0.187471 3.514539e-02
r 0.045408 0.001089 1.185817e-06
w 1.779658 0.074260 5.514607e-03
rst 1.020408 0.000937 8.786349e-07

Quand on augmente la friction, on observe une réduction de la volatilité de la dette (de 0.6 à 0.2), mais des changements plus faibles pour le capital, l’investissement, la production, le travail, les salaires… En particulier, les moments RBC (écart-type de l’investissement / de la consommation rapportés à l’écart-type de la production) bougent très peu.

Un autre exercice intéressant consiste à comparer les fonctions de réponse impulsionnelle obtenues avec \(\kappa=0.000\), \(\kappa=0.001\) et \(\kappa=0.005\) (voir le code ci-dessous).

À court terme, les réponses dynamiques sont très similaires pour toutes les variables, sauf la consommation qui ne saute plus immédiatement vers sa tendance de long terme dès qu’il existe une petite friction sur le taux d’intérêt. Globalement, l’ajout de la friction ralentit l’ajustement des variables de production au choc de productivité.

À long terme, la friction implique un retour à l’état stationnaire initial, ce qui contrecarre l’effet de court terme du choc exogène.

Code
irfs_kappa_00 = report.simulation["epsilon"]
irfs_kappa_01 = report_stationary.simulation["epsilon"]
irfs_kappa_05 = report_stationary_high_kappa.simulation["epsilon"]

import matplotlib.pyplot as plt

fig, axes = plt.subplots(2, 2, figsize=(6, 4), sharex=True)

series_to_plot = [
  ("b", "Debt"),
  ("y", "Production"),
  ("c", "Consumption"),
  ("i", "Investment"),
]

for ax, (var, title) in zip(axes.flat, series_to_plot):
  ax.plot(irfs_kappa_00[var], label="$\\kappa=0$")
  ax.plot(irfs_kappa_01[var], label="$\\kappa=0.001$")
  ax.plot(irfs_kappa_05[var], label="$\\kappa=0.005$")
  ax.set_title(title)
  ax.legend()

fig.tight_layout()
plt.show()