Panorama general del estudio

Este informe estudia la evolución trimestral de la cuenta corriente y la cuenta financiera de la balanza de pagos de Colombia, a partir de los archivos suministrados del Banco de la República. Se presentan estadísticas descriptivas, visualizaciones y preguntas de investigación relacionadas con el comercio internacional y la integración económica.

Los datos permiten describir tendencias y asociaciones, pero por sí solos no demuestran que un tratado comercial haya causado un cambio en las cuentas externas.

Guía visual de lectura. El azul petróleo identifica la estructura principal del informe; el azul medio se utiliza para las series y tendencias; el verde señala valores positivos y el terracota valores negativos cuando la gráfica distingue signos. Los colores ayudan a leer los datos, pero no sustituyen la interpretación de la convención contable de cada serie.

1. Diseño metodológico, entorno de trabajo e importación

El archivo de cuenta corriente se lee exclusivamente desde la hoja Transpuesto. El archivo de cuenta financiera se lee desde la hoja Cuenta financiera.

paquetes <- c("readxl", "dplyr", "tidyr", "ggplot2", "stringr",
              "lubridate", "scales", "knitr", "kableExtra", "zoo")

instalar <- paquetes[!paquetes %in% rownames(installed.packages())]
if (length(instalar) > 0) install.packages(instalar, repos = "https://cloud.r-project.org")
invisible(lapply(paquetes, library, character.only = TRUE))

1.1 Ubicación de los archivos

Importante: para evitar que el proceso se interrumpa durante Knit, guarda los dos Excel en la misma carpeta que este archivo .Rmd. El código buscará los archivos automáticamente y verificará que contengan las hojas necesarias. Así no dependerás de una ventana de selección que pueda cancelarse.

Si tus archivos tienen otros nombres, modifica las dos rutas en el bloque de código, en las líneas indicadas.

# ------------------------------------------------------------
# UBICACIÓN DE LOS ARCHIVOS EXCEL
# Guarda ambos Excel en la misma carpeta que este archivo Rmd.
# Si tienen nombres distintos, actualiza los nombres abajo.
# ------------------------------------------------------------

# Detecta la carpeta del Rmd; si no está disponible, usa getwd().
archivo_rmd <- tryCatch(knitr::current_input(), error = function(e) "")
if (length(archivo_rmd) == 0 || is.na(archivo_rmd) || !nzchar(archivo_rmd)) {
  carpeta_trabajo <- getwd()
} else {
  carpeta_trabajo <- dirname(normalizePath(archivo_rmd, mustWork = FALSE))
  if (!dir.exists(carpeta_trabajo)) carpeta_trabajo <- getwd()
}

# Nombres de archivo esperados. Puedes cambiarlos si tus Excel se llaman distinto.
ruta_corriente <- file.path(
  carpeta_trabajo,
  "SERIES_DESCENTRALIZADAS_CORRIENTE_BP transpuesta.xlsx"
)
ruta_financiera <- file.path(
  carpeta_trabajo,
  "CUENTA_FINANCIERA_TRANSPUESTA (1).xlsx"
)

# Si no se encuentran por nombre exacto, intenta reconocerlos por parte del nombre.
excels_disponibles <- list.files(
  carpeta_trabajo, pattern = "\\.xlsx?$",
  full.names = TRUE, ignore.case = TRUE
)

if (!file.exists(ruta_corriente)) {
  posibles <- excels_disponibles[
    grepl("DESCENTRALIZADAS.*CORRIENTE|CORRIENTE.*TRANSPUESTA",
          basename(excels_disponibles), ignore.case = TRUE)
  ]
  if (length(posibles) == 1) ruta_corriente <- posibles[1]
}

if (!file.exists(ruta_financiera)) {
  posibles <- excels_disponibles[
    grepl("CUENTA.*FINANCIERA|FINANCIERA.*TRANSPUESTA",
          basename(excels_disponibles), ignore.case = TRUE)
  ]
  if (length(posibles) == 1) ruta_financiera <- posibles[1]
}

# Detiene el proceso con instrucciones claras si falta alguno de los archivos.
faltantes <- c(
  if (!file.exists(ruta_corriente)) "Cuenta corriente (archivo que contiene la hoja 'Transpuesto')",
  if (!file.exists(ruta_financiera)) "Cuenta financiera (archivo que contiene la hoja 'Cuenta financiera')"
)

if (length(faltantes) > 0) {
  archivos_encontrados <- if (length(excels_disponibles) > 0) {
    paste(basename(excels_disponibles), collapse = "\n- ")
  } else {
    "No se encontraron archivos Excel en la carpeta del Rmd."
  }

  stop(
    paste0(
      "\nNO SE PUDIERON LOCALIZAR LOS ARCHIVOS NECESARIOS.\n\n",
      "Carpeta revisada: ", carpeta_trabajo, "\n\n",
      "Falta localizar:\n- ", paste(faltantes, collapse = "\n- "), "\n\n",
      "Archivos Excel encontrados:\n- ", archivos_encontrados, "\n\n",
      "Solución: copia ambos Excel a la misma carpeta que el archivo Rmd ",
      "o modifica las variables ruta_corriente y ruta_financiera en este bloque."
    ),
    call. = FALSE
  )
}

# Comprueba que cada Excel tenga la hoja requerida.
validar_hoja <- function(ruta, hoja_requerida) {
  hojas <- tryCatch(
    readxl::excel_sheets(ruta),
    error = function(e) {
      stop(
        "No se pudo leer el archivo Excel: ", basename(ruta),
        "\nDetalle: ", conditionMessage(e),
        call. = FALSE
      )
    }
  )

  coincidencia <- which(tolower(trimws(hojas)) == tolower(trimws(hoja_requerida)))

  if (length(coincidencia) == 0) {
    stop(
      "\nEl archivo '", basename(ruta), "' no contiene la hoja '",
      hoja_requerida, "'.\nHojas disponibles: ",
      paste(hojas, collapse = ", "),
      "\nRevisa que hayas asignado el Excel correcto a la variable de ruta.",
      call. = FALSE
    )
  }

  hojas[coincidencia[1]]
}

hoja_corriente <- validar_hoja(ruta_corriente, "Transpuesto")
hoja_financiera <- validar_hoja(ruta_financiera, "Cuenta financiera")

cat("ARCHIVOS IMPORTADOS\n")
## ARCHIVOS IMPORTADOS
cat("Cuenta corriente: ", basename(ruta_corriente), "\n", sep = "")
## Cuenta corriente: SERIES_DESCENTRALIZADAS_CORRIENTE_BP transpuesta.xlsx
cat("Hoja utilizada: ", hoja_corriente, "\n\n", sep = "")
## Hoja utilizada: Transpuesto
cat("Cuenta financiera: ", basename(ruta_financiera), "\n", sep = "")
## Cuenta financiera: CUENTA_FINANCIERA_TRANSPUESTA (1).xlsx
cat("Hoja utilizada: ", hoja_financiera, "\n\n", sep = "")
## Hoja utilizada: Cuenta financiera
# Cuenta corriente: exclusivamente la hoja Transpuesto.
# Las primeras dos filas son informativas; la tercera contiene encabezados.
corriente_raw <- readxl::read_excel(
  ruta_corriente, sheet = hoja_corriente, skip = 2
)

# Cuenta financiera: hoja Cuenta financiera.
# Las primeras tres filas son informativas; la cuarta contiene encabezados.
financiera_raw <- readxl::read_excel(
  ruta_financiera, sheet = hoja_financiera, skip = 3
)

cat("Dimensiones de cuenta corriente: ", nrow(corriente_raw), " filas y ",
    ncol(corriente_raw), " columnas.\n", sep = "")
## Dimensiones de cuenta corriente: 122 filas y 15 columnas.
cat("Dimensiones de cuenta financiera: ", nrow(financiera_raw), " filas y ",
    ncol(financiera_raw), " columnas.\n", sep = "")
## Dimensiones de cuenta financiera: 106 filas y 9 columnas.
knitr::kable(head(corriente_raw), caption = "Vista preliminar: cuenta corriente") |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover", "responsive"))
Vista preliminar: cuenta corriente
Periodo CUENTA CORRIENTE Balanza de Bienes Bienes - Exportaciones Bienes - Importaciones Balanza de Servicios Servicios - Exportaciones Servicios - Importaciones BIENES Y SERVICIOS TOTAL Ingreso primario (Renta factorial) Ingreso primario - Ingresos Ingreso primario - Egresos Ingreso secundario (Transferencias corrientes) Ingreso secundario - Ingresos Ingreso secundario - Egresos
1 Trimestre 1996 -1091,968 -529,5917 2736,082 3265,674 -271,1385 557,1634 828,3019 -800,7302 -460,1371 178,7024 638,8395 168,8996 219,8175 50,91792
2 Trimestre 1996 -1074,374 -469,1056 2772,532 3241,638 -287,2955 549,8720 837,1675 -756,4011 -480,6524 176,6244 657,2768 162,6796 218,2638 55,58421
3 Trimestre 1996 -1281,627 -638,6366 2602,464 3241,101 -281,0271 546,8914 827,9186 -919,6637 -542,6128 169,5188 712,1316 180,6491 237,0597 56,41061
4 Trimestre 1996 -1220,585 -454,2315 2855,111 3309,342 -380,9770 539,0211 919,9981 -835,2085 -579,0244 191,0787 770,1031 193,6477 248,4735 54,82585
1 Trimestre 1997 -1167,053 -412,9906 2915,388 3328,379 -358,1589 551,3558 909,5147 -771,1495 -563,2813 213,9615 777,2428 167,3776 233,0089 65,63129
2 Trimestre 1997 -1363,219 -554,8373 3024,451 3579,288 -405,4530 524,6938 930,1468 -960,2903 -606,7018 227,2897 833,9915 203,7734 243,6732 39,89975
knitr::kable(head(financiera_raw), caption = "Vista preliminar: cuenta financiera") |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover", "responsive"))
Vista preliminar: cuenta financiera
Año Periodo Tipo de dato Cuenta financiera Inversión directa Inversión de cartera Derivados financieros (distintos de reservas) y opciones de compra de acciones por parte de empleados Otra inversión Activos de reserva
2000 Q1 Dato revisado 304,80917 -339,9479 -361,8045 24,92393 769,1910 212,44664
2000 Q2 Dato revisado 173,67307 -455,4221 351,0750 31,37812 145,4623 101,17974
2000 Q3 Dato revisado 359,82836 -766,8052 390,2365 32,67088 386,6618 317,06442
2000 Q4 Dato revisado 11,34624 -548,9382 -554,1977 32,98539 850,1636 231,33313
2001 Q1 Dato revisado -430,22418 -517,9177 -204,5215 32,33429 -63,0967 322,97745
2001 Q2 Dato revisado -409,25874 -978,7928 -1058,7273 33,44307 1527,5841 67,23417

1.2 Limpieza y fechas trimestrales

# Función para convertir a número columnas que pudieran haber sido importadas
# como texto. No modifica el signo de las observaciones.
a_numero <- function(x) {
  if (is.numeric(x)) return(as.numeric(x))
  x <- as.character(x)
  x <- stringr::str_replace_all(x, "\\s", "")
  # En estos archivos las cifras suelen venir como números de Excel.
  # Se contemplan separadores de miles/decimales si aparecen como texto.
  x <- stringr::str_replace_all(x, "\\$", "")
  suppressWarnings(as.numeric(x))
}

# Normalizar nombres de columnas para facilitar el uso en el código.
names(corriente_raw) <- trimws(names(corriente_raw))
names(financiera_raw) <- trimws(names(financiera_raw))

# Confirmar que las columnas de fecha existan.
if (!"Periodo" %in% names(corriente_raw)) {
  stop("No se encontró la columna 'Periodo' en la hoja Transpuesto.")
}
if (!all(c("Año", "Periodo") %in% names(financiera_raw))) {
  stop("No se encontraron las columnas 'Año' y 'Periodo' en Cuenta financiera.")
}

# La cuenta corriente presenta periodos como '1 Trimestre 1996'.
corriente <- corriente_raw |>
  dplyr::mutate(
    periodo_texto = as.character(.data$Periodo),
    anio = suppressWarnings(as.integer(stringr::str_extract(periodo_texto, "\\d{4}"))),
    trimestre = suppressWarnings(as.integer(stringr::str_extract(periodo_texto, "^[1-4]")))
  ) |>
  dplyr::filter(!is.na(anio), !is.na(trimestre)) |>
  dplyr::mutate(
    fecha = as.Date(zoo::as.yearqtr(paste0(anio, " Q", trimestre), format = "%Y Q%q"))
  ) |>
  dplyr::arrange(fecha)

# Cuenta financiera: Periodo tiene formato Q1, Q2, Q3 o Q4.
financiera <- financiera_raw |>
  dplyr::mutate(
    anio = suppressWarnings(as.integer(.data$Año)),
    trimestre = suppressWarnings(as.integer(stringr::str_extract(as.character(.data$Periodo), "[1-4]"))),
    fecha = as.Date(zoo::as.yearqtr(paste0(anio, " Q", trimestre), format = "%Y Q%q"))
  ) |>
  dplyr::filter(!is.na(anio), !is.na(trimestre)) |>
  dplyr::arrange(fecha)

# Convertir columnas económicas a numéricas, conservando fechas y categorías.
cols_num_corriente <- setdiff(names(corriente), c("Periodo", "periodo_texto", "anio",
                                                   "trimestre", "fecha"))
corriente <- corriente |>
  dplyr::mutate(dplyr::across(dplyr::all_of(cols_num_corriente), a_numero))

cols_num_fin <- setdiff(names(financiera), c("Año", "Periodo", "Tipo de dato",
                                              "anio", "trimestre", "fecha"))
financiera <- financiera |>
  dplyr::mutate(dplyr::across(dplyr::all_of(cols_num_fin), a_numero))

# Eliminar duplicados exactos, si los hubiera, y reportarlos antes de hacerlo.
duplicados_corriente <- sum(duplicated(corriente))
duplicados_financiera <- sum(duplicated(financiera))

cat("Filas duplicadas detectadas en cuenta corriente:", duplicados_corriente, "\n")
## Filas duplicadas detectadas en cuenta corriente: 0
cat("Filas duplicadas detectadas en cuenta financiera:", duplicados_financiera, "\n")
## Filas duplicadas detectadas en cuenta financiera: 0
corriente <- dplyr::distinct(corriente)
financiera <- dplyr::distinct(financiera)

# Tabla resumen de cobertura temporal y valores faltantes.
resumen_base <- tibble::tibble(
  Base = c("Cuenta corriente: hoja Transpuesto", "Cuenta financiera"),
  Observaciones = c(nrow(corriente), nrow(financiera)),
  Variables = c(ncol(corriente), ncol(financiera)),
  Periodo_inicial = c(min(corriente$fecha, na.rm = TRUE), min(financiera$fecha, na.rm = TRUE)),
  Periodo_final = c(max(corriente$fecha, na.rm = TRUE), max(financiera$fecha, na.rm = TRUE)),
  Valores_faltantes = c(sum(is.na(corriente)), sum(is.na(financiera)))
)

knitr::kable(resumen_base, caption = "Descripción general de las bases") |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover", "responsive"))
Descripción general de las bases
Base Observaciones Variables Periodo_inicial Periodo_final Valores_faltantes
Cuenta corriente: hoja Transpuesto 122 19 1996-01-01 2026-04-01 0
Cuenta financiera 106 12 2000-01-01 2026-04-01 0

2. Fuentes, cobertura y criterios metodológicos

Las bases de trabajo fueron suministradas en archivos Excel atribuidos al Banco de la República de Colombia. La frecuencia es trimestral y las cifras se interpretan en millones de dólares estadounidenses, de acuerdo con la descripción de los archivos. La cuenta corriente corresponde a una serie desestacionalizada; la cuenta financiera conserva la clasificación de tipo de dato que aparece en el archivo original.

La limpieza consistió en identificar los encabezados, extraer año y trimestre, ordenar cronológicamente las observaciones, convertir variables económicas a formato numérico y revisar duplicados y datos faltantes. No se sustituyen observaciones faltantes por valores inventados.

Fuentes para consulta: Banco de la República. Verifica en la publicación original la convención de signos y la definición metodológica de cada serie antes de realizar interpretaciones contables definitivas.

3. Identidad visual y herramientas de análisis

# Paleta institucional uniforme: azul petróleo, azul medio, verde y terracota.
azul <- "#17324D"
azul_claro <- "#2878A5"
verde <- "#3F7D68"
rojo <- "#B85C54"
dorado <- "#C39A4A"
gris <- "#657586"

tema_academico <- ggplot2::theme_minimal(base_size = 12, base_family = "sans") +
  ggplot2::theme(
    plot.title = element_text(face = "bold", size = 17, colour = azul,
                              margin = margin(b = 8), lineheight = 1.12),
    plot.subtitle = element_text(size = 11.5, colour = gris,
                                 margin = margin(b = 14), lineheight = 1.25),
    plot.caption = element_text(size = 9, colour = gris, hjust = 0,
                                margin = margin(t = 12)),
    axis.title = element_text(face = "bold", colour = azul, size = 10.5),
    axis.text = element_text(colour = "#405667", size = 9.5),
    axis.ticks = element_line(colour = "#CBD7DF", linewidth = 0.3),
    legend.title = element_text(face = "bold", colour = azul, size = 10.5),
    legend.text = element_text(size = 9.5, colour = "#405667"),
    legend.position = "bottom",
    legend.box = "vertical",
    panel.grid.minor = element_blank(),
    panel.grid.major.x = element_blank(),
    panel.grid.major.y = element_line(colour = "#E3EBF0", linewidth = 0.4),
    strip.background = element_rect(fill = "#EAF2F6", colour = NA),
    strip.text = element_text(face = "bold", colour = azul, size = 10.5,
                              margin = margin(8, 6, 8, 6)),
    plot.background = element_rect(fill = "#FFFFFF", colour = NA),
    panel.background = element_rect(fill = "#FFFFFF", colour = NA),
    plot.margin = margin(18, 20, 18, 16)
  )

formato_millones <- scales::label_number(big.mark = ".", decimal.mark = ",", accuracy = 1)

grafico_linea <- function(datos, variable, titulo, subtitulo = NULL) {
  if (!variable %in% names(datos)) {
    message("No se genera el gráfico: no existe la variable ", variable)
    return(NULL)
  }
  ggplot(datos, aes(x = fecha, y = .data[[variable]])) +
    geom_hline(yintercept = 0, linetype = "dashed", colour = gris, linewidth = 0.5) +
    geom_line(colour = azul_claro, linewidth = 1.05, na.rm = TRUE) +
    labs(title = titulo, subtitle = subtitulo,
         x = "Trimestre", y = "Millones de USD",
         caption = "Fuente: Banco de la República de Colombia; archivos suministrados.") +
    scale_y_continuous(labels = formato_millones) +
    scale_x_date(date_breaks = "4 years", date_labels = "%Y") +
    tema_academico
}

estadisticas <- function(datos, variables) {
  variables <- intersect(variables, names(datos))
  if (length(variables) == 0) return(data.frame())
  datos |>
    dplyr::select(dplyr::all_of(variables)) |>
    tidyr::pivot_longer(cols = dplyr::everything(), names_to = "Variable", values_to = "Valor") |>
    dplyr::group_by(Variable) |>
    dplyr::summarise(
      N = sum(!is.na(Valor)),
      Media = mean(Valor, na.rm = TRUE),
      Mediana = median(Valor, na.rm = TRUE),
      Desviacion_estandar = sd(Valor, na.rm = TRUE),
      Minimo = ifelse(all(is.na(Valor)), NA_real_, min(Valor, na.rm = TRUE)),
      Maximo = ifelse(all(is.na(Valor)), NA_real_, max(Valor, na.rm = TRUE)),
      .groups = "drop"
    )
}

# Produce una interpretación automática basada en las observaciones reales.
# Resume niveles, extremos, signo y dispersión sin afirmar causalidad.
interpretar_serie <- function(datos, variable, nombre = variable) {
  if (!variable %in% names(datos)) {
    cat("**No se generó la lectura cuantitativa:** no se encontró la variable ", nombre, ".\\n\\n", sep = "")
    return(invisible(NULL))
  }
  z <- datos |>
    dplyr::select(fecha, valor = dplyr::all_of(variable)) |>
    dplyr::filter(!is.na(fecha), !is.na(valor)) |>
    dplyr::arrange(fecha)

  if (nrow(z) < 2) {
    cat("Hay menos de dos observaciones válidas para interpretar **", nombre, "**.\\n\\n", sep = "")
    return(invisible(NULL))
  }

  primero <- z[1, ]
  ultimo <- z[nrow(z), ]
  maximo <- z[which.max(z$valor), ]
  minimo <- z[which.min(z$valor), ]
  cambio <- ultimo$valor - primero$valor
  direccion <- if (cambio > 0) "aumentó" else if (cambio < 0) "disminuyó" else "no registró cambio neto"
  positivos <- mean(z$valor > 0) * 100
  negativos <- mean(z$valor < 0) * 100
  volatilidad <- stats::sd(z$valor, na.rm = TRUE)

  cat("**Lectura cuantitativa.** La serie **", nombre, "** pasó de ",
      formato_millones(primero$valor), " millones de USD en ",
      format(primero$fecha, "%Y-%m"), " a ",
      formato_millones(ultimo$valor), " millones en ",
      format(ultimo$fecha, "%Y-%m"), ". Entre ambos extremos, el saldo ",
      direccion, " en una magnitud de ", formato_millones(abs(cambio)),
      " millones de USD. El valor máximo fue ",
      formato_millones(maximo$valor), " millones en ",
      format(maximo$fecha, "%Y-%m"), " y el mínimo fue ",
      formato_millones(minimo$valor), " millones en ",
      format(minimo$fecha, "%Y-%m"), ". Un ",
      round(positivos, 1), "% de las observaciones fue positivo y un ",
      round(negativos, 1), "% negativo. La desviación estándar fue de ",
      formato_millones(volatilidad), " millones de USD.\\n\\n", sep = "")

  cat("**Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.\\n\\n")
  invisible(list(inicial = primero, final = ultimo, maximo = maximo,
                 minimo = minimo, cambio = cambio, sd = volatilidad))
}

4. Cuenta corriente: desempeño externo y componentes

4.1 Estadísticas descriptivas

vars_corriente <- c(
  "CUENTA CORRIENTE", "Balanza de Bienes", "Balanza de Servicios",
  "BIENES Y SERVICIOS TOTAL", "Ingreso primario (Renta factorial)",
  "Ingreso secundario (Transferencias corrientes)",
  "Bienes - Exportaciones", "Bienes - Importaciones",
  "Servicios - Exportaciones", "Servicios - Importaciones"
)

stats_corriente <- estadisticas(corriente, vars_corriente)
knitr::kable(stats_corriente, digits = 2,
             caption = "Estadísticas descriptivas de la cuenta corriente") |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover", "responsive"))
Estadísticas descriptivas de la cuenta corriente
Variable N Media Mediana Desviacion_estandar Minimo Maximo
BIENES Y SERVICIOS TOTAL 122 -1616,09 -981,19 1677,27 -5442,01 711,52
Balanza de Bienes 122 -817,51 -359,90 1590,17 -4814,00 2193,18
Balanza de Servicios 122 -798,58 -720,16 513,86 -2170,89 171,96
Bienes - Exportaciones 122 8676,02 9289,97 4348,18 2602,46 16290,03
Bienes - Importaciones 122 9493,53 10178,52 5036,66 2428,18 19212,00
CUENTA CORRIENTE 122 -2075,14 -1810,31 1597,66 -6429,91 331,28
Ingreso primario (Renta factorial) 122 -1985,50 -1892,11 1200,58 -4669,21 -240,49
Ingreso secundario (Transferencias corrientes) 122 1526,45 1236,71 1083,15 157,00 4297,89
Servicios - Exportaciones 122 1789,28 1495,59 1308,18 442,59 5361,23
Servicios - Importaciones 122 2587,86 2663,10 1418,91 770,66 5511,00

La media y la mediana resumen el nivel típico de cada serie; la desviación estándar mide su dispersión. Los mínimos y máximos permiten identificar valores extremos, que deben interpretarse en el contexto económico y no asumirse automáticamente como errores.

4.2 Gráfica 1. Evolución de la cuenta corriente

grafico_linea(
  corriente, "CUENTA CORRIENTE",
  "Gráfica 1. Evolución de la cuenta corriente",
  "Saldo trimestral; la línea horizontal señala el valor cero"
)

La serie permite distinguir los trimestres con saldo negativo de aquellos con saldo positivo. La lectura automática siguiente identifica el nivel inicial y final, los extremos históricos y la proporción de trimestres con signo positivo o negativo.

interpretar_serie(corriente, "CUENTA CORRIENTE", "Cuenta corriente")

Lectura cuantitativa. La serie Cuenta corriente pasó de -1.092 millones de USD en 1996-01 a -4.712 millones en 2026-04. Entre ambos extremos, el saldo disminuyó en una magnitud de 3.620 millones de USD. El valor máximo fue 331 millones en 1999-04 y el mínimo fue -6.430 millones en 2014-10. Un 7,4% de las observaciones fue positivo y un 92,6% negativo. La desviación estándar fue de 1.598 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.

if ("CUENTA CORRIENTE" %in% names(corriente)) {
  extremos_cc <- dplyr::bind_rows(
    corriente |> dplyr::slice_min(.data[["CUENTA CORRIENTE"]], n = 5, with_ties = FALSE) |>
      dplyr::mutate(Clasificacion = "Cinco saldos más bajos"),
    corriente |> dplyr::slice_max(.data[["CUENTA CORRIENTE"]], n = 5, with_ties = FALSE) |>
      dplyr::mutate(Clasificacion = "Cinco saldos más altos")
  ) |>
    dplyr::select(fecha, Clasificacion, `CUENTA CORRIENTE`)
  knitr::kable(extremos_cc, digits = 2,
               caption = "Trimestres extremos de la cuenta corriente") |>
    kableExtra::kable_styling(bootstrap_options = c("striped", "hover", "responsive"))
}
Trimestres extremos de la cuenta corriente
fecha Clasificacion CUENTA CORRIENTE
2014-10-01 Cinco saldos más bajos -6429,91
2022-07-01 Cinco saldos más bajos -5963,23
2022-01-01 Cinco saldos más bajos -5666,84
2021-10-01 Cinco saldos más bajos -5462,49
2015-01-01 Cinco saldos más bajos -5371,76
1999-04-01 Cinco saldos más altos 331,28
2000-01-01 Cinco saldos más altos 319,26
1999-07-01 Cinco saldos más altos 272,81
2000-07-01 Cinco saldos más altos 229,47
2000-10-01 Cinco saldos más altos 174,78

4.3 Gráfica 2. Componentes de la cuenta corriente

componentes_cc <- c(
  "Balanza de Bienes", "Balanza de Servicios",
  "Ingreso primario (Renta factorial)",
  "Ingreso secundario (Transferencias corrientes)"
)
componentes_cc <- intersect(componentes_cc, names(corriente))

if (length(componentes_cc) > 0) {
  corriente |>
    dplyr::select(fecha, dplyr::all_of(componentes_cc)) |>
    tidyr::pivot_longer(-fecha, names_to = "Componente", values_to = "Saldo") |>
    ggplot(aes(fecha, Saldo, colour = Componente)) +
    geom_hline(yintercept = 0, linetype = "dashed", colour = gris) +
    geom_line(linewidth = 0.8, na.rm = TRUE) +
    facet_wrap(~Componente, scales = "free_y", ncol = 2) +
    scale_y_continuous(labels = formato_millones) +
    scale_x_date(date_breaks = "5 years", date_labels = "%Y") +
    labs(title = "Gráfica 2. Componentes de la cuenta corriente",
         subtitle = "Paneles separados para facilitar la lectura de magnitudes diferentes",
         x = "Trimestre", y = "Millones de USD", colour = "Componente",
         caption = "Fuente: Banco de la República de Colombia; archivos suministrados.") +
    tema_academico + theme(legend.position = "none")
}

Cómo interpretar esta gráfica. Compara la posición de cada línea respecto de cero, su amplitud y la persistencia de sus movimientos. La balanza de bienes y la de servicios se relacionan con el intercambio internacional; el ingreso primario recoge rentas asociadas, entre otros conceptos, con trabajo e inversión; el ingreso secundario incluye transferencias corrientes. Los paneles tienen escalas independientes: por ello, la altura visual de dos líneas en paneles diferentes no equivale a una comparación directa de magnitudes.

for (v in componentes_cc) interpretar_serie(corriente, v, v)

Lectura cuantitativa. La serie Balanza de Bienes pasó de -530 millones de USD en 1996-01 a -4.814 millones en 2026-04. Entre ambos extremos, el saldo disminuyó en una magnitud de 4.284 millones de USD. El valor máximo fue 2.193 millones en 2012-01 y el mínimo fue -4.814 millones en 2026-04. Un 43,4% de las observaciones fue positivo y un 56,6% negativo. La desviación estándar fue de 1.590 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.*Lectura cuantitativa. La serie Balanza de Servicios** pasó de -271 millones de USD en 1996-01 a -610 millones en 2026-04. Entre ambos extremos, el saldo disminuyó en una magnitud de 339 millones de USD. El valor máximo fue 172 millones en 2026-01 y el mínimo fue -2.171 millones en 2014-10. Un 3,3% de las observaciones fue positivo y un 96,7% negativo. La desviación estándar fue de 514 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.*Lectura cuantitativa. La serie Ingreso primario (Renta factorial)** pasó de -460 millones de USD en 1996-01 a -3.445 millones en 2026-04. Entre ambos extremos, el saldo disminuyó en una magnitud de 2.985 millones de USD. El valor máximo fue -240 millones en 1999-04 y el mínimo fue -4.669 millones en 2022-07. Un 0% de las observaciones fue positivo y un 100% negativo. La desviación estándar fue de 1.201 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.*Lectura cuantitativa. La serie Ingreso secundario (Transferencias corrientes)** pasó de 169 millones de USD en 1996-01 a 4.157 millones en 2026-04. Entre ambos extremos, el saldo aumentó en una magnitud de 3.988 millones de USD. El valor máximo fue 4.298 millones en 2025-04 y el mínimo fue 157 millones en 1998-04. Un 100% de las observaciones fue positivo y un 0% negativo. La desviación estándar fue de 1.083 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.

4.4 Gráfica 3. Exportaciones e importaciones de bienes

vars_comercio <- intersect(c("Bienes - Exportaciones", "Bienes - Importaciones"), names(corriente))
if (length(vars_comercio) >= 2) {
  corriente |>
    dplyr::select(fecha, dplyr::all_of(vars_comercio)) |>
    tidyr::pivot_longer(-fecha, names_to = "Serie", values_to = "Valor") |>
    ggplot(aes(fecha, Valor, colour = Serie)) +
    geom_line(linewidth = 0.9, na.rm = TRUE) +
    scale_colour_manual(values = c("Bienes - Exportaciones" = verde,
                                  "Bienes - Importaciones" = azul_claro)) +
    scale_y_continuous(labels = formato_millones) +
    scale_x_date(date_breaks = "4 years", date_labels = "%Y") +
    labs(title = "Gráfica 3. Exportaciones e importaciones de bienes",
         subtitle = "Comparación de los flujos trimestrales",
         x = "Trimestre", y = "Millones de USD", colour = NULL,
         caption = "Fuente: Banco de la República de Colombia; archivos suministrados.") +
    tema_academico
} else {
  cat("No se encontraron ambas columnas de exportaciones e importaciones.\n")
}

Análisis de la comparación comercial. Observa si las dos líneas convergen, se separan o cambian de dirección. Una brecha persistente entre importaciones y exportaciones puede coincidir con un saldo deficitario de bienes; la conclusión debe verificarse con la variable Balanza de Bienes del mismo archivo. Los cambios de las series reflejan valores nominales en USD y no permiten separar por sí solos variaciones de precios de cambios en cantidades.

if (all(c("Bienes - Exportaciones", "Bienes - Importaciones") %in% names(corriente))) {
  brecha_comercial <- corriente |>
    dplyr::mutate(
      brecha_exp_imp = `Bienes - Exportaciones` - `Bienes - Importaciones`,
      diferencia_abs = abs(brecha_exp_imp)
    ) |>
    dplyr::filter(!is.na(brecha_exp_imp))
  peor <- brecha_comercial |> dplyr::slice_min(brecha_exp_imp, n = 1, with_ties = FALSE)
  mejor <- brecha_comercial |> dplyr::slice_max(brecha_exp_imp, n = 1, with_ties = FALSE)
  cat("**Indicadores de la brecha comercial.** En promedio, la diferencia exportaciones menos importaciones fue de ",
      formato_millones(mean(brecha_comercial$brecha_exp_imp)), " millones de USD por trimestre. ",
      "La brecha más negativa ocurrió en ", format(peor$fecha, "%Y-%m"),
      " (", formato_millones(peor$brecha_exp_imp), " millones), mientras que el mayor saldo de exportaciones frente a importaciones se observó en ",
      format(mejor$fecha, "%Y-%m"), " (", formato_millones(mejor$brecha_exp_imp), " millones). ",
      "Estos cálculos comparan los flujos de bienes reportados y deben contrastarse con la serie oficial de balanza de bienes.\\n\\n", sep = "")
}

Indicadores de la brecha comercial. En promedio, la diferencia exportaciones menos importaciones fue de -818 millones de USD por trimestre. La brecha más negativa ocurrió en 2026-04 (-4.814 millones), mientras que el mayor saldo de exportaciones frente a importaciones se observó en 2012-01 (2.193 millones). Estos cálculos comparan los flujos de bienes reportados y deben contrastarse con la serie oficial de balanza de bienes.

4.5 Gráfica 4. Distribución de los saldos

vars_saldos <- intersect(c(
  "CUENTA CORRIENTE", "Balanza de Bienes", "Balanza de Servicios",
  "Ingreso primario (Renta factorial)",
  "Ingreso secundario (Transferencias corrientes)"
), names(corriente))

if (length(vars_saldos) > 0) {
  corriente |>
    dplyr::select(dplyr::all_of(vars_saldos)) |>
    tidyr::pivot_longer(dplyr::everything(), names_to = "Variable", values_to = "Saldo") |>
    ggplot(aes(x = reorder(Variable, Saldo, FUN = median, na.rm = TRUE), y = Saldo)) +
    geom_boxplot(fill = azul_claro, alpha = 0.75, outlier.colour = rojo, na.rm = TRUE) +
    coord_flip() +
    scale_y_continuous(labels = formato_millones) +
    labs(title = "Gráfica 4. Distribución de los saldos de la cuenta corriente",
         x = NULL, y = "Millones de USD",
         caption = "Los puntos extremos son observaciones atípicas estadísticas, no necesariamente errores.") +
    tema_academico
}

Análisis de distribución. La línea central de cada caja representa la mediana; la caja recoge el rango intercuartílico y los puntos alejados pueden indicar trimestres atípicos. Los valores extremos no son necesariamente errores: pueden reflejar episodios económicos extraordinarios. Debido a que las variables tienen magnitudes diferentes, compara también las estadísticas descriptivas y no solo la extensión visual de las cajas.

if (length(vars_saldos) > 0) {
  dispersion_cc <- corriente |>
    dplyr::select(dplyr::all_of(vars_saldos)) |>
    tidyr::pivot_longer(dplyr::everything(), names_to = "Componente", values_to = "Saldo") |>
    dplyr::group_by(Componente) |>
    dplyr::summarise(
      Rango_intercuartil = IQR(Saldo, na.rm = TRUE),
      Desviacion = sd(Saldo, na.rm = TRUE),
      .groups = "drop"
    ) |>
    dplyr::arrange(dplyr::desc(Rango_intercuartil))
  if (nrow(dispersion_cc) > 0) {
    cat("**Comparación de dispersión.** Según el rango intercuartílico, el componente con mayor dispersión central es **",
        dispersion_cc$Componente[1], "** (", formato_millones(dispersion_cc$Rango_intercuartil[1]),
        " millones de USD). Este criterio compara la amplitud del 50 % central de las observaciones y reduce la influencia de los valores extremos.\\n\\n", sep = "")
  }
}

Comparación de dispersión. Según el rango intercuartílico, el componente con mayor dispersión central es Balanza de Bienes (2.544 millones de USD). Este criterio compara la amplitud del 50 % central de las observaciones y reduce la influencia de los valores extremos.

4.6 Gráfica 5. Variación interanual de la cuenta corriente

corriente <- corriente |>
  dplyr::arrange(fecha) |>
  dplyr::mutate(
    variacion_absoluta_trimestral = .data[["CUENTA CORRIENTE"]] -
      dplyr::lag(.data[["CUENTA CORRIENTE"]]),
    variacion_interanual = .data[["CUENTA CORRIENTE"]] -
      dplyr::lag(.data[["CUENTA CORRIENTE"]], 4)
  )

ggplot(corriente, aes(fecha, variacion_interanual)) +
  geom_hline(yintercept = 0, linetype = "dashed", colour = gris) +
  geom_col(fill = azul_claro, na.rm = TRUE) +
  scale_y_continuous(labels = formato_millones) +
  scale_x_date(date_breaks = "4 years", date_labels = "%Y") +
  labs(title = "Gráfica 5. Cambio interanual de la cuenta corriente",
       subtitle = "Diferencia respecto al mismo trimestre del año anterior",
       x = "Trimestre", y = "Cambio en millones de USD",
       caption = "Fuente: elaboración propia con datos suministrados del Banco de la República.") +
  tema_academico

Análisis de la variación interanual. Las barras por encima de cero indican que el saldo fue mayor que en el mismo trimestre del año anterior; las barras por debajo de cero muestran un saldo menor. Como se utiliza una diferencia absoluta y no una tasa porcentual, la medida conserva una interpretación clara cuando el saldo anterior es negativo o cercano a cero. Un aumento del saldo no implica necesariamente que la cuenta haya pasado a superávit.

cambios_validos <- corriente |> dplyr::filter(!is.na(variacion_interanual))
if (nrow(cambios_validos) > 0) {
  mayor_mejora <- cambios_validos |> dplyr::slice_max(variacion_interanual, n = 1, with_ties = FALSE)
  mayor_deterioro <- cambios_validos |> dplyr::slice_min(variacion_interanual, n = 1, with_ties = FALSE)
  cat("**Episodios de cambio interanual más pronunciado.** La mayor variación positiva se registró en ",
      format(mayor_mejora$fecha, "%Y-%m"), " (",
      formato_millones(mayor_mejora$variacion_interanual), " millones de USD), mientras que la mayor variación negativa ocurrió en ",
      format(mayor_deterioro$fecha, "%Y-%m"), " (",
      formato_millones(mayor_deterioro$variacion_interanual), " millones). ",
      "Estos episodios son candidatos para investigación documental posterior; las cifras no permiten atribuirlos automáticamente a una política o choque particular.\\n\\n", sep = "")
}

Episodios de cambio interanual más pronunciado. La mayor variación positiva se registró en 2023-07 (4.165 millones de USD), mientras que la mayor variación negativa ocurrió en 2014-10 (-3.554 millones). Estos episodios son candidatos para investigación documental posterior; las cifras no permiten atribuirlos automáticamente a una política o choque particular.

5. Cuenta financiera: estructura y dinámica de los flujos

5.1 Estadísticas descriptivas

vars_fin <- c(
  "Cuenta financiera", "Inversión directa", "Inversión de cartera",
  "Derivados financieros (distintos de reservas) y opciones de compra de acciones por parte de empleados",
  "Otra inversión", "Activos de reserva"
)
stats_financiera <- estadisticas(financiera, vars_fin)

knitr::kable(stats_financiera, digits = 2,
             caption = "Estadísticas descriptivas de la cuenta financiera") |>
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover", "responsive"))
Estadísticas descriptivas de la cuenta financiera
Variable N Media Mediana Desviacion_estandar Minimo Maximo
Activos de reserva 106 551,17 326,15 694,24 -869,60 3429,00
Cuenta financiera 106 -2110,97 -1838,05 1598,18 -6193,64 359,83
Derivados financieros (distintos de reservas) y opciones de compra de acciones por parte de empleados 106 -27,25 17,69 292,67 -879,41 1238,03
Inversión de cartera 106 -386,12 -186,04 1827,87 -6089,38 6653,05
Inversión directa 106 -1793,06 -1662,04 1292,33 -5441,74 2320,54
Otra inversión 106 -455,71 -305,78 1799,20 -6930,22 3913,72

Los componentes representan diferentes tipos de transacciones financieras internacionales. La inversión directa suele asociarse con una relación duradera de inversión; la inversión de cartera incluye instrumentos financieros negociables; otra inversión reúne otras categorías de activos y pasivos; y los activos de reserva corresponden a activos externos bajo control de la autoridad monetaria. La interpretación del signo debe seguir la convención oficial aplicada a esta serie.

La siguiente lectura cuantitativa resume la trayectoria de la cuenta financiera total; úsala junto con la gráfica y la metodología oficial para explicar el signo.

5.2 Gráfica 6. Evolución de la cuenta financiera total

grafico_linea(financiera, "Cuenta financiera",
              "Gráfica 6. Evolución de la cuenta financiera",
              "Saldo trimestral reportado en el archivo suministrado")

interpretar_serie(financiera, "Cuenta financiera", "Cuenta financiera total")

Lectura cuantitativa. La serie Cuenta financiera total pasó de 305 millones de USD en 2000-01 a -3.719 millones en 2026-04. Entre ambos extremos, el saldo disminuyó en una magnitud de 4.024 millones de USD. El valor máximo fue 360 millones en 2000-07 y el mínimo fue -6.194 millones en 2014-10. Un 5,7% de las observaciones fue positivo y un 94,3% negativo. La desviación estándar fue de 1.598 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.

Lectura de la gráfica. Observa cambios de signo, movimientos extremos y persistencia de los movimientos. No interpretes automáticamente los valores positivos como entradas netas de capital sin confirmar la convención contable oficial.

5.3 Gráfica 7. Componentes de la cuenta financiera

vars_componentes_fin <- intersect(c(
  "Inversión directa", "Inversión de cartera",
  "Derivados financieros (distintos de reservas) y opciones de compra de acciones por parte de empleados",
  "Otra inversión", "Activos de reserva"
), names(financiera))

if (length(vars_componentes_fin) > 0) {
  financiera |>
    dplyr::select(fecha, dplyr::all_of(vars_componentes_fin)) |>
    tidyr::pivot_longer(-fecha, names_to = "Componente", values_to = "Valor") |>
    ggplot(aes(fecha, Valor, colour = Componente)) +
    geom_hline(yintercept = 0, linetype = "dashed", colour = gris) +
    geom_line(linewidth = 0.8, na.rm = TRUE) +
    facet_wrap(~Componente, scales = "free_y", ncol = 2) +
    scale_y_continuous(labels = formato_millones) +
    scale_x_date(date_breaks = "5 years", date_labels = "%Y") +
    labs(title = "Gráfica 7. Evolución de los componentes financieros",
         subtitle = "Paneles con escalas independientes",
         x = "Trimestre", y = "Millones de USD", colour = NULL,
         caption = "Fuente: Banco de la República de Colombia; archivos suministrados.") +
    tema_academico + theme(legend.position = "none")
}

Análisis por componente. Los paneles permiten detectar qué componentes presentan mayores oscilaciones y cuándo aparecen cambios de dirección. Como cada panel utiliza una escala propia, la comparación visual debe complementarse con desviaciones estándar y rangos. Para explicar estos movimientos en términos de tasas de interés, riesgo internacional, precios de materias primas o decisiones de inversión se requieren fuentes complementarias.

for (v in vars_componentes_fin) interpretar_serie(financiera, v, v)

Lectura cuantitativa. La serie Inversión directa pasó de -340 millones de USD en 2000-01 a -3.188 millones en 2026-04. Entre ambos extremos, el saldo disminuyó en una magnitud de 2.848 millones de USD. El valor máximo fue 2.321 millones en 2010-07 y el mínimo fue -5.442 millones en 2023-04. Un 4,7% de las observaciones fue positivo y un 95,3% negativo. La desviación estándar fue de 1.292 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.*Lectura cuantitativa. La serie Inversión de cartera** pasó de -362 millones de USD en 2000-01 a 6.653 millones en 2026-04. Entre ambos extremos, el saldo aumentó en una magnitud de 7.015 millones de USD. El valor máximo fue 6.653 millones en 2026-04 y el mínimo fue -6.089 millones en 2021-04. Un 42,5% de las observaciones fue positivo y un 57,5% negativo. La desviación estándar fue de 1.828 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.*Lectura cuantitativa. La serie Derivados financieros (distintos de reservas) y opciones de compra de acciones por parte de empleados** pasó de 25 millones de USD en 2000-01 a -804 millones en 2026-04. Entre ambos extremos, el saldo disminuyó en una magnitud de 829 millones de USD. El valor máximo fue 1.238 millones en 2015-07 y el mínimo fue -879 millones en 2023-10. Un 58,5% de las observaciones fue positivo y un 37,7% negativo. La desviación estándar fue de 293 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.*Lectura cuantitativa. La serie Otra inversión** pasó de 769 millones de USD en 2000-01 a -6.930 millones en 2026-04. Entre ambos extremos, el saldo disminuyó en una magnitud de 7.699 millones de USD. El valor máximo fue 3.914 millones en 2026-01 y el mínimo fue -6.930 millones en 2026-04. Un 40,6% de las observaciones fue positivo y un 59,4% negativo. La desviación estándar fue de 1.799 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.*Lectura cuantitativa. La serie Activos de reserva** pasó de 212 millones de USD en 2000-01 a 550 millones en 2026-04. Entre ambos extremos, el saldo aumentó en una magnitud de 338 millones de USD. El valor máximo fue 3.429 millones en 2007-01 y el mínimo fue -870 millones en 2006-04. Un 89,6% de las observaciones fue positivo y un 10,4% negativo. La desviación estándar fue de 694 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.

5.4 Gráfica 8. Componentes financieros en años seleccionados

if (length(vars_componentes_fin) > 0) {
  fin_anual <- financiera |>
    dplyr::mutate(Anio = lubridate::year(fecha)) |>
    dplyr::group_by(Anio) |>
    dplyr::summarise(dplyr::across(dplyr::all_of(vars_componentes_fin),
                                   ~sum(.x, na.rm = TRUE)), .groups = "drop")

  # Selecciona cinco años con mayor suma de variaciones absolutas de componentes.
  fin_anual <- fin_anual |>
    dplyr::mutate(magnitud_total = rowSums(abs(dplyr::across(dplyr::all_of(vars_componentes_fin))),
                                           na.rm = TRUE))
  anios_seleccionados <- fin_anual |>
    dplyr::slice_max(magnitud_total, n = min(5, nrow(fin_anual)), with_ties = FALSE) |>
    dplyr::pull(Anio)

  fin_anual |>
    dplyr::filter(Anio %in% anios_seleccionados) |>
    dplyr::select(-magnitud_total) |>
    tidyr::pivot_longer(-Anio, names_to = "Componente", values_to = "Valor") |>
    ggplot(aes(x = factor(Anio), y = Valor, fill = Valor >= 0)) +
    geom_col(show.legend = FALSE) +
    facet_wrap(~Componente, scales = "free_y", ncol = 2) +
    scale_fill_manual(values = c("TRUE" = verde, "FALSE" = rojo), labels = c("TRUE" = "Positivo", "FALSE" = "Negativo")) +
    scale_y_continuous(labels = formato_millones) +
    labs(title = "Gráfica 8. Componentes financieros en años seleccionados", fill = "Signo",
         subtitle = "Se muestran los cinco años con mayor magnitud agregada absoluta entre los componentes disponibles",
         x = "Año", y = "Suma anual en millones de USD",
         caption = "La selección se basa en magnitudes absolutas; el signo conserva el registro original.") +
    tema_academico
}

Análisis de barras divergentes. Las barras verdes representan sumas anuales positivas y las terracota, negativas, de acuerdo con los valores originales. La selección se basa en la suma de magnitudes absolutas de los componentes disponibles, no en una clasificación general de importancia económica. Como las series financieras pueden tener convenciones contables distintas de la intuición cotidiana de “entrada” y “salida”, interpreta el signo con la documentación oficial.

5.5 Gráfica 9. Variabilidad de los flujos financieros

if (length(vars_componentes_fin) > 0) {
  financiera |>
    dplyr::select(dplyr::all_of(vars_componentes_fin)) |>
    tidyr::pivot_longer(dplyr::everything(), names_to = "Componente", values_to = "Valor") |>
    ggplot(aes(x = reorder(Componente, Valor, FUN = median, na.rm = TRUE), y = Valor)) +
    geom_boxplot(fill = azul_claro, alpha = 0.75, outlier.colour = rojo, na.rm = TRUE) +
    coord_flip() +
    scale_y_continuous(labels = formato_millones) +
    labs(title = "Gráfica 9. Dispersión de los componentes financieros",
         x = NULL, y = "Millones de USD",
         caption = "Fuente: elaboración propia con datos suministrados.") +
    tema_academico
}

Análisis de variabilidad. Una caja más amplia indica mayor dispersión del 50 % central de las observaciones; los puntos extremos muestran trimestres distantes del comportamiento típico. La desviación estándar ayuda a comparar las fluctuaciones en la misma unidad, aunque la magnitud y naturaleza contable de cada componente deben tenerse en cuenta. Esta gráfica no identifica causas ni mide por sí sola el riesgo financiero.

6. Lectura conjunta de las cuentas externas

6.1 Período común

cc_comparacion <- corriente |>
  dplyr::select(fecha, saldo_corriente = `CUENTA CORRIENTE`)

cf_comparacion <- financiera |>
  dplyr::select(fecha, saldo_financiero = `Cuenta financiera`)

periodo_comun <- dplyr::inner_join(cc_comparacion, cf_comparacion, by = "fecha") |>
  dplyr::arrange(fecha)

cat("Observaciones trimestrales comunes:", nrow(periodo_comun), "\n")
## Observaciones trimestrales comunes: 106
if (nrow(periodo_comun) > 0) {
  cat("Primer trimestre común:", format(min(periodo_comun$fecha), "%Y-%m-%d"), "\n")
  cat("Último trimestre común:", format(max(periodo_comun$fecha), "%Y-%m-%d"), "\n")
}
## Primer trimestre común: 2000-01-01 
## Último trimestre común: 2026-04-01

6.2 Gráfica 10. Comparación de trayectorias

if (nrow(periodo_comun) > 0) {
  periodo_comun |>
    tidyr::pivot_longer(-fecha, names_to = "Cuenta", values_to = "Saldo") |>
    ggplot(aes(fecha, Saldo, colour = Cuenta)) +
    geom_hline(yintercept = 0, linetype = "dashed", colour = gris) +
    geom_line(linewidth = 0.8, na.rm = TRUE) +
    facet_wrap(~Cuenta, scales = "free_y", ncol = 1,
               labeller = as_labeller(c(
                 saldo_corriente = "Cuenta corriente",
                 saldo_financiero = "Cuenta financiera"
               ))) +
    scale_y_continuous(labels = formato_millones) +
    scale_x_date(date_breaks = "4 years", date_labels = "%Y") +
    labs(title = "Gráfica 10. Trayectorias de cuenta corriente y cuenta financiera",
         subtitle = "Solo trimestres presentes en ambas bases; cada panel tiene su propia escala",
         x = "Trimestre", y = "Millones de USD",
         caption = "Fuente: Banco de la República de Colombia; archivos suministrados.") +
    tema_academico + theme(legend.position = "none")
}

Análisis comparativo. Los paneles permiten observar si los cambios en las dos cuentas ocurren en períodos similares o diferentes. Se usan escalas independientes para evitar que una serie de mayor magnitud oculte a la otra. Las dos cuentas forman parte de la balanza de pagos, pero sus saldos no tienen por qué coincidir de manera exacta en los archivos presentados. La relación contable completa también puede involucrar la cuenta de capital, errores y omisiones y convenciones específicas de registro. No se debe inferir causalidad a partir de la coincidencia temporal.

6.3 Correlación descriptiva

if (nrow(periodo_comun) >= 3) {
  correlacion <- cor(periodo_comun$saldo_corriente,
                     periodo_comun$saldo_financiero,
                     use = "complete.obs",
                     method = "pearson")
  cat("Correlación de Pearson en el período común:", round(correlacion, 3), "\n")
  cat("Esta correlación describe asociación lineal; no demuestra causalidad.\n")
} else {
  cat("No hay suficientes observaciones coincidentes para calcular una correlación útil.\n")
}
## Correlación de Pearson en el período común: 0,967 
## Esta correlación describe asociación lineal; no demuestra causalidad.

7. Comercio internacional e integración económica

Los acuerdos comerciales y los procesos de integración pueden influir en los costos de comercio, el acceso a mercados, la composición de las exportaciones e importaciones y las decisiones de inversión. Sin embargo, las dos bases utilizadas contienen agregados nacionales y no identifican por sí solas qué socio comercial o acuerdo explica una variación.

Como contexto para una discusión posterior pueden consultarse fuentes oficiales sobre la Comunidad Andina, la Alianza del Pacífico y el Ministerio de Comercio, Industria y Turismo de Colombia.

Para comprobar efectos específicos sería necesario incorporar, por ejemplo, exportaciones e importaciones por país socio, inversión extranjera por país de origen, fechas de entrada en vigor de los acuerdos y variables macroeconómicas de control. Sin esa información, las relaciones con la integración económica deben presentarse como hipótesis o mecanismos posibles, no como efectos causales demostrados.

8. Agenda de investigación: preguntas, variables y métodos

Pregunta 1

¿Qué relación temporal existe entre el saldo de la cuenta corriente y el comportamiento de la cuenta financiera de Colombia durante el período común?

  • Variables: saldo de la cuenta corriente y cuenta financiera.
  • Método: comparación gráfica y correlación descriptiva.
  • Resultado posible con estas bases: identificar si las series se mueven de manera similar o diferente en ciertos períodos.
  • Limitación: la correlación no establece dirección causal y la interpretación depende de la convención contable de ambas series.

Pregunta 2

¿Qué componentes de la cuenta corriente contribuyen en mayor medida a los déficits o superávits observados?

  • Variables: balanza de bienes, servicios, ingreso primario e ingreso secundario.
  • Método: análisis de series temporales, estadísticas descriptivas y comparación de magnitudes.
  • Resultado posible: reconocer qué componentes registran los saldos más altos o bajos y cómo varían a través del tiempo.
  • Limitación: para explicar las causas se necesitan datos adicionales sobre precios, cantidades, socios comerciales, rentas y transferencias.

Pregunta 3

¿Cómo podría evaluarse si los acuerdos de integración económica de Colombia se relacionan con cambios en sus exportaciones, importaciones y flujos de inversión extranjera?

  • Variables necesarias: comercio por país socio, flujos de inversión por país de origen y fechas de entrada en vigor de acuerdos.
  • Método posible: comparación antes/después y, si se dispone de datos y un diseño adecuado, modelos econométricos como diferencias en diferencias.
  • Resultado con las bases actuales: únicamente describir tendencias nacionales agregadas que sirven como punto de partida.
  • Limitación: estas bases no identifican el efecto de un acuerdo específico ni permiten concluir causalidad.

Pregunta 4 complementaria

¿Qué tan volátiles han sido los componentes de la cuenta financiera y cuáles muestran las mayores fluctuaciones?

  • Variables: inversión directa, inversión de cartera, derivados, otra inversión y activos de reserva.
  • Método: desviación estándar, rango, diagramas de caja y análisis temporal.
  • Resultado posible: comparar la variabilidad descriptiva de los componentes.
  • Limitación: las diferencias de escala y de naturaleza contable deben tenerse en cuenta al comparar volatilidad.

9. Conclusiones e implicaciones económicas

Completa las siguientes conclusiones después de revisar las tablas y gráficas generadas. Evita dejar afirmaciones genéricas o inventar resultados:

  1. Cuenta corriente: describe la tendencia observada, los períodos de mayor déficit o superávit y los componentes que más destacan en el período estudiado.
  2. Cuenta financiera: identifica los componentes más variables y los movimientos temporales más relevantes, respetando la convención contable de los datos.
  3. Relación entre las cuentas: resume los patrones observados durante el período común y aclara que una asociación temporal no prueba causalidad.
  4. Integración económica: explica qué hipótesis pueden plantearse a partir de las tendencias y qué datos adicionales serían necesarios para comprobarlas.
  5. Limitaciones: señala diferencias de cobertura temporal, posibles datos faltantes y la ausencia de desagregación por socio comercial en las bases suministradas.

10. Referencias y fuentes institucionales

Declaración de uso de inteligencia artificial

Para la elaboración de este trabajo se utilizó inteligencia artificial (ChatGPT) como herramienta de apoyo en la estructuración del código en RStudio, el diseño visual de las gráficas y la organización de los análisis e interpretaciones de las series de cuenta corriente y cuenta financiera de Colombia. Los resultados obtenidos se basan en las bases de datos utilizadas y deben ser revisados y validados por los autores. La inteligencia artificial se empleó como apoyo al proceso académico, sin sustituir el análisis crítico, la comprensión de los datos ni la responsabilidad de los autores sobre el contenido final del trabajo.