Valor esperado en arbitraje de Polymarket: cómo calcular EV correctamente
Guía práctica para calcular el valor esperado de operaciones de arbitraje en Polymarket, incluyendo comisiones de taker, probabilidad de fills parciales y riesgos de liquidación. Fórmulas paso a paso y un ejemplo de código funcional.
Valor esperado en arbitraje de Polymarket: cómo calcular EV correctamente
Esta guía te muestra cómo calcular paso a paso el valor esperado (EV) de operaciones de arbitraje en Polymarket, incluyendo comisiones de taker, probabilidad de fills parciales y riesgos de liquidación. Si ejecutas arbitraje intra-market binario o combinatorio en Polymarket, estas fórmulas convierten una brecha de precio nominal en una estimación de EV accionable.
Puntos clave
- EV = (payout − coste − comisiones) × probabilidad_de_fill − pérdidas por fills parciales y por el tiempo hasta la liquidación.
- Incluye siempre las comisiones de taker y las tasas esperadas de fills parciales; las comisiones maker son cero en Polymarket, por lo que solo importan si te apoyas en liquidez pasiva.
- Usa modelos probabilísticos simples (Bernoulli o binomial) para fills parciales en tamaños pequeños; escala los modelos cuando la ejecución abarque múltiples niveles de precio.
- Nunca llames a una operación de arb "libre de riesgo" sin enumerar los riesgos: resolución, slippage, comisiones, disputas UMA y riesgo de contratos inteligentes o de temporización.
1. Fundamentos del EV para arbitraje en mercados predictivos
Parte de los primeros principios. Un arbitraje completo y exitoso que compra un conjunto completo de tokens de resultado cuesta C (suma de los best-asks comprados más cualquier comisión de taker) y, tras la resolución, se canjea por $1.00 por conjunto completo. La edge nominal es:
Edge = 1.00 − C
El valor esperado antes de comisiones y riesgo de ejecución es simplemente Edge por conjunto completo. Para trading práctico debes convertir eso en EV (ganancia monetaria esperada) teniendo en cuenta comisiones, la probabilidad de que tu orden se ejecute a los precios cotizados y los fills parciales.
EV_basic = Edge × FillProbability − Fees_expected
Refinarás FillProbability y Fees_expected en las siguientes secciones.
2. Incluir comisiones de taker y el flujo de liquidación
En Polymarket las comisiones de taker varían según categoría y actualmente están entre 0% y 1.8% según la categoría del mercado; las comisiones maker son cero. En arbitraje normalmente pagas comisiones de taker en las patas ejecutadas que cruzan el spread.
Cuando compras N outcomes (un conjunto completo en un mercado multi-outcome o ambos YES y NO en binario), calcula el coste bruto:
C_gross = Σ bestAsk_i
La comisión de taker por operación se expresa en puntos básicos o en porcentaje. Si fee_rate es la comisión de taker (como decimal), tus comisiones son aproximadamente:
Fees = fee_rate × C_gross
Si algunas patas se ejecutan como maker (raro en arb ajustado) no generan comisiones; modela eso dividiendo C_gross en partes maker y taker.
Coste neto C_net = C_gross + Fees
Entonces la ganancia nominal si se completa y es canjeable es:
Profit_full = 1.00 − C_net
Pero Profit_full solo se realiza con probabilidad FillProbability_full, así que la contribución al EV es Profit_full × FillProbability_full.
3. Modelar fills parciales y ejecución asimétrica
Los fills parciales son la fuente más común de pérdidas prácticas. Dos ejemplos:
- Tu orden compra YES completamente pero NO solo parcialmente. Quedas expuesto residualmente a YES priced por encima del hedge implícito.
- Los fills ocurren a través de múltiples niveles de precio; el C_gross realizado es mayor que la suma de los best asks de primer nivel.
Un modelo simple y útil para órdenes pequeñas es una probabilidad de fill Bernoulli por pata al best ask mostrado. Para tamaños mayores puedes modelar fills como binomial o como suma de porciones deterministas de volumen a través de niveles de precio.
Notación a usar en cálculos:
- q_i = cantidad objetivo para la pata i (en acciones de outcome)
- f_i = probabilidad de que q_i se llene completamente al best ask mostrado
- r_i = fracción esperada llenada para la pata i (0 ≤ r_i ≤ 1)
Coste esperado cuando los fills parciales son posibles:
E[C_gross] = Σ (bestAsk_i × q_i × r_i)
Las comisiones esperadas siguen proporcionalmente:
E[Fees] = fee_rate × E[C_gross] para la porción ejecutada como taker
Pero los fills parciales generan una posición residual asimétrica. El enfoque conservador común es asumir que cualquier posición residual de un solo outcome debe deshacerse inmediatamente al peor precio mid/ask, e incluir la pérdida esperada de ese deshacer en el EV.
Por ejemplo, si esperabas comprar un conjunto completo pero en promedio solo llenas el 90% de la pata NO, cargarás con el 10% de YES comprado a precio p_yes. La pérdida residual peor caso es aproximadamente 0.90 × (p_yes − mid_unwind_price) (ajusta según tick sizes y comisiones). Incluye un término de pérdida residual esperado L_residual en el EV.
4. Una fórmula EV paso a paso que puedes implementar
Define:
- n = número de outcomes en el conjunto (n=2 para binario)
- ask_i = best ask para el outcome i, en dólares
- q = cantidad objetivo por conjunto completo (acciones; p. ej., 10 conjuntos completos)
- fee = tasa de taker como decimal (p. ej., 0.006 para 0.6%)
- r_i = fracción esperada de fills para la pata i (0..1). Para probabilidad de llenado completo usa r_i = 1.0.
- p_unwind_i = precio esperado al que puedes cerrar cualquier posición residual en el outcome i (conservador: usa el peor ask actual o el mid)
Calcula:
- E[C_gross] = Σ_i ask_i × q × r_i
- E[Fees] = fee × E[C_gross]
- E[C_net] = E[C_gross] + E[Fees]
- Payout esperado cuando los conjuntos completos se canjean = q × 1.00 × P_redeem (P_redeem es la probabilidad de eventual canje; normalmente 1.0 salvo disputas UMA — pero incluye el riesgo de disputa más abajo)
- Pérdida residual esperada L_residual = Σ_i max(0, q × (1 − r_i) × (paid_price_i − p_unwind_i))
Estimación final de EV:
EV = q × P_redeem − E[C_net] − L_residual
Si prefieres EV por conjunto completo, divide EV por q.
Notas sobre P_redeem: las disputas UMA pueden pausar o alterar la liquidación. Fija P_redeem ≤ 1.0 para reflejar riesgo de disputa no nulo; para muchos mercados puedes tratar P_redeem ≈ 1.0 pero debes contabilizar explícitamente la posibilidad de liquidación retrasada o impugnada.
5. Ejemplo numérico trabajado (binario) — implementable y conservador
Supón un arbitraje binario pequeño donde intentas comprar 100 conjuntos completos comprando YES y NO a sus respectivos best asks. Usa números solo como ilustración; mantén la comisión dentro de los rangos documentados.
- ask_YES = $0.49
- ask_NO = $0.50
- q = 100 sets
- fee = 0.006 (0.6% comisión taker)
- r_YES = 1.0, r_NO = 0.95 (NO puede llenarse parcialmente en primer nivel)
- p_unwind_NO = $0.52 (precio al que esperarías vender el NO residual)
- P_redeem = 1.0 (asume canje eventual)
Calcula E[C_gross] = (0.49 + 0.50) × 100 × average_r
Más precisamente:
E[C_gross] = (0.49 × 100 × 1.0) + (0.50 × 100 × 0.95) = 49.00 + 47.50 = 96.50
E[Fees] = 0.006 × 96.50 = 0.579
E[C_net] = 96.50 + 0.579 = 97.079
Payout = 100 × 1.00 = 100.00
L_residual: esperabas 100 NO pero solo obtuviste 95, así que tienes un faltante de 5 NO si tu intención era mantener conjuntos completos. El residual típico es la exposición extra en la otra pata (YES). En este ejemplo el fill parcial deja 5 YES sin emparejar: si pagaste 0.49 por esos YES y debes deshacerlos a p_unwind_YES (conservador), calcula en consecuencia. Por simetría, una estimación conservadora de la pérdida residual para la pata mal llenada es:
L_residual = (q × (1 − r_NO)) × (paid_price_NO_unpaired − p_unwind_NO)
Si la pata sin emparejar es la más cara, incluye esa pérdida. Inserta números de forma conservadora para evitar sobreestimar el EV.
EV final = 100 − 97.079 − L_residual
Si L_residual es pequeña la operación mantiene EV positivo; si L_residual excede la Edge nominal, la operación es negativa. Ejecuta este cálculo de forma programática antes de enviar órdenes.
6. Un snippet JavaScript corto y utilizable
Este snippet calcula EV por conjunto completo, dados los inputs anteriores. Es JavaScript válido y listo para integrar en tu framework de riesgo.
function computeEVPerSet(asks, r, fee, p_unwind, P_redeem = 1.0) {
// asks: array of best asks for each outcome, e.g. [0.49, 0.50]
// r: array of expected fill fractions for each outcome, e.g. [1.0, 0.95]
const n = asks.length;
const q = 1; // per-set basis
const E_C_gross = asks.reduce((s, a, i) => s + a * q * r[i], 0);
const E_Fees = fee * E_C_gross;
const E_C_net = E_C_gross + E_Fees;
// Residual loss: assume unfilled fraction must be closed at p_unwind
const L_residual = asks.reduce((s, a, i) => {
const unfilled = q * (1 - r[i]);
const paid_price = a; // price you paid for filled portion of this outcome
const unwind_price = p_unwind[i];
return s + Math.max(0, unfilled * (paid_price - unwind_price));
}, 0);
const EV = q * P_redeem - E_C_net - L_residual;
return { EV_per_set: EV, E_C_gross, E_Fees, L_residual };
}
// Example
const asks = [0.49, 0.50];
const r = [1.0, 0.95];
const fee = 0.006; // 0.6%
const p_unwind = [0.48, 0.52];
console.log(computeEVPerSet(asks, r, fee, p_unwind));
Ajusta los valores de p_unwind de forma conservadora (usa el peor ask o el mid) y fija r según tasas de fills históricas a tu tamaño.
7. Consejos prácticos para trading en vivo
- Mide tasas de fill empíricas por instrumento y por tamaño. Usa ventanas de instrumentación cortas y frecuentes; la microestructura varía por mercado.
- Divide cantidades grandes en porciones más pequeñas para reducir el riesgo de fills parciales y para mantenerte dentro de los límites del builder o del relayer si aplica.
- Ten en cuenta el comportamiento del tick size: cuando los precios se acercan a extremos el tick se estrecha a $0.001, lo que puede cambiar el slippage al deshacer posiciones.
- Incluye el riesgo de disputa UMA y el riesgo por el tiempo hasta la liquidación en P_redeem. Las disputas pueden pausar la liquidación y afectar el coste de oportunidad.
- Respeta las restricciones geográficas: los mercados están geo-bloqueados por IP; nunca recomiendes eludir con VPN.
Cómo afecta esto a tu trading
Calcula EV por conjunto antes de enviar órdenes y compáralo con tu EV mínimo aceptable interno, que ya incluya el coste de capital, el coste de oportunidad del pUSD bloqueado y los costes de posibles demoras por disputas. Usa la fórmula de EV programáticamente en tus verificaciones pre-trade. Para arbitraje pequeño y frecuente normalmente exigirás un EV por conjunto modestamente positivo después de comisiones y pérdida residual esperada para justificar la sobrecarga operativa.
Cierra con la palabra clave principal: expected value Polymarket arbitrage siempre debe calcularse de forma conservadora, modelando explícitamente las comisiones de taker y la probabilidad de fills parciales.
Preguntas frecuentes
¿Cómo modelo la probabilidad de fills parciales para órdenes más grandes?
Parte de tasas de fills empíricas al tamaño que operas. Para incrementos pequeños usa supuestos Bernoulli por porción; para tamaños mayores modela fills como suma binomial a través de niveles de precio o usa profundidad histórica del libro para fragmentar la orden de forma determinista. Siempre sé conservador al estimar r_i.
¿Qué comisiones debo incluir en el cálculo de EV?
Incluye las comisiones de taker para las patas ejecutadas — las comisiones de taker de Polymarket actualmente varían entre 0% y 1.8% según la categoría; las comisiones maker son cero. Modela las comisiones como fee_rate × coste_ejecutado y divide coste_ejecutado en porciones maker/taker si aplica.
¿Debo tener en cuenta las disputas UMA en el EV?
Sí. Las disputas UMA pueden pausar la liquidación o cambiar su temporización. Incluye un factor P_redeem ≤ 1.0 para reflejar la probabilidad de disputa y el valor temporal / coste esperado de la liquidación retrasada.
¿Puedo ignorar la pérdida por deshacer residual si planeo re-balancear más tarde?
No. Las posiciones residuales conllevan riesgo de mercado y direccional. Incluye un precio de deshacer conservador (p_unwind) en tu modelo EV a menos que tengas un plan documentado y estadísticamente justificado para re-balancear con costes conocidos.
¿La edge nominal es lo mismo que el EV?
No. Edge nominal = 1.00 − Σ bestAsk_i. EV ajusta esa edge por comisiones de taker, probabilidad de fills parciales, pérdida residual por deshacer y riesgo de liquidación / disputas. Usa EV para la toma de decisiones.
Términos referenciados
Guías relacionadas
Solo con fines educativos. No es asesoramiento financiero, legal ni fiscal. Polymarket puede no estar disponible en tu jurisdicción.