← Trading deportivo en Polymarket con Python
Qué es Polymarket
Preview gratis Sección 1 · Probabilidad, cuotas y edge en mercados deportivos
En este video
- Ves cómo paga un share YES: con cien acciones a 0.445 ganas 55.5 si Fulham gana y pierdes 44.5 si no.
- Entiendes por qué el precio se lee como probabilidad, con el valor esperado p menos c por acción.
- Revisas un partido de la Premier repartido en tres mercados cuyos YES suman 1.005, y cómo se movieron sus precios gol a gol.
- Ves quién está del otro lado de tu operación y cómo vender antes del resultado cierra una ganancia de 21.0.
- Conoces la resolución con el oráculo de UMA y las restricciones de acceso por país.
precio = 0.445 # YES «gana Fulham»
acciones = 100
costo = precio * acciones
print(costo)
print(1 * acciones - costo)
print(0 * acciones - costo)
c = 0.445 # precio del YES
for p in [0.40, 0.445, 0.50]:
print(p, round(p - c, 3))
print(round(1 - c, 3)) # NO
fulham, empate, palace = 0.445, 0.285, 0.275
print(round(fulham + empate + palace, 3))
# Paso que el video ejecuta sin mostrarlo en pantalla:
import pandas as pd
import matplotlib.pyplot as plt
URL = "https://pypro-assets.sfo3.digitaloceanspaces.com/cursos/trading-algoritmico-con-polymarket/datos/polymarket_premier_2627_precios.parquet"
d = pd.read_parquet(URL)
f = d[d.partido == "epl-ful-cry-2026-09-05"]
w = f.pivot_table(index="t", columns="resultado", values="p")
# minutos desde el inicio del partido (14:00 UTC)
w.index = (w.index - pd.Timestamp("2026-09-05 14:00", tz="UTC")).total_seconds() / 60
w = w.loc[-60:125]
nombres = {"local": "gana Fulham", "empate": "empate", "visitante": "gana Palace"}
colores = {"local": "#2563EB", "empate": "#94A3B8", "visitante": "#F59E0B"}
def marcar_goles(ax):
# velas de 5 min en las que el precio salta (los minutos incluyen el descanso)
goles = [(17.5, "1-0"), (37.5, "1-1"), (42.5, "2-1"), (72.5, "2-2"), (97.5, "2-3")]
for j, (m, txt) in enumerate(goles):
ax.axvline(m, ls=":", color="#64748B", lw=1)
ax.text(m, 1.04 if j % 2 == 0 else 0.97, txt, ha="center", fontsize=12, color="#0F1117")
ax.axvline(0, ls="--", color="#10B981", lw=1.2)
ax.text(0, -0.08, "inicio", ha="center", fontsize=11, color="#10B981")
ax.set_ylim(-0.12, 1.1)
ax.set_xlim(-60, 125)
fig, ax = plt.subplots(figsize=(10, 5.4))
for r in ["local", "empate", "visitante"]:
ax.plot(w.index, w[r], lw=2.4, label=nombres[r], color=colores[r])
marcar_goles(ax)
ax.set_xlabel("minutos desde el inicio")
ax.set_ylabel("precio del YES")
ax.legend(loc="center left")
compra = 0.445 # antes del inicio
venta = 0.655 # tras el 1-0
acciones = 100
print(round((venta - compra) * acciones, 2))
print(round((0 - compra) * acciones, 2))