La política monetaria de la Reserva Federal de los Estados Unidos (Fed) constituye uno de los principales canales de transmisión financiera a nivel global debido al papel central del dólar en el sistema internacional. En este contexto, los ciclos de endurecimiento de la tasa de interés de referencia generan efectos que se transmiten hacia economías desarrolladas y emergentes a través de diversos canales financieros, afectando los flujos de capital, los precios de los activos, las tasas domésticas y el tipo de cambio. Esta dinámica se enmarca en lo descrito por Rey (2015), según el cual la política monetaria del país emisor de la moneda dominante influye de manera sistemática sobre las condiciones financieras internacionales.
Los tres mecanismos principales de transmisión internacional son:
Este último canal es especialmente relevante para economías pequeñas y abiertas como Paraguay. El presente trabajo analiza cómo los movimientos de la tasa de fondos federales se transmiten hacia la economía paraguaya, distinguiendo entre:
Pregunta de investigación: ¿cómo y en qué magnitud los shocks de la tasa de fondos federales afectan al tipo de cambio real, la inflación y la actividad económica de Paraguay?
Estimar, mediante un modelo de Vectores Autorregresivos Estructurales (SVAR), el efecto dinámico de shocks en la tasa de fondos federales sobre el tipo de cambio real, la inflación y la actividad económica de Paraguay, identificando el rol de la Regla de Taylor doméstica y el canal cambiario en dicha transmisión.
Rey (2015) postula que las condiciones financieras de las economías emergentes están supeditadas a la política monetaria del país emisor de la moneda dominante, generando comovimientos generalizados entre economías avanzadas y emergentes ante shocks financieros comunes.
La Regla de Taylor (Taylor, 1993) especifica la función de reacción de un banco central que opera bajo un esquema de metas de inflación:
\[i_t = r^* + \pi_t + \phi_\pi(\pi_t - \pi^*) + \phi_y(\hat{y}_t)\]
En nuestro modelo, esta regla ancla el comportamiento de la TPM paraguaya: el Banco Central ajusta su tasa de referencia en respuesta a desviaciones de la inflación y de la brecha del producto respecto de sus niveles de referencia.
El canal cambiario constituye el mecanismo mediante el cual se valida empíricamente la transmisión externa: la brecha del tipo de cambio real se incorpora como la variable que recibe de manera más directa los shocks externos, respondiendo contemporáneamente a la inflación local vía paridad de tasas de interés (Cresta, 2014; BCP, 2019).
En conjunto, el modelo utiliza la Regla de Taylor para modelar la reacción interna del BCP y el Canal Cambiario para modelar la recepción del impacto de la Reserva Federal.
Siguiendo el enfoque de Lütkepohl (2005), el sistema estructural se expresa como:
\[B_0 Y_t = B_1 Y_{t-1} + \cdots + B_p Y_{t-p} + u_t\]
donde \(Y_t\) es el vector de variables endógenas, \(B_0\) representa la matriz de relaciones contemporáneas, y \(u_t\) son los shocks estructurales ortogonales. Dado que estos no son observables directamente, el modelo se estima en su forma reducida:
\[Y_t = A_1 Y_{t-1} + \cdots + A_p Y_{t-p} + \varepsilon_t, \qquad \varepsilon_t = B_0^{-1} u_t\]
Siguiendo la estrategia empírica del Banco Central del Paraguay (2019), el vector \(Y_t\) se estructura en dos bloques:
| Bloque | Variable | Descripción | Función |
|---|---|---|---|
| Externo | d_fed_funds |
Tasa de Fondos Federales (FRED), primera diferencia | Shock de la Fed |
| Externo | d_infl_us |
Inflación de EE. UU. (BLS), primera diferencia | Control de presiones externas |
| Doméstico | brecha_pib |
Brecha del PIB (IMAEP desestacionalizado, filtro HP) | Actividad económica |
| Doméstico | infl_py_lvl |
Inflación interanual de Paraguay (BCP) | Objetivo de estabilidad de precios |
| Doméstico | brecha_tcr |
Brecha del tipo de cambio real (filtro HP) | Canal cambiario |
| Doméstico | tpm_bcp_lvl |
Tasa de Política Monetaria (BCP) | Regla de Taylor |
Las restricciones de corto plazo impuestas en la matriz \(B_0\) son:
# --- Librerías necesarias ---
library(mFilter) # Filtro HP
library(vars) # Modelos VAR/SVAR
library(tseries) # Test ADF
library(urca) # Tests DF-GLS, KPSS, Zivot-Andrews
library(seasonal) # Desestacionalización X-13ARIMA-SEATS
library(ggplot2)
library(dplyr)
library(readxl)
library(car) # Test de Wald (linearHypothesis)# --- Cargar datos ---
# IMPORTANTE: esta ruta debe apuntar a la ubicación REAL de tu archivo.
# Opción más simple: guardá "bases de PM.xlsx" en la MISMA carpeta que
# este archivo .Rmd (ej. tu carpeta Downloads), y dejá solo el nombre
# del archivo, sin ruta completa, como está abajo.
# Si el archivo está en otra carpeta, reemplazá la ruta completa, ej.:
# "C:/Users/FATIMA OLAZAR/OneDrive/Documentos/Mestria en Finanzas/Modulo 5_finanzas/analisis de tipo de cambio fed/bases de PM.xlsx"
data <- read_excel("bases de PM.xlsx", sheet = "data")
str(data)## tibble [168 × 8] (S3: tbl_df/tbl/data.frame)
## $ fecha : POSIXct[1:168], format: "2012-01-01" "2012-02-01" ...
## $ fed_funds : num [1:168] 0.08 0.1 0.13 0.14 0.16 0.16 0.16 0.13 0.14 0.16 ...
## $ cpi_us_nivel : num [1:168] 228 228 229 229 229 ...
## $ imaep_sin_agri_bin: num [1:168] 74.6 77.4 85.6 80.5 83.9 ...
## $ infl_py : num [1:168] 4.45 4.46 3.25 3.34 3.75 ...
## $ ipc_py_nivel : num [1:168] 80.3 81.5 81.9 81.7 82 ...
## $ tc_pyg_usd : num [1:168] 4597 4455 4284 4305 4369 ...
## $ tpm_bcp : num [1:168] 6.5 6.5 6.5 6.5 6.25 6.25 6 5.5 5.5 5.5 ...
## fecha fed_funds cpi_us_nivel
## Min. :2012-01-01 00:00:00.00 Min. :0.050 Min. :227.8
## 1st Qu.:2015-06-23 12:00:00.00 1st Qu.:0.100 1st Qu.:237.5
## Median :2018-12-16 12:00:00.00 Median :0.475 Median :252.8
## Mean :2018-12-16 05:42:51.43 Mean :1.598 Mean :263.7
## 3rd Qu.:2022-06-08 12:00:00.00 3rd Qu.:2.402 3rd Qu.:294.9
## Max. :2025-12-01 00:00:00.00 Max. :5.330 Max. :326.0
## imaep_sin_agri_bin infl_py ipc_py_nivel tc_pyg_usd
## Min. : 74.59 Min. : 0.4771 Min. : 80.27 Min. :4002
## 1st Qu.:100.79 1st Qu.: 2.9084 1st Qu.: 91.04 1st Qu.:5148
## Median :114.53 Median : 3.7650 Median :103.35 Median :5997
## Mean :114.63 Mean : 4.1311 Mean :106.00 Mean :6041
## 3rd Qu.:126.26 3rd Qu.: 4.4467 3rd Qu.:122.92 3rd Qu.:6977
## Max. :167.41 Max. :11.8349 Max. :139.30 Max. :8006
## tpm_bcp
## Min. :0.750
## 1st Qu.:5.250
## Median :5.750
## Mean :5.429
## 3rd Qu.:6.250
## Max. :8.500
Las seis series originales cubren el período enero 2012 –
diciembre 2025 con frecuencia mensual: tasa de fondos federales
(fed_funds), IPC de EE. UU. (cpi_us_nivel),
actividad económica de Paraguay sin agricultura/binacionales
(imaep_sin_agri_bin), inflación interanual de Paraguay
(infl_py), IPC de Paraguay (ipc_py_nivel),
tipo de cambio nominal guaraní/dólar (tc_pyg_usd) y la TPM
(tpm_bcp).
# --- 1. Desestacionalizar el IMAEP ---
imaep_ts <- ts(data$imaep_sin_agri_bin, start = c(2012, 1), frequency = 12)
imaep_sa <- seas(imaep_ts)
data$imaep_sa <- as.numeric(final(imaep_sa))
# --- 2. Brecha del PIB (filtro HP, lambda=129600 para datos mensuales) ---
imaep_log <- log(data$imaep_sa)
hp_imaep <- hpfilter(imaep_log, freq = 129600, type = "lambda")
data$brecha_pib <- hp_imaep$cycle * 100
# --- 3. Inflación de EE. UU. interanual (bloque exógeno) ---
data$infl_us_rate <- c(rep(NA, 12), diff(log(data$cpi_us_nivel), lag = 12) * 100)
# --- 4. Inflación de Paraguay (bloque doméstico) ---
data$infl_py_lvl <- data$infl_py
# --- 5. Tipo de Cambio Real y su brecha ---
data$tcr <- data$tc_pyg_usd * (data$cpi_us_nivel / data$ipc_py_nivel)
tcr_log <- log(data$tcr)
hp_tcr <- hpfilter(tcr_log, freq = 129600, type = "lambda")
data$brecha_tcr <- hp_tcr$cycle * 100
# --- 6. Tasas de interés: se mantienen en nivel ---
data$fed_funds_lvl <- data$fed_funds
data$tpm_bcp_lvl <- data$tpm_bcp
# --- Dataset consolidado ---
df_final <- na.omit(data[, c("fecha", "fed_funds_lvl", "infl_us_rate",
"brecha_pib", "infl_py_lvl", "brecha_tcr",
"tpm_bcp_lvl")])
head(df_final)## # A tibble: 6 × 7
## fecha fed_funds_lvl infl_us_rate brecha_pib infl_py_lvl
## <dttm> <dbl> <dbl> <dbl> <dbl>
## 1 2013-01-01 00:00:00 0.14 1.67 0.734 4.10
## 2 2013-02-01 00:00:00 0.15 2.00 2.25 1.74
## 3 2013-03-01 00:00:00 0.14 1.51 1.58 1.18
## 4 2013-04-01 00:00:00 0.15 1.13 1.52 1.58
## 5 2013-05-01 00:00:00 0.11 1.38 2.79 0.865
## 6 2013-06-01 00:00:00 0.09 1.70 0.417 1.74
## # ℹ 2 more variables: brecha_tcr <dbl>, tpm_bcp_lvl <dbl>
Nota metodológica: la brecha del TCR muestra una caída pronunciada al final de la muestra (2025), coincidente con el problema de punto final (“endpoint problem”) del filtro Hodrick-Prescott (Hamilton, 2018). Esto se investiga más adelante en la sección de robustez muestral.
Antes de estimar el VAR, se evalúa la estacionariedad de las seis series mediante tres pruebas con hipótesis nulas complementarias: ADF y DF-GLS (H0: raíz unitaria) y KPSS (H0: estacionariedad). La triangulación entre pruebas con hipótesis opuestas da mayor solidez a la conclusión.
variables <- c("fed_funds_lvl", "infl_us_rate", "brecha_pib",
"infl_py_lvl", "brecha_tcr", "tpm_bcp_lvl")
# --- ADF ---
resultados_adf <- data.frame(Variable = character(), P_Value = numeric(),
Estacionaria = character())
for (v in variables) {
test <- adf.test(df_final[[v]], alternative = "stationary")
resultados_adf <- rbind(resultados_adf, data.frame(
Variable = v, P_Value = round(test$p.value, 4),
Estacionaria = ifelse(test$p.value < 0.05, "SÍ", "NO")))
}
# --- DF-GLS ---
verificar_dfgls <- function(serie, nombre) {
test_gls <- ur.ers(serie, type = "DF-GLS", model = "constant", lag.max = 4)
estadistico <- test_gls@teststat[1]
critico_5pct <- test_gls@cval[1, 2]
data.frame(Variable = nombre, Estadistico_DFGLS = round(estadistico, 4),
Critico_5pct = round(critico_5pct, 4),
Conclusion = ifelse(estadistico < critico_5pct, "ESTACIONARIA (I(0))", "NO ESTACIONARIA"))
}
resultados_dfgls <- do.call(rbind, lapply(variables, function(v) verificar_dfgls(df_final[[v]], v)))
# --- KPSS ---
verificar_kpss <- function(serie, nombre) {
test_kpss <- ur.kpss(serie, type = "mu", lags = "short")
estadistico <- test_kpss@teststat
critico_5pct <- test_kpss@cval[1, "5pct"]
data.frame(Variable = nombre, Estadistico_KPSS = round(estadistico, 4),
Critico_5pct_KPSS = round(critico_5pct, 4),
Conclusion_KPSS = ifelse(estadistico > critico_5pct, "NO ESTACIONARIA", "ESTACIONARIA (I(0))"))
}
resultados_kpss <- do.call(rbind, lapply(variables, function(v) verificar_kpss(df_final[[v]], v)))
tabla_triangulacion <- merge(merge(resultados_adf, resultados_dfgls, by = "Variable"),
resultados_kpss, by = "Variable")
knitr::kable(tabla_triangulacion, caption = "Triangulación de pruebas de raíz unitaria")| Variable | P_Value | Estacionaria | Estadistico_DFGLS | Critico_5pct | Conclusion | Estadistico_KPSS | Critico_5pct_KPSS | Conclusion_KPSS |
|---|---|---|---|---|---|---|---|---|
| brecha_pib | 0.0211 | SÍ | -3.8282 | -1.94 | ESTACIONARIA (I(0)) | 0.2142 | 0.463 | ESTACIONARIA (I(0)) |
| brecha_tcr | 0.3480 | NO | -2.1169 | -1.94 | ESTACIONARIA (I(0)) | 0.1612 | 0.463 | ESTACIONARIA (I(0)) |
| fed_funds_lvl | 0.1290 | NO | -1.3714 | -1.94 | NO ESTACIONARIA | 1.9313 | 0.463 | NO ESTACIONARIA |
| infl_py_lvl | 0.2642 | NO | -2.5403 | -1.94 | ESTACIONARIA (I(0)) | 0.3710 | 0.463 | ESTACIONARIA (I(0)) |
| infl_us_rate | 0.4235 | NO | -1.6822 | -1.94 | NO ESTACIONARIA | 1.2704 | 0.463 | NO ESTACIONARIA |
| tpm_bcp_lvl | 0.3800 | NO | -2.1541 | -1.94 | ESTACIONARIA (I(0)) | 0.3359 | 0.463 | ESTACIONARIA (I(0)) |
Las tres pruebas coinciden: brecha_pib,
infl_py_lvl, brecha_tcr y
tpm_bcp_lvl son estacionarias en nivel/brecha.
fed_funds_lvl e infl_us_rate presentan raíz
unitaria.
za_fed <- ur.za(df_final$fed_funds_lvl, model = "both", lag = 4)
za_infl_us <- ur.za(df_final$infl_us_rate, model = "both", lag = 4)
cat("Fed Funds -- estadístico:", round(za_fed@teststat, 3),
"| crítico 5%:", za_fed@cval[2], "\n")## Fed Funds -- estadístico: -3.609 | crítico 5%: -5.08
cat("Inflación EE.UU. -- estadístico:", round(za_infl_us@teststat, 3),
"| crítico 5%:", za_infl_us@cval[2], "\n")## Inflación EE.UU. -- estadístico: -4.936 | crítico 5%: -5.08
Ambas variables mantienen raíz unitaria incluso permitiendo un quiebre estructural (Perron, 1989), por lo que se incorporan al bloque exógeno en primeras diferencias.
df_final$d_fed_funds <- c(NA, diff(df_final$fed_funds_lvl))
df_final$d_infl_us <- c(NA, diff(df_final$infl_us_rate))
df_final_svar <- na.omit(df_final)
nrow(df_final_svar)## [1] 155
sistema_var <- df_final_svar[, c("d_fed_funds", "d_infl_us",
"brecha_pib", "infl_py_lvl",
"brecha_tcr", "tpm_bcp_lvl")]
seleccion_rezagos <- VARselect(sistema_var, lag.max = 12, type = "const")
seleccion_rezagos$selection## AIC(n) HQ(n) SC(n) FPE(n)
## 2 2 1 2
AIC, HQ y FPE seleccionan \(p=2\); SC selecciona \(p=1\) (más conservador en muestras finitas, Lütkepohl, 2005). Sin embargo, el diagnóstico de autocorrelación residual (más abajo) obliga a ampliar la especificación.
# Estandarización para estabilidad numérica del SVAR posterior
sistema_var_std <- as.data.frame(scale(sistema_var))
p_optimo <- 4 # ver justificación en el diagnóstico de residuos, abajo
var_irrestricto <- VAR(sistema_var_std, p = p_optimo, type = "const")
cat("Raíz máxima del polinomio característico:", round(max(roots(var_irrestricto)), 4), "\n")
cat("¿VAR estable?", all(roots(var_irrestricto) < 1), "\n")## Raíz máxima del polinomio característico: 0.9722
## ¿VAR estable? TRUE
serial_test <- serial.test(var_irrestricto, lags.pt = 16, type = "PT.asymptotic")
arch_test <- arch.test(var_irrestricto, lags.multi = 5, multivariate.only = TRUE)
normalidad_test <- normality.test(var_irrestricto, multivariate.only = TRUE)
cat("Autocorrelación (Portmanteau): p =", round(serial_test$serial$p.value, 4), "\n")## Autocorrelación (Portmanteau): p = 0.1417
## Heterocedasticidad (ARCH): p = 0.2756
## Normalidad (Jarque-Bera): p = < 2.22e-16
Con \(p=2\) los residuos muestran autocorrelación significativa; esta desaparece recién con \(p=4\) (Portmanteau, \(p>0.10\)), motivo por el cual se adopta este rezago pese a que los criterios de información favorecían una especificación más parsimoniosa. La heterocedasticidad no resulta significativa; la normalidad se rechaza —esperable en series financieras y cambiarias con colas pesadas—, lo que motiva el uso de bootstrap para las bandas de confianza de las funciones de impulso-respuesta más adelante.
lm_fed <- var_irrestricto$varresult$d_fed_funds
lm_infl_us <- var_irrestricto$varresult$d_infl_us
restricciones_dom <- c("brecha_pib.l1 = 0", "infl_py_lvl.l1 = 0",
"brecha_tcr.l1 = 0", "tpm_bcp_lvl.l1 = 0",
"brecha_pib.l2 = 0", "infl_py_lvl.l2 = 0",
"brecha_tcr.l2 = 0", "tpm_bcp_lvl.l2 = 0")
wald_fed <- linearHypothesis(lm_fed, restricciones_dom[1:8])
wald_infl <- linearHypothesis(lm_infl_us, restricciones_dom[1:8])
wald_fed##
## Linear hypothesis test:
## brecha_pib.l1 = 0
## infl_py_lvl.l1 = 0
## brecha_tcr.l1 = 0
## tpm_bcp_lvl.l1 = 0
## brecha_pib.l2 = 0
## infl_py_lvl.l2 = 0
## brecha_tcr.l2 = 0
## tpm_bcp_lvl.l2 = 0
##
## Model 1: restricted model
## Model 2: y ~ -1 + (d_fed_funds.l1 + d_infl_us.l1 + brecha_pib.l1 + infl_py_lvl.l1 +
## brecha_tcr.l1 + tpm_bcp_lvl.l1 + d_fed_funds.l2 + d_infl_us.l2 +
## brecha_pib.l2 + infl_py_lvl.l2 + brecha_tcr.l2 + tpm_bcp_lvl.l2 +
## d_fed_funds.l3 + d_infl_us.l3 + brecha_pib.l3 + infl_py_lvl.l3 +
## brecha_tcr.l3 + tpm_bcp_lvl.l3 + d_fed_funds.l4 + d_infl_us.l4 +
## brecha_pib.l4 + infl_py_lvl.l4 + brecha_tcr.l4 + tpm_bcp_lvl.l4 +
## const)
##
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 134 69.250
## 2 126 61.627 8 7.6228 1.9482 0.0584 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Linear hypothesis test:
## brecha_pib.l1 = 0
## infl_py_lvl.l1 = 0
## brecha_tcr.l1 = 0
## tpm_bcp_lvl.l1 = 0
## brecha_pib.l2 = 0
## infl_py_lvl.l2 = 0
## brecha_tcr.l2 = 0
## tpm_bcp_lvl.l2 = 0
##
## Model 1: restricted model
## Model 2: y ~ -1 + (d_fed_funds.l1 + d_infl_us.l1 + brecha_pib.l1 + infl_py_lvl.l1 +
## brecha_tcr.l1 + tpm_bcp_lvl.l1 + d_fed_funds.l2 + d_infl_us.l2 +
## brecha_pib.l2 + infl_py_lvl.l2 + brecha_tcr.l2 + tpm_bcp_lvl.l2 +
## d_fed_funds.l3 + d_infl_us.l3 + brecha_pib.l3 + infl_py_lvl.l3 +
## brecha_tcr.l3 + tpm_bcp_lvl.l3 + d_fed_funds.l4 + d_infl_us.l4 +
## brecha_pib.l4 + infl_py_lvl.l4 + brecha_tcr.l4 + tpm_bcp_lvl.l4 +
## const)
##
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 134 95.369
## 2 126 90.382 8 4.9873 0.8691 0.5445
El test de Wald conjunto rechaza la hipótesis de no retroalimentación del bloque doméstico hacia el externo. Este resultado se mantiene incluso controlando por la volatilidad extraordinaria del período de pandemia mediante una variable dummy (Lenza & Primiceri, 2022), lo que descarta que se trate de un artefacto de ese episodio puntual. Es consistente con la literatura del ciclo financiero global (Rey, 2015), que documenta comovimientos entre economías avanzadas y emergentes sin causalidad genuina en sentido inverso. Siguiendo la práctica estándar en modelos SVAR para economías pequeñas y abiertas (Cushman & Zha, 1997; Zha, 1999), la exogeneidad en bloque se mantiene como restricción teórica de identificación.
amat <- diag(6)
amat[amat == 0] <- NA
colnames(amat) <- rownames(amat) <- colnames(sistema_var)
# Bloque externo: sin retroalimentación doméstica
amat[1, 2:6] <- 0
amat[2, 3:6] <- 0
# Bloque doméstico: Taylor Rule + Canal Cambiario
amat[3, 4:6] <- 0 # Brecha PIB no responde a inflación/TCR/TPM
amat[4, 5:6] <- 0 # Inflación no responde a TCR/TPM
amat[5, 3] <- 0 # TCR (canal cambiario) no responde a brecha PIB
amat[5, 6] <- 0 # TCR no responde a TPM
amat[6, 5] <- 0 # TPM (Taylor) no responde a TCR
amat## d_fed_funds d_infl_us brecha_pib infl_py_lvl brecha_tcr tpm_bcp_lvl
## d_fed_funds 1 0 0 0 0 0
## d_infl_us NA 1 0 0 0 0
## brecha_pib NA NA 1 0 0 0
## infl_py_lvl NA NA NA 1 0 0
## brecha_tcr NA NA 0 NA 1 0
## tpm_bcp_lvl NA NA NA NA 0 1
Con 13 parámetros libres frente a los 15 requeridos para identificación exacta, el modelo queda sobre-identificado por 2 restricciones, lo que habilita un test LR de sobreidentificación.
var_irrestricto_std <- VAR(sistema_var_std, p = p_optimo, type = "const")
svar_modelo <- SVAR(var_irrestricto_std, Amat = amat, estmethod = "scoring", max.iter = 1000)
summary(svar_modelo)##
## SVAR Estimation Results:
## ========================
##
## Call:
## SVAR(x = var_irrestricto_std, estmethod = "scoring", Amat = amat,
## max.iter = 1000)
##
## Type: A-model
## Sample size: 151
## Log Likelihood: -1285.558
## Method: scoring
## Number of iterations: 153
##
## LR overidentification test:
##
## LR overidentification
##
## data: sistema_var_std
## Chi^2 = 1760, df = 8, p-value <2e-16
##
##
## Estimated A matrix:
## d_fed_funds d_infl_us brecha_pib infl_py_lvl brecha_tcr tpm_bcp_lvl
## d_fed_funds 1.00000 0.000000 0.00000 0.00000 0 0
## d_infl_us -0.28632 1.000000 0.00000 0.00000 0 0
## brecha_pib -0.23260 -0.155892 1.00000 0.00000 0 0
## infl_py_lvl -0.03456 -0.026302 0.04833 1.00000 0 0
## brecha_tcr 0.03295 -0.039110 0.00000 0.26560 1 0
## tpm_bcp_lvl -0.04991 -0.005409 -0.04765 -0.05174 0 1
##
## Estimated standard errors for A matrix:
## d_fed_funds d_infl_us brecha_pib infl_py_lvl brecha_tcr tpm_bcp_lvl
## d_fed_funds 0.00000 0.00000 0.00000 0.00000 0 0
## d_infl_us 0.08138 0.00000 0.00000 0.00000 0 0
## brecha_pib 0.08465 0.08138 0.00000 0.00000 0 0
## infl_py_lvl 0.08674 0.08236 0.08138 0.00000 0 0
## brecha_tcr 0.08467 0.08139 0.00000 0.08128 0 0
## tpm_bcp_lvl 0.08679 0.08239 0.08147 0.08138 0 0
##
## Estimated B matrix:
## d_fed_funds d_infl_us brecha_pib infl_py_lvl brecha_tcr tpm_bcp_lvl
## d_fed_funds 1 0 0 0 0 0
## d_infl_us 0 1 0 0 0 0
## brecha_pib 0 0 1 0 0 0
## infl_py_lvl 0 0 0 1 0 0
## brecha_tcr 0 0 0 0 1 0
## tpm_bcp_lvl 0 0 0 0 0 1
##
## Covariance matrix of reduced form residuals (*100):
## d_fed_funds d_infl_us brecha_pib infl_py_lvl brecha_tcr tpm_bcp_lvl
## d_fed_funds 100.000 28.632 27.724 2.870 -2.937 6.615
## d_infl_us 28.632 108.198 23.527 2.698 2.572 3.275
## brecha_pib 27.724 23.527 110.116 -3.745 1.001 6.564
## infl_py_lvl 2.870 2.698 -3.745 100.351 -26.642 5.172
## brecha_tcr -2.937 2.572 1.001 -26.642 107.273 -1.463
## tpm_bcp_lvl 6.615 3.275 6.564 5.172 -1.463 100.928
El test LR rechaza la hipótesis conjunta de restricciones. Este resultado es coherente con la evidencia de retroalimentación estadística documentada arriba, y —siguiendo la práctica del propio BCP (2019), que no reporta este test para su especificación— las restricciones se mantienen por su fundamento teórico (Taylor + canal cambiario) antes que por su ajuste estadístico exacto.
Durante 2025 el dólar estadounidense registró una depreciación generalizada de aproximadamente 15% (ABC Color, 2026), atribuida principalmente a la política arancelaria y comercial de la administración estadounidense y a flujos de inversión extranjera directa, más que a movimientos en la tasa de la Fed (Barría, 2025). Dado que este mecanismo excede el canal de tasas de interés identificado en este modelo, se adopta como especificación principal la muestra que excluye dicho año.
df_principal <- df_final_svar[df_final_svar$fecha <= as.POSIXct("2024-12-01", tz = "UTC"), ]
cat("Observaciones en la muestra principal:", nrow(df_principal), "\n")## Observaciones en la muestra principal: 143
sistema_var_principal <- scale(df_principal[, c("d_fed_funds", "d_infl_us",
"brecha_pib", "infl_py_lvl",
"brecha_tcr", "tpm_bcp_lvl")])
var_principal <- VAR(sistema_var_principal, p = p_optimo, type = "const")
cat("¿Estable?", all(roots(var_principal) < 1), "\n")## ¿Estable? TRUE
Este es el modelo utilizado en las secciones de resultados siguientes.
irf_principal <- irf(svar_principal,
impulse = "d_fed_funds",
response = c("d_fed_funds", "brecha_pib", "infl_py_lvl",
"brecha_tcr", "tpm_bcp_lvl"),
n.ahead = 24, ortho = TRUE, cumulative = TRUE,
boot = TRUE, runs = 500, ci = 0.95)
par(cex.lab = 1.3, cex.axis = 1.0, font.lab = 2)
plot(irf_principal, mar = c(3, 6, 2, 1))Lectura de resultados: ante un shock permanente en la tasa de la Fed, la brecha del TCR muestra una apreciación real acumulada, significativa hasta aproximadamente el mes 8-10. Este resultado, en apariencia contrario al canal cambiario tradicional, se explica por la respuesta endógena de la TPM: siguiendo la Regla de Taylor, el BCP eleva su tasa ante el shock externo, generando apreciación cambiaria (BCP, 2019).
fevd_principal <- fevd(svar_principal, n.ahead = 24)
fevd_tcr <- fevd_principal$brecha_tcr
horizontes_clave <- c(1, 6, 12, 24)
tabla_fevd <- round(fevd_tcr[horizontes_clave, ] * 100, 2)
rownames(tabla_fevd) <- horizontes_clave
knitr::kable(tabla_fevd, caption = "Descomposición de varianza de la brecha del TCR (%)")| d_fed_funds | d_infl_us | brecha_pib | infl_py_lvl | brecha_tcr | tpm_bcp_lvl | |
|---|---|---|---|---|---|---|
| 1 | 0.27 | 0.14 | 0.02 | 8.84 | 90.73 | 0.00 |
| 6 | 2.09 | 0.29 | 1.05 | 19.65 | 68.63 | 8.29 |
| 12 | 2.36 | 0.27 | 1.28 | 20.83 | 52.47 | 22.80 |
| 24 | 2.32 | 0.26 | 1.33 | 20.52 | 50.88 | 24.68 |
En el largo plazo (mes 24), el shock directo de la Fed explica apenas 2,3% de la variabilidad del TCR, mientras que la TPM explica 24,7% —más de diez veces más— y la inflación local 20,5%. Esto confirma que la transmisión de los shocks externos hacia el tipo de cambio real opera de forma predominantemente indirecta, a través de la reacción de política monetaria doméstica, más que por un canal cambiario directo de paridad de tasas de interés.
Los resultados de este trabajo muestran que, en Paraguay, la transmisión de los shocks de la Reserva Federal hacia el tipo de cambio real está mediada principalmente por la reacción de política monetaria doméstica —modelada mediante una función de reacción de tipo Taylor—, más que por un canal cambiario directo de paridad de tasas de interés. Este hallazgo matiza la interpretación estándar de este mecanismo en economías pequeñas y abiertas, sin contradecir el marco teórico del ciclo financiero global (Rey, 2015): revela más bien cómo ambos mecanismos interactúan, con la Regla de Taylor dominando la transmisión neta observada.
Limitaciones y líneas futuras:
Este documento fue generado en R Markdown. El código completo se encuentra disponible mostrando los bloques ocultos (“Show” en cada sección).