Skip to content
← Blog

Compara Kalshi y Polymarket de forma segura

dino.markets

Comparar Kalshi y Polymarket empieza por el contrato. Dos listados pueden describir el mismo evento en términos simples mientras pagan sobre resultados, ventanas de observación, fuentes de datos o límites distintos. Poner sus precios uno junto al otro antes de revisar esos términos crea una comparación que parece precisa entre dos afirmaciones distintas.

Dino empareja los listados relacionados en un objeto Market y mantiene las diferencias de resolución asociadas a ese objeto. Este tutorial usa el SDK de Python para inspeccionar un par y calcular una diferencia de precio solo después de revisar las comprobaciones de contrato.

Obtén un Market emparejado y su detalle

Crea una clave de API gratuita e instala el cliente. Luego solicita una familia de mercados abiertos. Este ejemplo usa clima porque sus diferencias de estación y bucket son fáciles de ver en la divulgación:

export DINO_API_KEY=sk_live_...
pip install dino-markets
from dino_markets import Dino

client = Dino()
catalog = client.markets(
    category="weather",
    market_type="weather_high",
    status="open,live",
    limit=20,
)

summary = next(
    (
        market
        for market in catalog["markets"]
        if market["coverage"]["kalshi"]
        and market["coverage"]["polymarket"]
    ),
    None,
)
if summary is None:
    raise SystemExit("No two-venue weather comparison is available right now.")

market = client.market(summary["id"])

El resultado de la lista entrega un id estable de Dino más los precios retrasados actuales. client.market(id) agrega contexto normalizado, identidades de cada plataforma, profundidad de mercado y divulgación de resolución para una comparación completa.

Convierte la divulgación en una lista de comprobación

La siguiente función deja visibles cuatro comprobaciones antes de cualquier cálculo de precio:

def comparison_checks(market):
    settlement = market.get("settlement") or {}
    risks = settlement.get("risks") or []
    served_blocking = [
        risk
        for risk in risks
        if risk.get("severity") == "high"
    ]
    fully_priced = bool(market["outcomes"]) and all(
        outcome.get("kalshi") is not None
        and outcome.get("polymarket") is not None
        for outcome in market["outcomes"]
    )

    return {
        "entity_match_served": market["match"] == "high_confidence",
        "full_price_coverage": fully_priced,
        "settlement_parity": settlement.get("parity") is True,
        "served_blocking_risks": served_blocking,
    }

checks = comparison_checks(market)
print(checks)

match responde la pregunta de identidad: Dino tiene evidencia suficiente de que los listados representan el mismo evento o la misma afirmación subyacente como para mostrarlos juntos. La cobertura completa de precio responde si cada resultado se puede comparar entre ambas plataformas. La paridad de resolución y la lista de riesgos entregada muestran si los resultados emparejados pagan bajo términos compatibles, sujeto a la divulgación de cancelación de abajo.

Un Market puede ser una comparación válida entre plataformas mientras lleva una advertencia de resolución. En ese caso su signal permanece en spread, y la advertencia debe ir junto a los precios. Una Opportunity confirmada tiene una puerta más alta y viene del recurso separado /v2/arbitrage.

Lee el contrato por capas

Usa los campos de detalle del Market como un orden fijo de revisión:

ComprobaciónCampoQué verificar
Identidadmatch, title, contexto de categoríaAmbos listados de plataforma se refieren al mismo evento o afirmación.
Resultadosoutcomes[].key, outcomes[].nameLos buckets cubren los mismos resultados del mundo real.
Coberturacoverage, precios de resultadoAmbas plataformas tienen un precio real donde la comparación lo necesite.
Resoluciónsettlement.parity, settlement.risks[], settlement.kalshi_text, settlement.poly_textLas fuentes de resolución y los límites de corte son compatibles o están divulgados. Lee el texto de reglas de cada plataforma para conocer la redacción de cancelación.

El settlement.risks[] entregado omite deliberadamente los eventos internos cancel_*. Lee kalshi_text y poly_text para conocer los términos de cancelación de cada plataforma. Dino calcula settlement.parity y signal a partir del conjunto completo de riesgos internos, antes de filtrar esos eventos de la lista pública de riesgos.

Los mercados de clima muestran por qué importa cada capa. Dos contratos de máxima diaria pueden nombrar la misma ciudad mientras resuelven desde estaciones meteorológicas distintas. Sus rangos de temperatura también pueden estar desfasados por un grado. Dino mantiene los buckets reales de cada plataforma y reporta los solapamientos en lugar de inventar un precio combinado.

Los mercados de umbral de cripto exponen un problema de límite distinto. Una plataforma puede resolver "en o por encima de" un strike, mientras la otra usa "por encima de". Una diferencia de precio justo en el umbral se refiere entonces a contratos con conjuntos ganadores distintos, incluso cuando ambos títulos mencionan el mismo activo y número.

Calcula las diferencias de precio al final

Una vez que se revisó la divulgación, calcula la diferencia observada para cada resultado con precio completo:

for outcome in market["outcomes"]:
    kalshi = outcome.get("kalshi")
    polymarket = outcome.get("polymarket")
    if kalshi is None or polymarket is None:
        continue

    gap_pts = abs(kalshi - polymarket) * 100
    print(
        outcome["name"],
        f"Kalshi {kalshi:.2f}",
        f"Polymarket {polymarket:.2f}",
        f"gap {gap_pts:.1f} pts",
    )

El resultado es un spread entre plataformas en el timestamp priced_at del Market. Indica qué tan separados están los dos precios observados. La ejecución requiere datos actuales del libro de órdenes, tamaño disponible, comisiones y términos de resolución compatibles. Son datos para desarrolladores, no asesoramiento financiero ni de trading.

Usa Cómo Dino empareja mercados para conocer las puertas de identidad y activación, y la referencia del objeto Market para cada campo usado arriba. Los tableros en vivo muestran la misma divulgación en una vista legible para humanos.

Más del blog