"bkl" is the canonical semi-structural small-open-economy quarterly
projection model in the tradition of Berg, Karam and Laxton (2006, IMF
WP/06/80-81): an IS curve, a hybrid Phillips curve, a forward-looking
inflation-targeting policy rule, and a dampened (hybrid) UIP block,
plus equilibrium-trend and foreign processes, and an observation block
for real GDP growth (dy_obs = dy_bar + 4 * (y_gap - y_gap[-1])), so
the model can be filtered on actual national-accounts data without
modelling the level of potential output. The default calibration is
illustrative, for a higher-inflation emerging economy ("Meridia"); it
is not any actual country. See czechia for a real dataset and a
matching recalibration example.
Details
trends selects the equilibrium processes:
"stationary"(default): AR(1) trends anchored at steady-state parameters; the model is fully stationary."rw": driftless random walks for the equilibrium real exchange rate and potential growth (whose levels are pure normalizations); the neutral rate stays anchored by real interest parity (rstar + prem), since a free random walk there would leave steady-state gaps indeterminate. The model then has unit roots: free trend levels are normalized to minimum norm in the steady state, andqpm_filter()switches to diffuse initialization automatically. This is the configuration for real data, where trends drift.
Conventions: gaps in percentage points; inflation QoQ annualised;
interest rates in percent per annum; q is 100 times the log real
exchange rate, an increase is a real depreciation; dy_obs is QoQ
annualised real GDP growth.
Country-shaped variants are shipped as shortcuts for the canonical
model plus an extension block (see add_block()):
"bkl_food"— headline CPI split into food and core (block_food_cpi()), the configuration for economies where food is a large share of the basket."managed_fx"— a leaning-against-the-wind intervention rule entering the UIP block (block_fx_intervention()).
References
Berg, A., Karam, P., and Laxton, D. (2006). A Practical Model-Based Approach to Monetary Policy Analysis - Overview. IMF Working Paper 06/80; and the companion How-To guide, IMF WP 06/81.
Examples
m <- qpm_template("bkl")
summary(m)
#> <qpm_model> Canonical small open economy QPM (BKL, stationary trends)
#> 17 endogenous variables - 12 shocks - 25 parameters
#> dynamics: max lag 3, max lead 4 (auxiliary states added automatically at solve time)
#> calibration:
#> a1 = 0.7, a2 = 0.1, a3 = 0.2, a4 = 0.1, a5 = 0.25, b1 = 0.7, b2 = 0.25,
#> b3 = 0.1, c1 = 0.7, c2 = 1.5, c3 = 0.5, e1 = 0.7, pi_tar = 5, istar_ss
#> = 3, pistar_ss = 2, prem_ss = 3, qbar_ss = 0, g_ss = 3.5, rho_qbar =
#> 0.9, rho_rbar = 0.9, rho_g = 0.85, rho_ystar = 0.8, rho_istar = 0.85,
#> rho_pistar = 0.7, rho_prem = 0.85
#> variables: y_gap, pi, pi4, i, r, r_gap, q, q_gap, ... (see summary())
#>
#> Variables:
#> name label unit
#> y_gap Output gap pp
#> pi CPI inflation, QoQ annualised pct
#> pi4 CPI inflation, 4-quarter average pct
#> i Policy rate pct pa
#> r Real interest rate pct pa
#> r_gap Real rate gap pp
#> q Real exchange rate, 100*log (+ = depreciation) index
#> q_gap Real exchange rate gap pp
#> q_bar Equilibrium real exchange rate index
#> r_bar Neutral real interest rate pct pa
#> dy_obs Real GDP growth, QoQ annualised pct
#> dy_bar Potential output growth, annualised pct
#> ystar_gap Foreign output gap pp
#> istar Foreign nominal interest rate pct pa
#> pistar Foreign inflation pct
#> rstar Foreign real interest rate pct pa
#> prem Country risk premium pp
#>
#> Equations:
#> 1. y_gap ~ a1 * y_gap[-1] + a2 * E(y_gap[+1]) - a3 * r_gap + a4 * q_gap + a5 * ystar_gap + eps_y
#> 2. pi ~ b1 * pi[-1] + (1 - b1) * E(pi[+1]) + b2 * y_gap + b3 * q_gap + eps_pi
#> 3. pi4 ~ (pi + pi[-1] + pi[-2] + pi[-3])/4
#> 4. i ~ c1 * i[-1] + (1 - c1) * (r_bar + pi4 + c2 * (E(pi4[+4]) - pi_tar) + c3 * y_gap) + eps_i
#> 5. r ~ i - E(pi[+1])
#> 6. r_gap ~ r - r_bar
#> 7. q ~ e1 * E(q[+1]) + (1 - e1) * q[-1] - (r - rstar - prem)/4 + eps_q
#> 8. q_gap ~ q - q_bar
#> 9. dy_obs ~ dy_bar + 4 * (y_gap - y_gap[-1]) + eps_dy
#> 10. ystar_gap ~ rho_ystar * ystar_gap[-1] + eps_ystar
#> 11. istar ~ rho_istar * istar[-1] + (1 - rho_istar) * istar_ss + eps_istar
#> 12. pistar ~ rho_pistar * pistar[-1] + (1 - rho_pistar) * pistar_ss + eps_pistar
#> 13. rstar ~ istar - E(pistar[+1])
#> 14. prem ~ rho_prem * prem[-1] + (1 - rho_prem) * prem_ss + eps_prem
#> 15. q_bar ~ rho_qbar * q_bar[-1] + (1 - rho_qbar) * qbar_ss + eps_qbar
#> 16. r_bar ~ rho_rbar * r_bar[-1] + (1 - rho_rbar) * (istar_ss - pistar_ss + prem_ss) + eps_rbar
#> 17. dy_bar ~ rho_g * dy_bar[-1] + (1 - rho_g) * g_ss + eps_g
#>
#> Shock standard deviations:
#> eps_y = 0.5, eps_pi = 1, eps_i = 0.5, eps_q = 1.5, eps_qbar = 0.3,
#> eps_rbar = 0.2, eps_g = 0.2, eps_dy = 1, eps_ystar = 0.3, eps_istar =
#> 0.3, eps_pistar = 0.5, eps_prem = 0.5
m_rw <- qpm_template("bkl", trends = "rw")