🇬🇧 English · 🇪🇸 Español
Bloque fiscal y reglas fiscales en un modelo de impago soberano
solve_fiscal_sovereign_default añade gasto público al modelo de impago
soberano de Arellano (2008) con deuda a corto plazo. Se grava una fracción fija
del producto, el gobierno se endeuda o ahorra con bonos a un período valorados
por prestamistas neutrales al riesgo y gasta el resto. El resultado presenta
las políticas de gasto, saldo primario y deuda sobre producto junto a los
valores, precios y probabilidades de impago habituales.
Modelo
El producto \(y\) sigue el AR(1) de Tauchen de solve_sovereign_default,
normalizado a media estacionaria uno. Con tasa impositiva \(\tau\), el consumo
privado es \(c=(1-\tau)y\) y el gasto público es
El gobierno valora ambos:
con \(V=\max(V^R,V^D)\) (log-sum-exp si sigma_eps > 0), \(u\) y \(v\) CRRA con
curvaturas gamma_c y gamma_g, y el producto en impago de Arellano
\(h(y)=\min(y,0.969\bar y)\). Los precios son \(q(b',y)=E[1-d(b',y')\mid y]/(1+r^*)\).
El saldo primario es \(pb=\tau y-g=b-q\,b'\) y la deuda sobre producto, \(b'/y\).
El consumo privado no depende de la elección de deuda, de modo que esa
elección es el problema de Arellano con recursos \(\tau y\) y utilidad \(\psi v\);
el término privado solo desplaza los valores de reembolso e impago y, por
tanto, la decisión de impago y los precios. private_consumption=False lo
elimina.
Unidades
Deuda, gasto y saldo primario se expresan en unidades de producto medio por
trimestre (el período del modelo). El producto medio es uno, así que
debt_to_gdp = 0.02 significa deuda igual al 2 % del producto de un
trimestre. Una razón anual deuda/PIB es la cuarta parte de estas cifras
(el 2 % del producto trimestral es el 0,5 % del producto anual). Los
diferenciales están anualizados, 4 * max(0, quarterly_yield - r_star).
Una calibración ilustrativa
tau y psi no tienen valores por defecto. La llamada siguiente es una
calibración ilustrativa, no ajustada a ningún dato ni objetivo:
tau = 0.20, psi = 1, gamma_c = gamma_g = 2, los parámetros públicos de
Arellano (beta = 0.95282, r_star = 0.017, theta = 0.282,
rho_y = 0.945, sigma_y = 0.025) y la malla pública de deuda escalada por
0,2 (b_min = -0.03, b_max = 0.066).
from puremacro.sovereign import solve_fiscal_sovereign_default
res = solve_fiscal_sovereign_default(tau=0.2, psi=1.0, n_b=101, n_y=11)
assert res.converged
assert res.metadata["monotone_certification_gap"] <= 1e-11
print(res.summary().tail(5))
path = res.simulate(periods=1000, seed=42)
print(path[["debt_to_gdp", "primary_balance", "g", "spread"]].describe())
res.g_policy, res.primary_balance y res.debt_to_gdp son matrices
(n_b, n_y) evaluadas en la deuda elegida en cada estado, res.policy_index;
res.g_default y res.private_consumption_default dan los valores en impago.
res.simulate() parte de deuda cero y del nodo central de ingreso; sus
columnas incluyen gdp (y si se reembolsa, \(h(y)\) en otro caso), y
g + private_consumption + primary_balance == gdp. Su flujo aleatorio difiere
del de SovereignDefaultResult.simulate para la misma semilla.
res.spread_mean, res.spread_y_corr y las filas de diferenciales de
res.summary() proceden de la trayectoria de diagnóstico del propio solucionador
(1.500 trimestres, semilla 42, sin calentamiento), por lo que no coincidirán con
los momentos largos con semillas emparejadas de la tabla de mallas.
Búsqueda y certificación
policy_search="monotone" (por defecto) busca la deuda en \(O(n_b\log n_b)\)
por estado de ingreso, usando la concavidad de \(\psi v\). Devuelve los mismos
valores que "dense", y las mismas políticas salvo empates exactos de valor
entre elecciones con distinto ingreso por emisión. Tras converger, una
búsqueda exhaustiva por bloques a los precios devueltos la certifica: una
diferencia superior a 1e-11 produce RuntimeError. Si algún gasto candidato
alcanza la barrera de utilidad 1e-6, la búsqueda monótona produce
ValueError; use allí policy_search="dense".
En modo denso esos candidatos quedan excluidos por la barrera
psi * (-1e12 + 1e6 g), cuya fuerza escala con psi; se cumplió para psi
entre 1e-18 y 1 en una malla de 61 × 7 con b_max = 0.5, pero valores de psi
inferiores a 1e-12 (una barrera de menos de un útil) no están cubiertos por las pruebas.
Reducción al solucionador de Arellano
Con tau=1, psi=1, gamma_g=gamma y private_consumption=False el modelo
fiscal es el de Arellano, y el solucionador reproduce
solve_sovereign_default bit a bit (valores, precios, políticas,
diferenciales y número de iteraciones). Esto enlaza el bloque fiscal con el
solucionador validado en la replicación de Arellano.
Con tau=0.2, la malla de deuda escalada por 0,2 y aún
private_consumption=False, la homogeneidad CRRA da las mismas políticas,
conjuntos de impago y precios, y valores
\(V_\tau=\tau^{1-\gamma}V_1+(\tau^{1-\gamma}-1)/((1-\gamma)(1-\beta))\) (con
\(\gamma=1\), \(V_1+\log\tau/(1-\beta)\)); las pruebas comprueban ambas cosas. La
calibración ilustrativa activa el consumo privado, así que no es un modelo
de Arellano reescalado: el término privado cambia la decisión de impago, los
precios y la deuda. Se rechaza tau=1
con consumo privado activado (el consumo privado sería cero).
import numpy as np
from puremacro.sovereign import solve_sovereign_default
grid = dict(beta=0.95282, r_star=0.017, theta=0.282, b_min=-0.15, b_max=0.33,
n_b=101, n_y=9, sigma_eps=0.0, y_penalty_type="arellano",
enforce_monotonicity=False, tol=1e-10, max_iter=10000,
policy_search="monotone")
fiscal = solve_fiscal_sovereign_default(tau=1.0, psi=1.0, private_consumption=False, **grid)
plain = solve_sovereign_default(gamma=2.0, **grid)
assert np.array_equal(fiscal.bond_price, plain.bond_price)
assert np.array_equal(fiscal.policy_b, plain.policy_b)
Convergencia en la malla
No existe una referencia fiscal independiente. La escalera de mallas resuelve
el solucionador público con la calibración ilustrativa y la búsqueda monótona
certificada en n_b = 1.601, 3.201, 6.401 y n_y = 321, 641, y simula
dieciséis semillas emparejadas (1979-1994) de 500.000 trimestres tras 1.000
trimestres de calentamiento. Las tolerancias se fijan antes de resolver: 0,10
para momentos en porcentaje y 0,02 para la correlación, aplicadas al cambio
medio emparejado más su semiamplitud t de Student al 95 % para el último
refinamiento de deuda (3.201 → 6.401 con 641 estados de ingreso) y el último
refinamiento de ingreso (321 → 641 con 6.401 nodos de deuda).
Media de las dieciséis semillas. Deuda/producto en porcentaje del producto trimestral; gasto/producto en porcentaje; diferenciales en porcentaje anual.
| Malla (deuda × ingreso) | Deuda/producto (%) | Diferencial medio (%) | Impago anual (%) | DE del diferencial (pp) | Gasto/producto (%) | corr(pb/y, log y) |
|---|---|---|---|---|---|---|
| 1.601 × 321 | 0,838 | 3,129 | 3,010 | 2,865 | 19,983 | -0,138 |
| 3.201 × 321 | 0,839 | 3,143 | 3,031 | 2,808 | 19,983 | -0,138 |
| 6.401 × 321 | 0,839 | 3,146 | 3,030 | 2,784 | 19,983 | -0,138 |
| 1.601 × 641 | 0,829 | 3,097 | 2,977 | 2,797 | 19,983 | -0,138 |
| 3.201 × 641 | 0,830 | 3,100 | 2,985 | 2,735 | 19,983 | -0,138 |
| 6.401 × 641 | 0,831 | 3,102 | 2,987 | 2,716 | 19,983 | -0,138 |
Veredicto: superada. En ambos refinamientos finales, el cambio emparejado de cada
momento más su semiamplitud al 95 % cabe en su tolerancia; el mayor es la desviación
típica del diferencial en el refinamiento de ingreso, 0,070 pp frente a 0,10.
Todas las resoluciones convergieron con diferencia de certificación 0 y ningún
período de reembolso eligió el nodo superior de deuda.
Superar la prueba no significa que no quede deriva: con 6.401 nodos de deuda la
desviación típica del diferencial aún baja de 321 a 641 estados de ingreso
(2,784 → 2,716 pp), y la escalera no tiene un peldaño de 1.281 estados que muestre
dónde se estabiliza. Su tercer dígito merece la misma cautela que la
guía de Arellano aplica a los refinamientos de ingreso.
La deuda es baja, cerca del 0,83 % del producto trimestral (en torno al 0,2 %
del producto anual), por la razón anterior: la elección de deuda escala con los
recursos tau*y, de modo que el gobierno mantiene unas tau veces la deuda del
propio modelo de Arellano, y los modelos de Arellano con deuda a corto plazo ya
mantienen poca deuda. Medido con el mismo motor de trayectorias en mallas de
801 × 161 (8 semillas × 100.000 trimestres), el modelo de Arellano con la
calibración pública (tau=1, sin consumo privado) mantiene el 3,64 % del
producto trimestral; tau=0.2 sin consumo privado, el 0,727 %, exactamente un
quinto; activar el consumo privado lo eleva al 0,86 % (0,83 % en la malla más
fina de la tabla). Eso equivale a cerca del 4 % del ingreso tributario de un
trimestre (tau por el producto medio, 0,2).
El registro congelado es tests/fixtures/sovereign_fiscal/fiscal_grid_convergence.json;
las pruebas recalculan su veredicto a partir de los momentos por semilla.
Reglas fiscales
rule=FiscalRule(...) restringe la deuda siguiente cuando se reembolsa. Los
prestamistas conocen la regla, de modo que cambia los precios de equilibrio de
los bonos además de las decisiones del gobierno.
| Campo | Significado | Búsqueda |
|---|---|---|
debt_ceiling |
tope estricto b' <= debt_ceiling |
"monotone" (certificada), "exhaustive", "dense" |
escape_below |
toda la regla se suspende cuando y < escape_below |
la de la regla que suspende |
penalty |
todos los componentes pasan a ser blandos: cada uno incumplido cuesta penalty útiles (los incumplimientos se suman) |
como arriba |
deficit_limit |
b' - b <= deficit_limit (nuevo endeudamiento neto; negativo exige reducir deuda) |
solo "exhaustive" o "dense" |
Los umbrales están en producto medio por trimestre, como la deuda: un tope de
0,02 es el 2 % del producto de un trimestre, o el 0,5 % del producto anual;
escape_below=0.92 es un ingreso un 8 % inferior a su media (cerca de una
desviación típica incondicional). Una elección en el tope, con tolerancia
1e-12, cumple la regla. Un límite de déficit liga la elección a la deuda
actual, lo que rompe la búsqueda monótona, así que con
policy_search="monotone" produce ValueError; la búsqueda exhaustiva por
bloques cuesta O(n_b² n_y) por iteración, por lo que conviene usar mallas
gruesas como 401 × 21.
Si una regla estricta deja un estado sin deuda admisible (por ejemplo
deficit_limit=-0.01 en los nodos de deuda más bajos), el solucionador falla
antes de resolver y nombra hasta diez de esos estados; con
infeasible="default" el gobierno incurre en impago seguro en ellos
(v_repay = -inf, default_prob = 1).
from puremacro.sovereign import FiscalRule, solve_fiscal_sovereign_default
small = dict(tau=0.2, psi=1.0, n_b=101, n_y=11)
rules = {
"ceiling": FiscalRule(debt_ceiling=0.02),
"ceiling_escape": FiscalRule(debt_ceiling=0.02, escape_below=0.92),
"soft_ceiling": FiscalRule(debt_ceiling=0.02, penalty=0.05),
"deficit": FiscalRule(deficit_limit=0.005),
}
for name, rule in rules.items():
search = "exhaustive" if rule.deficit_limit is not None else "monotone"
res = solve_fiscal_sovereign_default(**small, rule=rule, policy_search=search)
assert res.converged and res.rule is rule
print(name, res.metadata["policy_search"], round(float(res.policy_b.max()), 4))
strict = FiscalRule(deficit_limit=-0.01) # must cut debt by 1% of output each quarter
try:
solve_fiscal_sovereign_default(**small, rule=strict, policy_search="exhaustive")
except ValueError as err:
print(err) # names the states with no admissible choice
forced = solve_fiscal_sovereign_default(
**small, rule=FiscalRule(deficit_limit=-0.01, infeasible="default"), policy_search="exhaustive")
print(forced.metadata["rule_infeasible_states"]) # those states now default for sure
Predicciones registradas y resultado
Antes de resolver ninguna regla se registraron las predicciones siguientes y
sus definiciones en tests/fixtures/sovereign_fiscal/rule_predictions_protocol.json;
tools/reference_validation/check_fiscal_rule_predictions.py las midió
(registro: rule_predictions_record.json; 16 semillas emparejadas × 100.000
trimestres). Las fracciones de activación se miden en las trayectorias sin
regla: la fracción de trimestres de reembolso en que la elección sin
restricción incumpliría la regla.
Para regenerar el registro (cerca de un minuto; lee el protocolo y nunca lo modifica):
MPLBACKEND=Agg python -m tools.reference_validation.check_fiscal_rule_predictions --output /tmp/rule_predictions_record.json
| Predicción | Registrada | Resultado | Veredicto |
|---|---|---|---|
Cláusula de escape inerte: mayor deuda elegida con y < 0.92 |
cerca de 0,001, muy por debajo de 0,02 | 0,00048 (401 × 21), 0,00060 (801 × 41); ningún momento cambia | se cumplió |
| El tope de 0,02 se activa | 19–23 % de los trimestres de reembolso | 23,4 % | no se cumplió |
El tope solo se activa en auges (y > 1) |
todos los trimestres activos | todos | se cumplió |
| El límite de déficit de 0,005 se activa | 1–2 % | 1,7 % | se cumplió |
Equivalente en producto de penalty=0.05 |
cerca de 0,002 | 0,0020 | se informa (sin banda registrada) |
La fracción de activación del tope quedó justo por encima de la banda
registrada; se informa tal cual, y ningún umbral se cambió después.
En la fila de la cláusula de escape, «se cumplió» es el criterio de la
herramienta: la mayor deuda elegida con y < 0.92 queda por debajo del tope de
0,02 en ambas mallas, y todos los momentos superan la comparación emparejada con
el tope simple. Los valores hallados, 0,00048 y 0,00060, son cerca de la mitad
del «cerca de 0,001» del protocolo.
Por qué la cláusula de escape no hace nada aquí. El riesgo de impago es máximo en las malas épocas, así que los precios de los prestamistas ya encarecen el endeudamiento en recesión: con ingreso inferior a 0,92 el gobierno sin restricción nunca elige más de 0,00048 del producto trimestral, la cuadragésima parte del tope. Con esos ingresos el precio del bono en el tope es prácticamente cero (como mucho el 0,13 % del precio sin riesgo), y lo máximo que el gobierno puede obtener endeudándose es 0,0011 del producto trimestral (401 × 21). La disciplina de mercado actúa antes que la regla, de modo que suspenderla en recesión no cambia nada: las filas con cláusula de escape coinciden con el tope simple en todas las semillas. El tope solo se activa en auges, cuando el gobierno se endeudaría más.
Escala de la penalización. La penalización está en útiles. Dividida por la
utilidad marginal del gasto, psi g^(-gamma_g), promediada en los trimestres
de reembolso del modelo con tope blando (g medio = 0,200), da su
equivalente en producto: penalty=0.05 cuesta cerca de 0,0020 del producto
trimestral por incumplimiento. En las trayectorias simuladas, que parten de
deuda cero, el gobierno nunca supera el tope a ese precio (0,0 % de los
trimestres de reembolso), y con cualquier deuda actual b <= 0.02 las reglas
blanda y estricta eligen la misma deuda. Fuera de esas trayectorias difieren:
en 503 estados de reembolso, todos con deuda actual de al menos 0,04776, el
gobierno con regla blanda refinancia su deuda por encima del tope y paga la
penalización en lugar de recortar de golpe hasta el tope. Las trayectorias que
parten de deuda alta, como los gráficos de abanico de sostenibilidad, mostrarían
esa diferencia.
MALLA GRUESA 401 × 21: compare reglas solo dentro de esta tabla. Los momentos en malla gruesa difieren de los convergidos (la DE del diferencial sin regla es aquí 5,906 pp frente a 2,716 con 6.401 × 641).
| Regla | Deuda/producto (%) | Diferencial medio (%) | Impago anual (%) | DE del diferencial (pp) |
|---|---|---|---|---|
none |
1,057 | 3,912 | 3,744 | 5,906 |
ceiling |
0,796 | 3,726 | 3,569 | 5,698 |
ceiling_escape |
0,796 | 3,726 | 3,569 | 5,698 |
soft_ceiling |
0,796 | 3,726 | 3,569 | 5,698 |
deficit |
1,053 | 3,908 | 3,739 | 5,902 |
El tope reduce la deuda media, y la menor deuda va acompañada de diferenciales y frecuencia de impago más bajos; el límite de déficit apenas se activa.
Trayectorias de sostenibilidad desde deuda elevada
Las simulaciones ergódicas que parten de deuda cero nunca visitan los estados (\(b \ge 0,04776\)) donde divergen el tope blando y el tope estricto. simulate_fiscal_dsa y compare_fiscal_rules_dsa parten en cambio de una deuda inicial elevada (por defecto b0 = 0.05 con producto de auge y0 = 1.10, donde el soberano reembolsa) y trazan la distribución de transición a 40 trimestres con números aleatorios comunes entre reglas.
En la malla 401 × 21 (1.000 trayectorias, 40 trimestres, seed = 42, threshold = 0.02):
| Regla | Deuda elegida período 1 \(b'_1\) | Gasto/producto período 1 (%) | Período 1 sobre 0,02 (%) | Trimestres reembolso sobre 0,02 (%) | Deuda mediana terminal (%) | \(\text{DaR}_{95}\) terminal (%) | Impago acumulado (%) |
|---|---|---|---|---|---|---|---|
none |
0,03960 | 18,99 | 100,0 | 46,74 | 0,816 | 4,225 | 30,50 |
ceiling |
0,01992 | 17,22 | 0,0 | 0,00 | 0,792 | 1,992 | 26,60 |
ceiling_escape |
0,01992 | 17,22 | 0,0 | 0,00 | 0,792 | 1,992 | 26,60 |
soft_ceiling |
0,03600 | 18,67 | 100,0 | 2,56 | 0,792 | 1,992 | 26,90 |
deficit |
0,03960 | 18,99 | 100,0 | 46,58 | 0,768 | 4,225 | 30,50 |
Partiendo de \(b_0 \approx 0,05\), el tope estricto (ceiling) fuerza un ajuste fiscal en un solo trimestre desde \(b_0 = 0,04992\) hasta \(b'_1 = 0,01992 \le 0,02\), comprimiendo el gasto público del primer período al \(17,22\,\%\) del producto (\(-1,77\text{ pp}\) por debajo de none). Bajo el tope blando (soft_ceiling, penalty = 0.05), el gobierno prefiere pagar la penalización de utilidad en el primer trimestre y elegir una deuda intermedia \(b'_1 = 0,03600 > 0,02\), suavizando el gasto público del primer período en el \(18,67\,\%\) del producto (\(+1,45\text{ pp}\) por encima del tope estricto) antes de completar el desapalancamiento por debajo de \(0,02\) en el segundo trimestre (\(2,56\,\%\) de los trimestres de reembolso sobre el tope en total, con el mismo \(\text{DaR}_{95}\) terminal de \(1,992\,\%\) que el tope estricto).
from puremacro.sovereign import compare_fiscal_rules_dsa, simulate_fiscal_dsa
dsa_models = {
"none": solve_fiscal_sovereign_default(**small),
"ceiling": solve_fiscal_sovereign_default(**small, rule=rules["ceiling"]),
"soft_ceiling": solve_fiscal_sovereign_default(**small, rule=rules["soft_ceiling"]),
}
dsa_table = compare_fiscal_rules_dsa(dsa_models, b0=0.05, y0=1.10, horizon=20, n_sims=200, seed=42)
assert dsa_table.loc[dsa_table["rule_name"] == "ceiling", "prob_breach_pct"].item() == 0.0
assert dsa_table.loc[dsa_table["rule_name"] == "soft_ceiling", "first_period_above_threshold_pct"].item() == 100.0
soft_dsa = simulate_fiscal_dsa(dsa_models["soft_ceiling"], b0=0.05, y0=1.10, horizon=20, n_sims=200, seed=42)
print(dsa_table[["rule_name", "first_period_b_next", "first_period_g_pct", "dar_95_pct"]])
Límites
- Economía de dotación: el producto no responde a impuestos ni al gasto.
- Tasa impositiva fija:
taues un parámetro, no una decisión de política. - Solo deuda a corto plazo (
delta = 1,kappa = 0). - Las reglas son plenamente creíbles y permanentes; el gobierno no puede renegociarlas.
- La calibración es ilustrativa y los momentos describen este modelo con estos parámetros, no a ningún país.
flowchart TD
A[Proceso de ingreso y malla de deuda] --> B[Recursos tau*y, utilidad psi*v]
B --> C[Elección de deuda monótona certificada o densa]
C --> D[Decisión de impago y precios de bonos]
D --> C
D --> E[Políticas de gasto, saldo primario y deuda/producto]
E --> F[Escalera de mallas con semillas emparejadas]