Skip to content

🇬🇧 English · 🇪🇸 Español

Modelo DSGE de Gertler y Karadi (2011) con fricciones financieras

El módulo puremacro.dsge.gertler_karadi implementa el modelo canónico macrofinanciero de equilibrio general dinámico y estocástico (DSGE) con fricciones en la intermediación bancaria, amplificación de balance y política de crédito no convencional desarrollado por Gertler y Karadi (2011, Journal of Monetary Economics), incorporando compatibilidad con regímenes que se activan ocasionalmente mediante OccBin (Guerrieri e Iacoviello 2015).

A raíz de la crisis financiera global de 2007–2008, la modelización macroeconómica moderna reconoció que las perturbaciones en la intermediación financiera no son meros reflejos pasivos del ciclo económico, sino catalizadores primarios de severa amplificación macroeconómica. El marco de Gertler y Karadi (GK 2011) modeliza explícitamente a los intermediarios financieros (bancos) que financian las compras de capital productivo de las empresas emitiendo depósitos a los hogares, en presencia de un problema de agencia endógeno.


1. Estructura teórica del modelo

1.1 Balance bancario y fricción de agencia

Los bancos canalizan el ahorro desde los hogares hacia las empresas no financieras. El balance agregado del sector bancario iguala el valor total de los activos intermediados \(S_t = Q_t K_t\) a la suma del patrimonio neto bancario \(N_t\) y los depósitos captados de los hogares \(B_t\):

\[Q_t K_t = N_t + B_t\]

Los banqueros maximizan el valor esperado del patrimonio acumulado que transferirán a sus respectivos hogares al momento de su retiro. Para introducir fricciones financieras, GK (2011) formulan un problema de agencia por riesgo moral: - Al cierre de cada período, el banquero puede desviar una fracción \(\lambda_b \in (0, 1)\) de los activos gestionados \(Q_t K_t\) directamente hacia su hogar. - Si el banquero desvía fondos, la entidad quiebra, los depositantes se incautan de la fracción restante \((1 - \lambda_b)\) y el banco es liquidado.

Para que los hogares depositen voluntariamente sus fondos, el valor de continuación del banco \(V_t\) debe satisfacer la restricción de compatibilidad de incentivos:

\[V_t \ge \lambda_b Q_t K_t\]

El valor de continuación puede descomponerse linealmente como:

\[V_t = \nu_t Q_t K_t + \eta_t N_t\]

donde \(\nu_t\) representa el valor marginal de expandir los activos del banco (manteniendo fijo el patrimonio neto) y \(\eta_t\) mide el valor marginal de incrementar el patrimonio neto (manteniendo fijos los activos).

Cuando la restricción de incentivos resulta vinculante, determina de forma endógena el ratio de apalancamiento bancario \(\phi_t\):

\[\phi_t \equiv \frac{Q_t K_t}{N_t} = \frac{\eta_t}{\lambda_b - \nu_t}\]

Esta restricción fija endógenamente el diferencial de crédito (credit spread) o prima de financiamiento externo:

\[\text{Spread}_t \equiv \mathbb{E}_t \left[ R_{k, t+1} - R_{t+1} \right]\]

1.2 Amplificación macroeconómica y perturbaciones a la calidad del capital

El experimento principal analizado en Gertler y Karadi (2011) es una perturbación a la calidad del capital \(\xi_t\).

El stock efectivo de capital físico evoluciona según \(K_{t+1} = \xi_{t+1} [(1 - \delta) K_t + I_t]\). Una innovación negativa \(\varepsilon_\xi < 0\): 1. Reduce de forma directa la productividad técnica y física del capital instalado. 2. Deprime de inmediato el precio de mercado del activo de capital \(Q_t\). 3. Induce cuantiosas pérdidas patrimoniales en los balances de los bancos. Dado que el sistema bancario opera con un apalancamiento basal \(\phi \approx 4\), una depreciación del 1% en los activos contrae el patrimonio neto en aproximadamente un 4%: $\(\frac{d N_t}{N_{ss}} \approx \phi \cdot \frac{d Q_t}{Q_{ss}}\)$ 4. Obliga a los bancos a restringir drásticamente la intermediación o elevar los diferenciales de crédito \(\mathbb{E}_t[R_{k,t+1} - R_{t+1}]\) en cientos de puntos básicos para restablecer la confianza de los depositantes. 5. Desencadena una contracción profunda y duradera de la inversión agregada y del PIB.


2. Solucionadores duales

El paquete puremacro.dsge.gertler_karadi incorpora dos metodologías de resolución:

  1. Solucionador lineal QZ de Klein (1998) (method='klein'):
    Resuelve perturbaciones racionales de primer orden en torno al estado estacionario determinista utilizando la descomposición de Schur generalizada de puremacro.dsge.klein. Es idóneo para simulaciones lineales veloces.
  2. Recursión lineal por tramos con OccBin (method='occbin'):
    Resuelve modelos dinámicos con cambios de régimen que se activan ocasionalmente conforme a Guerrieri e Iacoviello (2015):
  3. Política de crédito no convencional (constraint_type='credit_policy'): El banco central intermedia crédito directamente adquiriendo activos privados cuando el diferencial de crédito supera un umbral crítico (por ejemplo, 100 puntos básicos): $\(\psi_t = \nu_g \cdot \max \left( 0, \, \text{Spread}_t - \text{umbral} \right)\)$
  4. Límites macroprudenciales de apalancamiento (constraint_type='leverage_cap'): Impone un techo regulatorio sobre el apalancamiento bancario, \(\phi_t \le \phi_{max}\), con respaldo público. Mientras el límite se activa, el régimen restringido fija \(\phi_t = \phi_{max}\) y libera la cuota de crédito público, de modo que el balance \((1 - \psi_t) Q_t K_t = \phi_t N_t\) determina cuánta intermediación absorbe el sector público, bajo holgura complementaria: $\(\phi_t \le \phi_{max}, \qquad \psi_t \ge 0, \qquad \psi_t = 0 \ \text{donde el límite no se activa}.\)$ La restricción de incentivos por riesgo moral se mantiene, así que un límite activo comprime las rentas de intermediación en lugar de racionar el crédito privado. Imponer el límite eliminando la restricción de incentivos —la formulación anterior a 2.5.0— hace que el régimen restringido viole Blanchard-Kahn y admite un continuo de soluciones espurias; véase la documentación de solve_gertler_karadi.

3. Calibración canónica (GK 2011, Tabla 1)

Parámetro Valor Interpretación económica
beta \(0.99\) Factor de descuento subjetivo trimestral (tasa natural \(R_{ss} \approx 4.0\%\) anual)
sigma \(1.0\) Elasticidad de sustitución intertemporal (utilidad logarítmica)
h \(0.815\) Hábito en el consumo
varphi \(0.276\) Inverso de la elasticidad de Frisch de oferta laboral
alpha \(0.33\) Participación del capital en la función de producción
delta \(0.025\) Tasa de depreciación física trimestral (10% anual)
eta_i \(1.728\) Parámetro de costes de ajuste de la inversión
theta_b \(0.972\) Probabilidad de supervivencia del banquero (antigüedad media \(\approx 9\) años)
lambda_b \(0.381\) Fracción de activos susceptible de desvío (intensidad del riesgo moral)
omega_b \(0.002\) Dotación inicial transferida a los nuevos banqueros
gamma \(0.779\) Parámetro de Calvo de rigidez de precios
rho_xi \(0.66\) Persistencia autorregresiva del choque a la calidad del capital

4. Ejemplos de uso y código ejecutable

Simulación de un choque a la calidad del capital bajo Klein y OccBin

import numpy as np
from puremacro.dsge.gertler_karadi import (
    solve_gertler_karadi,
    solve_steady_state,
)

# 1. Inspección del estado estacionario determinista
ee = solve_steady_state()
print(f"Apalancamiento bancario phi en EE : {ee['phi']:.2f}x")
print(f"Diferencial de crédito anualizado : {ee['spread_ann']:.1f} pbs")

# 2. Simulación de perturbación a la calidad del capital (-5%) con el solucionador lineal de Klein
res_klein = solve_gertler_karadi(
    shock_type="capital_quality",
    shock_size=-0.05,
    horizon=40,
    method="klein",
)

# 3. Simulación con OccBin incorporando intervención del banco central en crédito
res_occbin = solve_gertler_karadi(
    shock_type="capital_quality",
    shock_size=-0.05,
    horizon=40,
    method="occbin",
    constraint_type="credit_policy",
    threshold=0.0025,  # Intervención si el diferencial excede 100 pbs anuales
)

# 4. Comparación de resultados entre regímenes. to_frame() contiene desviaciones en
#    niveles x_t - x_ss (el modelo se linealiza en niveles); to_frame(units="pct")
#    da 100 * (x_t - x_ss) / x_ss.
df_klein = res_klein.to_frame()
df_occbin = res_occbin.to_frame()
pct_klein = res_klein.to_frame(units="pct")
pct_occbin = res_occbin.to_frame(units="pct")

print("Caída máxima del patrimonio bancario (Klein, %) :", pct_klein["N"].min())
print("Caída máxima del patrimonio bancario (OccBin, %):", pct_occbin["N"].min())
print("Pico del diferencial de crédito (Klein, pbs)    :", df_klein["prem"].max() * 40000)
print("Pico del diferencial de crédito (OccBin, pbs)   :", df_occbin["prem"].max() * 40000)

# 5. Informe estructurado y visualización gráfica
print(res_occbin.summary())
fig = res_occbin.plot(units="pct")

El patrimonio bancario cae un 61,7% en el impacto con Klein y un 49,2% con OccBin, donde la política de crédito absorbe parte de la pérdida; el diferencial anualizado sube hasta unos 604 pbs y 256 pbs por encima de su valor de estado estacionario de 100 pbs. Los porcentajes se leen en to_frame(units="pct"): en niveles el patrimonio cae 0,852 y 0,679 frente a \(N_{ss} = 1{,}381\), y multiplicar una desviación en niveles por 100 da un porcentaje solo para las variables cuyo estado estacionario vale 1.


5. Especificación completa de la API

solve_gertler_karadi

solve_gertler_karadi(
    params: Mapping[str, float] | None = None,
    shock_type: str = "capital_quality",
    shock_size: float = -0.05,
    horizon: int = 40,
    method: str = "occbin",
    constraint_type: str = "credit_policy",
    threshold: float | None = None,
    max_iter: int = 50,
) -> GertlerKaradiResult

Parámetros:

  • params: Diccionario opcional para sobreescribir los parámetros canónicos de GK2011_PARAMS.
  • shock_type: Identificador del choque: 'capital_quality' (\(\varepsilon_\xi\)), 'tfp' (\(\varepsilon_a\)) o 'monetary' (\(\varepsilon_r\)).
  • shock_size: Magnitud de la innovación en \(t=0\) (por defecto -0.05 para un choque contractivo del 5%).
  • horizon: Longitud de la simulación en trimestres (por defecto 40).
  • method: Motor de resolución: 'occbin' (lineal por tramos) o 'klein' (perturbación lineal QZ).
  • constraint_type: Restricción activa en OccBin: 'credit_policy' o 'leverage_cap'.
  • threshold: Umbral de activación del régimen, como desviación respecto al estado estacionario. Por defecto 0.0025 (100 pbs de spread) para credit_policy; 0.20 * phi_ss (= 0.8197 en esta calibración) para leverage_cap. Un límite de apalancamiento más estricto se activa durante más tiempo y exige un horizon mayor (10% por encima de \(\phi_{ss}\) requiere horizon >= 80; 5%, >= 200); el solver informa converged=False en lugar de adivinar.
  • max_iter: Número máximo de iteraciones retrógradas para el algoritmo de OccBin.

6. Interfaz de resultados

La clase GertlerKaradiResult almacena las trayectorias dinámicas y ofrece herramientas formales de reporte:

  • Atributos:
  • irf: DataFrame de pandas con las funciones impulso-respuesta, una columna por variable del modelo y una fila por trimestre (la fila 0 es el trimestre del impacto). Los valores son desviaciones en niveles respecto al estado estacionario, \(x_t - x_{ss}\), en unidades del modelo: las condiciones de equilibrio se linealizan en niveles, así que no son desviaciones porcentuales ni logarítmicas. res["N"] devuelve una columna.
  • variables: Lista de los nombres de las variables del modelo, las columnas de irf: ['Y', 'C', 'I', 'K', 'L', 'w', 'rho_c', 'Q', 'R', 'Rk', 'prem', 'N', 'Ne', 'Nn', 'phi', 'nu', 'eta', 'Omega', 'Pm', 'Z', 'U', 'Pi', 'Rn', 'xi', 'a', 'psi'].
  • steady_state: Diccionario con los valores del estado estacionario determinista, con las mismas claves (más objetivos de calibración como spread_ann).
  • regimes: para OccBin, el indicador de régimen por trimestre (0 = referencia, 1 = restringido); binding_periods cuenta los trimestres restringidos.
  • converged: False cuando la iteración de regímenes de OccBin alcanzó max_iter (se emite un RuntimeWarning y summary() lo señala).
  • Unidades de una desviación en niveles:
  • Y, C, I, K, N, Ne, Nn, L, w: unidades del modelo (\(L_{ss} = 1/3\)).
  • R, Rk, Rn: rendimientos brutos trimestrales, de modo que la desviación es la variación del tipo neto trimestral en fracción (0,0025 = 25 pbs por trimestre, 100 pbs anualizados). Pi es la inflación bruta trimestral.
  • prem: el diferencial trimestral esperado \(\mathbb{E}_t[R_{k,t+1} - R_{t+1}]\) en fracción; 40000 * prem son puntos básicos anualizados.
  • phi: apalancamiento de la banca privada \((1 - \psi_t) Q_t K_t / N_t\), un cociente; psi: la fracción pública de los activos intermediados, cuyo estado estacionario es 0.
  • 100 * (x_t - x_ss) es un porcentaje solo para las variables cuyo estado estacionario vale 1 (Q, U, xi, a, Pi). En la solución por defecto el capital cae 0,2866 en niveles en el impacto frente a \(K_{ss} = 5{,}6601\): es un −5,06%, no un −28,66%.
  • Métodos disponibles:
  • to_frame(units="level"): Devuelve un DataFrame de pandas indexado por trimestres de simulación \(t = 0, \dots, T-1\). units="level" (por defecto) devuelve irf sin cambios; units="pct" devuelve desviaciones porcentuales \(100\,(x_t - x_{ss})/x_{ss}\). psi, cuyo estado estacionario es 0, no tiene desviación porcentual: vale NaN y figura en df.attrs["pct_undefined"]. df.attrs["units"] registra la elección.
  • .plot(variables=None, style="publication", figsize=None, units="level"): Gráfico multipanel en Matplotlib; por defecto Producto, Inversión, Patrimonio Bancario, Diferencial de Crédito, Tipo de Política Rn y Apalancamiento \(\phi\), con los trimestres restringidos de OccBin sombreados. units se pasa a to_frame y la etiqueta del eje y lo indica.
  • .summary(): Informe en texto con el estado estacionario, el choque y los valores de impacto, mínimo, máximo, media y final de las variables clave, en desviaciones en niveles (la cabecera lo indica y remite a units="pct").
  • .to_markdown(units="level"), .to_latex(units="level"), .to_typst(units="level"): Tablas listas para su inclusión en publicaciones académicas; units se pasa a to_frame.