Skip to main content

Solve nonlinear perfect foresight models

Project description

https://badge.fury.io/py/econpizza.svg

Contains tools to simulate nonlinear perfect foresight models. The baseline mechanism is a Fair-Taylor-like stacking method similar to the nonlinear solver in dynare.

New: experimental automatic differentiation support via jax!

Installation

It’s as simple as:

pip install econpizza

Documentation

There is no formal documentation (yet).

An small-scale nonlinear New Keynesian model with ZLB is provided as an example. Here is how to simulate it and plot some nonlinear impulse responses:

import numpy as np
import matplotlib.pyplot as plt
import econpizza as ep
from econpizza import example_nk


# use the NK model again
mod = ep.load(example_nk)

# increase the discount factor by .02 (this is NOT percentage deviation!)
shk = ('e_beta', .02)

# use the stacking method. As above, you could also feed in the initial state instead
x, x_lin, flag = ep.find_path_stacked(mod, shock=shk)

# plotting. x_lin is the linearized first-order solution
for i,v in enumerate(mod['variables']):

    plt.figure()
    plt.plot(x[:,i])
    plt.plot(x_lin[:,i])
    plt.title(v)

The impulse responses are the usual dynamics of a nonlinear DSGE.

The yaml files follow a simple structure:

  1. define all variables and shocks

  2. provide the nonlinear equations. Note that the dash at the beginning of each line is not a minus!

  3. provide the parameters and values.

  4. optionally provide some steady state values and/or values for initial guesses

  5. optionally provide some auxilliary equations that are not directly part of the nonlinear system (see the yaml for the BH model)

Alternative Boehl-Hommes method

An alternative method is implemented, similar to the one introduced in Boehl & Hommes (2021), where we use it to solve for chaotic asset price dynamics. It can be understood as a policy function iteration where the initial state is the only fixed grid point and all other grid points are chosen endogenously (as in a “reverse” EGM) to map the expected trajectory.

The main advantage (in terms of robustness) over Fair-Taylor comes from exploiting the property that most determined perfect forsight models be a contraction mapping both, forward and backwards. The model is given by

f(x_{t-1}, x_t, x_{t+1}) = 0.

We iterate on the expected trajectory itself instead of the policy function. We hence require

d f(x_{t-1}, x_t, x_{t+1} ) < d x_{t-1},
d f(x_{t-1}, x_t, x_{t+1} ) < d x_{t+1}.

This is also the weakness of the method: not every DSGE model (that is Blanchard-Kahn determined) sense is such backward-and-forward contraction. In most cases the algorithm converges anyways, but convergence is not guaranteed.

The code is in alpha state and provided for reasons of collaboration, replicability and code sharing in the spirit of open science. You are welcome to get in touch if you are interested working with the package.

import numpy as np
import matplotlib.pyplot as plt
import econpizza as ep
from econpizza import example_nk

# load the example. The steady state is automatically solved for
# example_nk is nothing else but the path to the yaml, hence you could also use `filename = 'path_to/model.yaml'`
mod = ep.load(example_nk)

# get the steady state as an initial state
state = mod['stst'].copy()
# increase the discount factor by one percent
state['beta'] *= 1.02

# simulate the model
x, _, flag = ep.find_path(mod, state.values())

# plotting
for i,v in enumerate(mod['variables']):

    plt.figure()
    plt.plot(x[:,i])
    plt.title(v)

Lets go for a second, numerically more challenging example: the chaotic rational expectations model of Boehl & Hommes (2021)

import numpy as np
import matplotlib.pyplot as plt
import econpizza as ep
from econpizza import example_bh

# parse the yaml
mod = ep.load(example_bh, raise_errors=False)
# B-K conditions will complain because the model is not determined around the steady state. This is not a problem

# choose an interesting initial state
state = np.zeros(len(mod['variables']))
state[:-1] = [.1, .2, 0.]

# solve and simulate. The lower eps is not actually necessary
x, _, flag = ep.find_path(mod, state, T=1000, max_horizon=1000, tol=1e-8)

# plotting
for i,v in enumerate(mod['variables']):

    plt.figure()
    plt.plot(x[:,i])
    plt.title(v)

This will give you:

Dynamics of prices and fractions

Citation

econpizza is developed by Gregor Boehl to simulate nonlinear perfect foresight models. Please cite it with

@techreport{boehl2021rational,
title         = {Rational vs. Irrational Beliefs in a Complex World},
author        = {Boehl, Gregor and Hommes, Cars},
year          = 2021,
institution   = {IMFS Working Paper Series}
}

We appreciate citations for econpizza because it helps us to find out how people have been using the package and it motivates further work.

References

Boehl, Gregor and Hommes, Cars (2021). Rational vs. Irrational Beliefs in a Complex World. IMFS Working papers

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

econpizza-0.1.0.tar.gz (38.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

econpizza-0.1.0-py3-none-any.whl (17.0 kB view details)

Uploaded Python 3

File details

Details for the file econpizza-0.1.0.tar.gz.

File metadata

  • Download URL: econpizza-0.1.0.tar.gz
  • Upload date:
  • Size: 38.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.2

File hashes

Hashes for econpizza-0.1.0.tar.gz
Algorithm Hash digest
SHA256 9157f47a4a57b186b01b3d7426e755313b270de302463e4ed1dced79aa83e754
MD5 89f0a3d590a22516709d43ff2f0bb33d
BLAKE2b-256 fe45b9f4384dd95b7f31b0055c701bc048b89ba4308ba242ea3ffe33e5ba8433

See more details on using hashes here.

File details

Details for the file econpizza-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: econpizza-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 17.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.2

File hashes

Hashes for econpizza-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 212c6a7449d80009d6ccee7006d7b58865c7d6d983f4d3c8405828c92d21d52b
MD5 17d05b3487fb0805d2a7fc9add4d4edd
BLAKE2b-256 1798b1a7766b67730e91706f2cf3edac279aa9064b06e593c6b049e9009e5391

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page