Skip to content

🇬🇧 English · 🇪🇸 Español

Modelo arancelario de Leontief condensado con un factor

puremacro.trade.condensed resuelve un modelo arancelario estático multipaís y multisectorial con coeficientes de insumo fijos, un factor compuesto por país y aranceles de importación devueltos de suma fija; elimina precios y producciones de forma exacta, certifica cada equilibrio informado a partir de los flujos brutos de la tabla y solo informa de medidas que no dependen del numerario. Es un modelo distinto de solve_trade_equilibrium (contabilidad consistente); la tabla comparativa de abajo dice en qué se diferencian.

Ejemplo ejecutable sobre una tabla sintética

import numpy as np
from puremacro.trade import calibrate_trade_model
from puremacro.trade.data import synthetic_codes, synthetic_icio_table
from puremacro.trade.condensed import (
    BalancedIOTable, build_tariff_wedges, calibrate_condensed, compute_measures, solve_condensed,
)

# A seeded synthetic table: five countries, four sectors (the first two are merchandise).
countries, sectors = synthetic_codes(5, 4)
trade_calib = calibrate_trade_model(synthetic_icio_table(5, 4, seed=0),
                                    country_codes=countries, sector_codes=sectors)
table = BalancedIOTable.from_trade_calibration(trade_calib, merchandise_mask=[True, True, False, False])
calib = calibrate_condensed(table)

# C01 raises a 15% duty on merchandise from C02 and C03, and 5% on everyone else.
wedges = build_tariff_wedges(calib, {"C01": {"*": 0.05, "C02": 0.15, "C03": 0.15}})
print(wedges.to_dataframe().head())
result = solve_condensed(calib, wedges)                      # gate, Newton, certificate
print(result.summary())
measures = compute_measures(calib, wedges, result.state, country="C01", partners=("C02", "C03"))
print(measures.to_markdown())

Los códigos sectoriales sintéticos S01..S04 no pertenecen a ningún registro conocido, así que el puente recibe una merchandise_mask explícita; los aranceles recaen entonces solo sobre los dos sectores de mercancías. La ejecución da seis iteraciones de Newton y devuelve un certificado con bloque máximo cercano a 3e-12 (por debajo de la barrera de 1e-10). Para C01 la tasa efectiva sobre las importaciones gravables queda entre las tasas del 5% y del 15% (cerca del 11.7%), la recaudación arancelaria ronda el 1.8% del PIB y la variación equivalente se descompone exactamente en ingreso factorial real, recaudación neta real y la transferencia de déficit e inventarios. Las cifras salen de flujos aleatorios genéricos, no de ninguna economía. Hay ejemplos de tres regiones y otros sintéticos en tests/test_trade_condensed.py.

Qué calcula

Índices: países k, celdas i = country * S + sector (M = N S), categorías finales f en {C, G, X} con participaciones Cobb-Douglas e inventarios exógenos V. La referencia tiene todos los precios, salarios y multiplicadores iguales a uno.

Calibración a partir de una tabla balanceada (table_from_arrays y luego calibrate_condensed):

a_ij = Z_ij / y0_j     b_j = VA_j / y0_j     t_j = TLS_j / y0_j
omega^f_ik = F^f_ik / B^f_k        A0^f_k = B^f_k + TFD^f_k       t^f_k = TFD^f_k / A0^f_k
theta^f_k = A0^f_k / sum_f A0^f_k  qV_ik = F^V_ik                 TV_k = TFD^V_k
Fbar_k = sum_{j in k} VA_j         Y0_k = Fbar_k + sum_{j in k} TLS_j + sum_f TFD^f_k + TV_k
XN0_k = fob exports - imports      s_k = XN0_k / sum_l Fbar_l

Equilibrio en niveles (2M + 3N incógnitas, una ecuación redundante por la ley de Walras):

(E1) (1 - t_j) p_j = b_j w_c(j) + sum_i a_ij tau_ij p_i                       zero profit
(E2) y_i = sum_j a_ij y_j + sum_k (sum_f omega^f_ik q^f_k + qV_ik)             goods clearing
(E3) sum_{j in k} b_j y_j = Fbar_k                                              factor market
(E4) Y_k = w_k Fbar_k + PT_k + TR_k                                             income
(E5) XN_k = s_k sum_l w_l Fbar_l                                                closure
(E6) sum_l w_l Fbar_l = sum_l Fbar_l                                            numeraire
P^f_k = sum_i omega^f_ik tau^f_ik p_i     E^f_k = theta^f_k (Y_k - XN_k - E^V_k)
q^f_k = (1 - t^f_k) E^f_k / P^f_k         E^V_k = sum_i tau^V_ik p_i qV_ik + TV_k P^G_k

PT_k reúne los impuestos sobre productos en la producción y en las compras finales; TR_k reúne todos los aranceles ((tau - 1) x valor de productor) sobre compras intermedias, finales y de inventarios, y se devuelve mediante (E4). El cierre del saldo comercial (E5) mantiene el saldo de cada país como una proporción fija del ingreso factorial mundial (Dekle, Eaton y Kortum, 2008).

Condensación: dado z = (log w, Y / Y0), (E1) se resuelve exactamente con una LU de I - B_tau^T con B_tau,ij = a_ij tau_ij / (1 - t_j), y (E2) con una LU de I - a. Los residuos son (E3) y (E4) escalados por cantidades base, con la ecuación de ingreso del país de referencia sustituida por el numerario; esa ecuación eliminada es la comprobación de Walras que se informa con cada estado. El jacobiano usa diferencias hacia adelante (h = 1e-7) con los precios guardados entre las columnas de ingreso.

Solucionadores (solve_condensed): Newton amortiguado con retroceso de Armijo, un tope de 0.3 en los desplazamientos de log-salarios y la regla de parada max |r| <= 1e-12, |Walras| <= 1e-10; continuación en el parámetro natural de escala arancelaria (división a la mitad ante un fallo hasta 1/256, predictor secante); un respaldo anidado que resuelve el sistema afín de ingresos dados los salarios; continuación opcional por pseudolongitud de arco con monitores de pliegue (dlambda/ds, sign det J, sigma_min / sigma_max) y una comprobación de llegada a 1e-10; arranques múltiples cercanos opcionales que lanzan MultipleEquilibria cuando un arranque convergido cae a más de 1e-9. Una barrera de existencia de Collatz-Wielandt rho(B_tau) < 1 - 1e-3 (puremacro.trade.regularize.compute_spectral_radius) se ejecuta antes de cada solución y falla de forma cerrada: cotas que certifican rho < 1 pero no el margen lanzan ProductivityUncertified ("margin not met", con las cotas adjuntas), cotas que no certifican nada lo lanzan como "inconclusive", y ninguna afirma la no existencia; las cuñas construidas para otra tabla se rechazan con CalibrationError. Cuando la continuación se estanca, la etiqueta de diagnóstico del respaldo anidado y su registro de etapas (continuation_lam_reached) nombran el estancamiento.

Certificado (certify_raw_flows): diez bloques recalculados a partir de Z, F, VA, TLS, TFD y las cuñas, nunca de a, b, omega, theta ni de las factorizaciones: beneficio cero en las celdas activas, vaciado de bienes, mercados de factores, presupuesto de los hogares, ingreso nacional, identidad de la recaudación arancelaria, cierre, identidad de la cuenta corriente (NX a partir de valores de productor bilaterales), adición mundial y el numerario. Cada bloque debe ser como mucho 1e-10; solve_condensed lanza CertificationFailure en otro caso y nunca devuelve converged=True tras un fallo. El certificado usa los precios y las cantidades de las canastas del estado, de modo que es independiente de los coeficientes calibrados pero no del sistema de demanda que los produjo. Los dos bloques por celda (beneficio cero, vaciado de bienes) se escalan por max(p_j y_j, cell_floor) y max(y_i, cell_floor) con cell_floor = 1 en las unidades propias de la tabla, así que las celdas por debajo de una unidad se juzgan con 1e-10 absoluto; pase un cell_floor menor a certify_raw_flows para tablas en unidades grandes. Las celdas fantasma (celdas vacías que la construcción llena con flujos de 1e-6) quedan fuera solo del bloque de beneficio cero; todos los demás bloques usan su razón de producción verdadera y_j / y0_j, porque el modelo deja moverse la producción fantasma y el valor agregado fantasma forma parte de Fbar. solve_condensed(..., certify=False) omite el certificado solo para diagnóstico: ese resultado está converged pero no passed ni certified.

Medidas (compute_measures, todas independientes del numerario, P^U_k = prod_f (P^f_k / P0^f_k)^theta^f_k):

Medida Definición
precios al consumidor relativos a los salarios P^C_k / (P0^C_k w_k) - 1, el inverso del salario real de consumo (no un IPC)
variación equivalente Atil^1_k / P^U_k - Atil^0_k, en porcentaje del PIB base, con la descomposición exacta en ingreso factorial real, recaudación neta real (aranceles y otros impuestos) y la transferencia de déficit e inventarios
ingreso nacional real (Y_k / P^U_k) / Y0_k - 1
términos de intercambio de Fisher fob, sin aranceles, sqrt(L^X P^X / (L^M P^M)) - 1 a cantidades base
recaudación arancelaria TR_k / Y_k y la tasa efectiva sobre importaciones gravables (los inventarios solo cuentan como gravables cuando el estado se resolvió con inventories="tariffed")
PIB real a precios constantes sum (VA_j + TLS_j) yhat_j + sum_f TFD^f qhat^f + TFD^V, solo un efecto de composición
cota de costo unitario de EP p^PE = (I - B_tau^T)^{-1} b / (1 - t), ln(1 + Pi^C) = ln(1 + Pi^{C,PE}) + Delta^rel, y la separación de primer orden directa/en cascada
incidencia sectorial sector_incidence(..., groups=...) con dispersión dentro de cada grupo ponderada por la producción

separate_baseline_tariffs(calib, wedges) reexpresa los aranceles observados en la referencia como cuñas brutas explícitas con impuestos residuales sobre productos, de modo que los incrementos contrafactuales se acumulan sobre aranceles iniciales no nulos sin contar dos veces la recaudación aduanera de referencia (barreras a 1e-11). Es una separación contable, no una prueba de que un arancel no observado sea cero.

Contrato de datos

table_from_arrays (o BalancedIOTable.from_arrays) acepta el esquema Z (M, M), F (M, N, K), VA (M,), TLS (M,), TFD (N, K), country_codes, sector_codes y fd_codes en cualquiera de los seis códigos de la OCDE, ("C", "G", "X", "V"), ("C", "G", "X", "V", "VAL") (VAL se une a V y se registra), ("C", "G", "X"), el ("C", "I", "Cx") de la tabla procesada, o los vocabularios de demanda final de los cargadores de puremacro.trade.data: FIGARO (P3_S14, P3_S15, P3_S13 sumados en C, P51G en G, P5M en V), EXIOBASE (HFCE, NPISH, GGFC, GFCF, INVNT, VALUABLES unido a V, y una columna EXPORT que debe ser idénticamente cero en una tabla cerrada), WIOD (CONS_h, CONS_np, CONS_g, GFCF, INVT) y Eora (HFCE, NPISH, GGFC, GFCF, INVNT, ACQ_VAL unido a V). Los códigos que se asignan a una misma categoría se suman; C y G son obligatorias, X y V valen cero cuando faltan. Los esquemas sin columna de compras en el exterior (todos salvo el de la OCDE) dan una canasta X vacía, así que calibrate_condensed necesita allow_empty_purchases_abroad=True para ellos (X copia la canasta C como precio auxiliar; su gasto es idénticamente cero). Los esquemas de tres categorías y cualquier tabla con celdas G negativas necesitan negative_investment="raise" (por defecto) o "to_inventory". BalancedIOTable.from_io_table acepta cualquier objeto con esos atributos (incluida una Z dispersa), from_raw acepta un puremacro.trade.data.RawIOData de cualquiera de los cinco cargadores, y from_trade_calibration hace de puente desde un TradeCalibrationResult (trabajo y capital se suman en el factor único; G contiene los inventarios; Cx pasa a ser X para una tabla sin asignación de usos finales registrada y para la asignación DPABR de la OCDE, mientras que el Cx de los cargadores FIGARO, WIOD y Eora pasa a ser el V exógeno, así que esas tablas se calibran con allow_empty_purchases_abroad=True, y el Cx de EXIOBASE necesita un cx_category explícito). La construcción añade fantasmas de 1e-6 a las celdas vacías, pone un piso de 1e-3 de la producción al valor agregado no positivo, recalcula TLS como residuo de columna y pone una barrera al cambio (1e-4 del |TLS| mundial, 1e-2 de la producción de una celda), y asigna el redondeo mundial de los saldos comerciales al país de referencia (el último código por defecto). La máscara de mercancías (secciones A-C de la CIIU Rev.4; los suministros, la construcción y los servicios no son mercancías) se infiere para el registro de 45 industrias de la OCDE, las letras de sección de la CIIU Rev.4 y el fixture congelado de tres sectores; los demás registros (los códigos sectoriales de FIGARO, EXIOBASE, WIOD y Eora, y los códigos sintéticos) pasan merchandise_mask, por ejemplo a partir de puremacro.trade.mrio.goods_mask.

Los aranceles son tasas ad valorem r >= 0; las transacciones domésticas nunca se gravan y las compras de residentes en el exterior (X) están exentas. Los multiplicadores menores que uno (subsidios a la importación) los rechaza TariffWedges.from_arrays, lo que mantiene la matriz de costos no decreciente en la escala arancelaria, de modo que un único certificado de existencia con el arancel completo cubre todas las etapas de la continuación. build_tariff_wedges acepta un escalar, una tabla (N, S) de origen por sector para un importador, un arreglo (N, N, S), un diccionario {importer: {origin | "*": rate}} (represalias; un origen nombrado siempre prevalece sobre "*", sea cual sea el orden de las claves) o una función como TariffScenario.get_rate. wedges.to_dataframe() enumera las tasas no nulas por origen, importador y sector. La cobertura por defecto son las mercancías (coverage="all" incluye los servicios); fd_tariffed elige cuáles de C, G, V pagan el arancel. Con coverage="goods", una especificación explícita por sector (un arreglo con eje sectorial, un arreglo (S,) en un diccionario o una función) que pone aranceles a sectores de servicios se recorta a las mercancías con un RuntimeWarning, y los sectores recortados se registran en wedges.metadata["dropped_service_rates"]; las tasas escalares significan "todos los sectores cubiertos" y no avisan. Las concordancias y las tablas agregadas pertenecen a puremacro.trade.mrio (sus tablas entran por from_io_table).

Dos modelos, no uno

solve_trade_equilibrium (contabilidad consistente) puremacro.trade.condensed
Factores trabajo y capital, valor agregado Cobb-Douglas un factor compuesto por país
Demanda final participaciones C, I, Cx del ingreso; ahorro externo fijo restado de I C, G, X Cobb-Douglas sobre la absorción neta de inventarios exógenos V
Saldo comercial ahorro externo base fijo (en unidades del numerario o como proporción del ingreso factorial mundial) proporciones del ingreso factorial mundial (también del PIB mundial o del PIB propio)
Numerario primer precio de productor = 1 ingreso factorial mundial (o el salario de cualquier país)
Incógnitas sistema completo (Newton, LU dispersa, Krylov, PAC de Keller) condensación exacta de 2N (log w, Y / Y0)
Tolerancia y aceptación residuo y libro contable a la tolerancia del solucionador residuo de 1e-12, Walras de 1e-10, diez bloques de flujos brutos a 1e-10
Bienestar EV/CV hicksianas con atribución de Shapley entre extremos EV con descomposición aditiva exacta, ingreso nacional real, ToT de Fisher
Aranceles de referencia los flujos observados son flujos a precios básicos separate_baseline_tariffs

Los resultados no son intercambiables entre las dos columnas. Use el modelo condensado cuando quiera una referencia de Leontief de un factor certificada y con medidas independientes del numerario; use la contabilidad consistente cuando necesite la estructura de dos factores o las herramientas de política hicksianas.

Qué está validado y qué no

Verificado en este repositorio (tests/test_trade_condensed.py): reproducción de la referencia a 1e-14 para todos los cierres y numerarios; certificados de 1e-10 o menos en una tabla sintética 3x4, el fixture congelado OCDE 3x3, una tabla sintética 20x6 y una tabla sintética 5x4; el certificado reacciona a perturbaciones de 1e-5 de w, p, y, Y, XN, TR en el bloque nombrado y a una perturbación salarial de 1e-9; certificados de tablas en unidades naturales con de una a seis celdas vacías (fantasma); aditividad de la descomposición de la EV a 1e-12; invariancia al numerario de dieciocho medidas y componentes de la descomposición a 1e-9; un arancel sobre cantidades fijas de inventarios es neutral con el cierre factorial y no con el cierre de PIB mundial; homogeneidad al escalar la tabla por 1000; una tasa efectiva exacta del 10% para un arancel uniforme, también cuando los inventarios no pagan arancel; los jacobianos hacia adelante y centrados coinciden a 1e-6 relativo; la cota de EP queda por debajo del precio al consumidor de EG; las etapas de continuación, la detección de estancamiento, el respaldo anidado, los monitores y la llegada por longitud de arco, los arranques múltiples cercanos y la recuperación desde un arranque lejano en la tabla 20x6; una frontera de existencia que falla de forma cerrada en la economía sintética 3x4 (un arancel del 500% de su primer país sobre las mercancías supera la barrera de existencia, pero el equilibrio con un salario positivo en ese país deja de existir cerca de un arancel del 259%, lambda* = 0.51773 de 500%: a lo largo de la rama lambda crece de forma monótona mientras el salario tiende a cero; la continuación en el parámetro natural se estanca en lambda = 0.515625, la pseudolongitud de arco lanza FoldDetected donde el jacobiano es numéricamente singular, y solve_condensed termina en EquilibriumNotFound nombrando el estancamiento); y los cinco esquemas de cargadores de puremacro.trade.data en tablas sintéticas 3x3.

No validado: no se afirma unicidad global, ni un umbral de pliegue universal, ni una garantía global para Newton. Las comprobaciones numéricas del residuo no establecen existencia, unicidad ni optimalidad global de un equilibrio, y los umbrales del certificado son criterios de verificación en coma flotante, no encierros de raíces por intervalos. La longitud de arco y los arranques múltiples son evidencia, no pruebas. No se ha exhibido ningún punto de retorno en un ejemplo económico: el monitor de pliegue se ejercita con un cambio de signo sintético del determinante y con la frontera de existencia de arriba, así que FoldDetected significa que la trayectoria no puede continuarse de forma regular (un punto de retorno o una frontera de existencia), y la frontera no es un umbral de pliegue universal. La EV estática incluye la inversión en el compuesto de absorción. Las ejecuciones completas de 45 sectores sobre las tablas de la OCDE usan factorizaciones LU densas de matrices M x M con M en los miles y no son un objetivo para el navegador.

Referencias

  • Dekle, R., Eaton, J., & Kortum, S. (2008). "Global Rebalancing with Gravity: Measuring the Burden of Adjustment." IMF Staff Papers, 55(3), 511–540.

Relacionado: contabilidad de comercio consistente, bienestar hicksiano del consumo, política arancelaria hicksiana, tablas MRIO, estado de la validación estructural.