# MacroModelling.jl

**Author: Thore Kockerols (@thorek1)**

`MacroModelling.jl`

is a package for developing and solving dynamic stochastic general equilibrium (DSGE) models. The package provides functions for creating, calibrating, simulating and estimating discrete-time DSGE models.

The goal of `MacroModelling.jl`

is to reduce coding time and speed up model development.

As of now the package can:

- parse a model written with user friendly syntax (variables are followed by time indices
`...[2], [1], [0], [-1], [-2]...`

, or`[x]`

for shocks) - (tries to) solve the model only knowing the model equations and parameter values (no steady state file needed)
- calculate first, second, and third order perturbation solutions using (forward or reverse-mode) automatic differentiation (AD)
- calculate (generalised) impulse response functions, simulate the model, or do conditional forecasts
- calibrate parameters using (non stochastic) steady state relationships
- match model moments
- estimate the model on data (Kalman filter using first order perturbation)
**differentiate**(forward AD) the model solution, Kalman filter loglikelihood (reverse-mode AD), model moments, steady state,**with respect to the parameters**

The package is not:

- guaranteed to find the non stochastic steady state (solving systems of nonlinear equations is an active area of research)
- the fastest package around if you already have a fast way to find the NSSS (time to first plot is long, time to second plot (with new parameters) is very short)

For more details have a look at the documentation.

## Getting started

### Installation

`MacroModelling.jl`

requires `julia`

version 1.8 or higher and an IDE is recommended (e.g. `VS Code`

with the `julia extension`

).

Once set up you can install `MacroModelling.jl`

(and `StatsPlots`

in order to plot) by typing the following in the Julia REPL:

`using Pkg; Pkg.add(["MacroModelling", "StatsPlots"])`

### Example

See below an implementation of a simple RBC model. You can find more detailed tutorials in the documentation.

```
using MacroModelling
import StatsPlots
@model RBC begin
1 / c[0] = (β / c[1]) * (α * exp(z[1]) * k[0]^(α - 1) + (1 - δ))
c[0] + k[0] = (1 - δ) * k[-1] + q[0]
q[0] = exp(z[0]) * k[-1]^α
z[0] = ρ * z[-1] + std_z * eps_z[x]
end;
@parameters RBC begin
std_z = 0.01
ρ = 0.2
δ = 0.02
α = 0.5
β = 0.95
end;
plot_irf(RBC)
```

The package contains the following models in the `models`

folder:

- Aguiar and Gopinath (2007)
`Aguiar_Gopinath_2007.jl`

- Ascari and Sbordone (2014)
`Ascari_sbordone_2014.jl`

- Caldara et al. (2012)
`Caldara_et_al_2012.jl`

- Gali (2015) - Chapter 3
`Gali_2015_chapter_3_nonlinear.jl`

- Gali and Monacelli (2005) - CPI inflation-based Taylor rule
`Gali_Monacelli_2005_CITR.jl`

- Gerali, Neri, Sessa, and Signoretti (2010)
`GNSS_2010.jl`

- Ghironi and Melitz (2005)
`Ghironi_Melitz_2005.jl`

- Ireland (2004)
`Ireland_2004.jl`

- Jermann and Quadrini (2012) - RBC
`JQ_2012_RBC.jl`

- New Area-Wide Model (2008) - Euro Area - US
`NAWM_EAUS_2008.jl`

- Schmitt-Grohé and Uribe (2003) - debt premium
`SGU_2003_debt_premium.jl`

- Schorfheide (2000)
`FS2000.jl`

- Smets and Wouters (2003)
`SW03.jl`

- Smets and Wouters (2007)
`SW07.jl`

## Comparison with other packages

MacroModelling.jl | dynare | RISE | NBTOOLBOX | IRIS | DSGE.jl | StateSpaceEcon.jl | SolveDSGE.jl | dolo.py | DifferentiableStateSpaceModels.jl | gEcon | GDSGE | Taylor Projection | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|

Host language |
julia | MATLAB | MATLAB | MATLAB | MATLAB | julia | julia | julia | Python | julia | R | MATLAB | MATLAB |

Non stochastic steady state solver |
symbolic or numerical solver of independent blocks; symbolic removal of variables redundant in steady state; inclusion of calibration equations in problem |
numerical solver of independent blocks or user-supplied values/functions | numerical solver of independent blocks or user-supplied values/functions | user-supplied steady state file or numerical solver | numerical solver of independent blocks or user-supplied values/functions | numerical solver of independent blocks or user-supplied values/functions | numerical solver | numerical solver or user supplied values/equations | numerical solver or user supplied values/equations | numerical solver; inclusion of calibration equations in problem | |||

Automatic declaration of variables and parameters |
yes | ||||||||||||

Derivatives (Automatic Differentiation) wrt parameters |
yes | yes - for all 1st, 2nd order perturbation solution related output if user supplied steady state equations |
|||||||||||

Perturbation solution order |
1, 2, 3 | k | 1 to 5 | 1 | 1 | 1 | 1 | 1, 2, 3 | 1, 2, 3 | 1, 2 | 1 | 1 to 5 | |

Automatic derivation of first order conditions |
yes | ||||||||||||

Handles occasionally binding constraints |
yes | yes | yes | yes | yes | yes | |||||||

Global solution |
yes | yes | yes | ||||||||||

Estimation |
yes | yes | yes | yes | yes | yes | yes | ||||||

Balanced growth path |
yes | yes | yes | yes | yes | yes | |||||||

Model input |
macro (julia) | text file | text file | text file | text file | text file | module (julia) | text file | text file | macro (julia) | text file | text file | text file |

Timing convention |
end-of-period | end-of-period | end-of-period | end-of-period | end-of-period | end-of-period | start-of-period | end-of-period | start-of-period | end-of-period | start-of-period | start-of-period |

## Bibliography

Durbin, J, and Koopman, S. J. (2012), "Time Series Analysis by State Space Methods, 2nd edn", Oxford University Press.

Levintal, O., (2017), "Fifth-Order Perturbation Solution to DSGE models", Journal of Economic Dynamics and Control, 80, pp. 1---16.

Villemot, S., (2011), "Solving rational expectations models at first order: what Dynare does", Dynare Working Papers 2, CEPREMAP.