🛒 Bazaar

polymarket
mercados de predicción
probabilidades
candidatos

Los mercados de predicción como Polymarket merecen atención. ¿Qué precio le ponen los apostadores del mundo a cada candidato colombiano?

Autor/a
Afiliación

Recetas Electorales

Análisis independiente

Fecha de publicación

20 de abril de 2026

Fecha de última modificación

12 de junio de 2026

“Prices at any moment reflect a clash of narratives rather than any kind of consensus.”
—Rajiv Sethi, “Predicting Rare Events”


El Bazar de las apuestas

Las encuestas preguntan. Los mercados de predicción apuestan.

Nuestro Ajiaco2 y la Cazuela estiman la distribución de intención de voto “spot”, hoy. Polymarket estima quién gana. Son preguntas distintas, pero se pueden complementar: un candidato que lidera encuestas pero tiene baja probabilidad en Polymarket puede estar sufriendo un problema de viabilidad percibida por el mercado.

En un mercado de predicción como Polymarket, los participantes compran y venden contratos que valen $1 si un evento ocurre. El precio de cada contrato refleja la probabilidad implícita que el mercado asigna a ese resultado. Si un contrato por “Claudia López gana la primera vuelta” se transa a $0.30, el mercado dice que hay un 30% de probabilidad de que eso ocurra.

A diferencia de las encuestas, que miden la intención declarada de votantes o posibles votantes, Polymarket agrega la información privada de apostadores que arriesgan dinero real. Es un mecanismo distinto, con sesgos y problemas distintos, y por eso es interesante ponerlo al lado de nuestros modelos bayesianos.

Descargando los datos

Usamos el paquete polymarketR para acceder a la API pública de Polymarket:

Ver código
library(polymarketR)

descargar <- function(slug, mercado) {
  polymarketR::get_event_prices_history(
    event_slug = slug, interval = "max", fidelity = 1440
  ) |> dplyr::mutate(mercado = mercado)
}

bazar_raw <- dplyr::bind_rows(
  descargar("colombia-presidential-election",             "Ganador general"),
  descargar("colombia-presidential-election-1st-round-winner", "Primera vuelta")
)
1
Cargamos polymarketR, el paquete para descargar precios históricos de Polymarket.
2
Definimos una función auxiliar que baja el historial diario (fidelity = 1440) de un mercado y lo etiqueta.
3
Descargamos los dos mercados —ganador general y ganador de primera vuelta— y los unimos.

Evolución de las probabilidades

Analizamos dos mercados simultáneamente: Ganador general (quién gana la presidencia) y Primera vuelta (quién gana la primera vuelta). Cada candidato tiene un contrato “Yes/No” en cada mercado; el precio “Yes” es la probabilidad implícita Figura 1.

Ver código
cinco_candidatos <- tibble::tribble(
  ~patron,       ~nombre,                    ~color_cand,
  "Cepeda",      "Iván Cepeda",              "#A52E94",
  "Espriella",   "Abelardo de la Espriella", "#000066",
  "Fajardo",     "Sergio Fajardo",           "#442F7E",
  "Lopez|L.pez", "Claudia López",            "#00B399",
  "Valencia",    "Paloma Valencia",          "#63B9E9"
)

bazar_plot <- bazar_raw |>
  dplyr::filter(outcome == "Yes") |>
  dplyr::mutate(fecha = as.Date(datetime)) |>
  dplyr::filter(stringr::str_detect(groupItemTitle, stringr::str_c(cinco_candidatos$patron, collapse = "|"))) |>
  dplyr::mutate(nombre = cinco_candidatos$nombre[
    purrr::map_int(groupItemTitle, ~ which(stringr::str_detect(.x, cinco_candidatos$patron))[[1]])
  ]) |>
  dplyr::left_join(cinco_candidatos |> dplyr::select(nombre, color_cand), by = "nombre") |>
  dplyr::group_by(nombre, color_cand, mercado, fecha) |>
  dplyr::summarise(prob = mean(price), .groups = "drop")

p_evolucion <- bazar_plot |>
  dplyr::filter(fecha >= lubridate::ymd("2026-03-12")) |>
  ggplot2::ggplot(ggplot2::aes(
    x     = fecha,
    y     = prob,
    color = nombre,
    group = nombre,
    text  = paste0(nombre, ": ", scales::percent(prob, accuracy = 0.1),
                   "<br>", format(fecha, "%d %b %Y"))
  )) +
  ggplot2::geom_line(linewidth = 1.0, alpha = 0.85) +
  ggplot2::scale_color_manual(
    values = setNames(cinco_candidatos$color_cand, cinco_candidatos$nombre)
  ) +
  ggplot2::scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = c(0, NA)) +
  ggplot2::facet_wrap(~ mercado) +
  ggplot2::labs(
    title    = "Probabilidades implícitas — Polymarket",
    subtitle = paste0("Datos al ", Sys.Date()),
    caption  = "Fuente: polymarket.com con polymarketR",
    x        = NULL,
    y        = "Probabilidad implícita",
    color    = NULL
  ) +
  ggplot2::theme_minimal(base_size = 14) +
  ggplot2::theme(
    text             = ggplot2::element_text(family = "news-cycle"),
    legend.position  = "bottom"
  )

plotly::ggplotly(p_evolucion, tooltip = "text") |>
  plotly::layout(
    legend = list(orientation = "h", y = -0.2, x = 0.5, xanchor = "center")
  )
1
Definimos la tabla de los cinco candidatos con un patrón de texto para identificarlos en los datos de Polymarket.
2
Filtramos los contratos “Yes”, identificamos al candidato por patrón y promediamos la probabilidad implícita por día y mercado.
3
Construimos el gráfico base (fecha en X, probabilidad en Y) desde el 12 de marzo.
4
Una línea por candidato con colores de marca.
5
Escalas en porcentaje, un panel por mercado, títulos y nota de fuente.
6
Convertimos el gráfico a interactivo con ggplotly y leyenda horizontal.
Figura 1: Evolución de las probabilidades implícitas en Polymarket

Distribución actual

¿Dónde están hoy las fichas? Figura 2

Ver código
bazar_hoy <- bazar_plot |>
  dplyr::group_by(nombre, color_cand, mercado) |>
  dplyr::filter(fecha == max(fecha)) |>
  dplyr::summarise(prob = mean(prob), fecha_max = max(fecha), .groups = "drop")

bazar_hoy |>
  ggplot2::ggplot(ggplot2::aes(
    x    = prob,
    y    = reorder(nombre, prob),
    fill = color_cand
  )) +
  ggplot2::geom_col(alpha = 0.85) +
  ggplot2::scale_fill_identity() +
  ggplot2::geom_text(
    ggplot2::aes(label = scales::percent(prob, accuracy = 0.1)),
    hjust = -0.15, size = 4.5, family = "news-cycle"
  ) +
  ggplot2::scale_x_continuous(
    labels = scales::percent_format(accuracy = 1),
    expand = ggplot2::expansion(mult = c(0, 0.2))
  ) +
  ggplot2::scale_y_discrete(labels = scales::label_wrap(15))+
  ggplot2::facet_wrap(~ mercado) +
  ggplot2::labs(
    title    = "Probabilidades implícitas — Polymarket",
    subtitle = paste0("Última actualización: ", max(bazar_hoy$fecha_max)),
    caption  = "Fuente: polymarket.com con polymarketR",
    x        = "Probabilidad implícita",
    y        = NULL
  ) +
  ggplot2::theme_minimal(base_size = 15) +
  ggplot2::theme(
    text               = ggplot2::element_text(family = "news-cycle")
  )
1
Para cada candidato y mercado nos quedamos con el último día disponible (la probabilidad implícita más reciente).
2
Construimos el gráfico de barras horizontal, ordenando los candidatos por probabilidad.
3
Etiqueta con la probabilidad de cada barra.
4
Eje X en porcentaje con espacio a la derecha para las etiquetas.
5
Un panel por mercado, títulos y nota de fuente.
6
Tema minimalista con tipografía de marca.
Figura 2: Probabilidades implícitas actuales según Polymarket

El mercado vs. las encuestas

Los mercados de predicción y las encuestas miden cosas distintas:

Encuestas Polymarket
¿Quién responde? Votantes colombianos Apostadores del mundo
¿Qué mide? Intención de voto declarada Probabilidad implícita de victoria
Incentivo para ser honesto Ninguno Dinero real
Horizonte Estado actual Resultado final
Sesgo conocido Efecto casa, NS/NR Sesgos de mercado, liquidez
AdvertenciaOjo

Los mercados de predicción internacionales pueden tener información asimétrica sobre política colombiana. El volumen de transacciones y la profundidad del mercado son indicadores importantes de cuánto peso darle a estas señales.


Resultado — primera vuelta 31 de mayo de 2026

NotaResultados oficiales
Candidato % Votos válidos
Abelardo de la Espriella 43.72%
Iván Cepeda 40.92%
Paloma Valencia 6.92%
Sergio Fajardo 4.26%
Claudia López 0.95%

En la última semana antes de la elección, Polymarket y otros mercados mantenían a Cepeda como favorito con más del 60% de probabilidad. Los mercados fallaron en anticipar la victoria de ADLE — al igual que las encuestas — aunque la señal de su subida era visible si se miraba la trayectoria (ver Tendencias).

Cómo citar

BibTeX
@online{recetas_electorales2026,
  author = {{Recetas Electorales}},
  title = {🛒 Bazaar},
  date = {2026-04-20},
  url = {https://recetas-electorales.netlify.app/elecciones/2026-colombia/2026-04-20-bazaar/2026-bazaar.html},
  langid = {es}
}
Por favor, cita este trabajo como:
Recetas Electorales. 2026. “🛒 Bazaar.” April 20. https://recetas-electorales.netlify.app/elecciones/2026-colombia/2026-04-20-bazaar/2026-bazaar.html.