Definiendo las carreras de caballos

Esta primera entrada sobre estadística quiero que haga las veces de glosario, de “Km 0” al que hacer referencia cuando en futuras publicaciones mencione términos algo más complejos. Además, puede ser un buen punto de partida si eres algo nuevo en el tema de la estadística o de las carreras de caballos.

Definición del problema.

Desde fuera, las carreras de caballos pueden verse como un “juego de azar” cualquiera, propio de un casino y equivalente a la ruleta; eliges una de entre varias opciones y si resulta ganadora obtienes un beneficio. Esta interpretación de las carreras de caballos está profundamente equivocada, ahora veremos por qué.

Para Figlewski (2008), mientras que la ruleta tiene riesgo pero no incertidumbre, el Turf posee los dos. ¿Qué son el riesgo y la incertidumbre? Se explica fácilmente con el ejemplo de lanzar una moneda obteniendo un premio si sale cara (misma situación que la ruleta.). Existe riesgo porque no tienes la certeza de que tras lanzar la moneda al aire vayas a obtener cara, pero no existe incertidumbre porque conoces las posibilidades de ambas opciones, 1 / 2, o lo que es lo mismo, 0.5 cara y 0.5 cruz (50% cara, 50% cruz).

El Turf es más complejo que eso, ya que además del riesgo (“¿qué caballo va a ganar?”) también hay incertidumbre. En una carrera de 5 caballos, ¿cada uno posee 1/5, 0.2, posibilidades de ganar? Evidentemente no, ya que infinidad de factores influyen en el rendimiento de cada ejemplar, desviándose de ese 0.2 y pudiendo quedar algo del tipo [0.35, 0.2, 0.13, 0.15, 0.17].

Y en esa distribución de posibilidades está la esencia del Turf (al menos desde el punto de vista de la estadística), ya que la tarea no es entonces saber qué caballo tiene más posibilidades de ganar sino en qué medida tiene más posibilidades. El entender que el objetivo no era predecir un factor (ganador / no-ganador) sino una variable cuantitativa (posibilidad de ganar) es, a día de hoy, el mayor cambio que he experimentado en mi aproximación a las carreras de caballos a través de la estadística.


Tipos de apuestas.

No voy a entrar aquí a definir en detalle en qué consiste cada tipo de apuesta, ya que esa información viene en casi todas las webs de hipódromos nacionales e internacionales, sino a tratar de explicar cómo se calculan las posibilidades de cada combinación basándose en la distribución de probabilidades a ganador que veíamos en el punto anterior.

Además, antes de empezar, hay que aclarar que estas fórmulas toman cada evento como independiente, aunque en la realidad pueden no serlo. Esta aclaración sólo tiene sentido si entiendes un poco de estadística, pero en el futuro la abordaré en algún post, porque me parece relevante.

Ganador

Esta es la más “simple” de todas, ya que consiste en la distribución de probabilidades de cada caballo para esa carrera. A estas probabilidades las llamaré p1, p2, p3pn (“probabilidad caballo 1”, “probabilidad caballo 2”, etc. hasta “probabilidad caballo n”).

Colocado[k]

En esta apuesta se gana si la selección llega en el puesto k o mejor. Por ejemplo, colocado[3] significa que obtendrías beneficio si el caballo elegido llega 1º, 2º o 3º. El beneficio es independiente al puesto en el que llega, si queda “k-ésimo” o mejor, hay pago.

Ya empiezan los cálculos más complicados y voy a tratar de explicarlo además de poner la fórmula, pero hay que empezar con esta. Fórmula para colocado[2] de un caballo i en una carrera de j participantes:

Como extensión de la fórmula anterior, la fórmula para colocado[3] sería:

En la primera fórmula lo que se está haciendo es calcular la probabilidad de que pi, nuestra selección, sea primero más la probabilidad de que sea segundo, quedando pm (cualquier otro caballo) primero. La segunda fórmula consiste en añadir a la primera la probabilidad de que pi sea tercero quedando pm primero y pn segundo.

A continuación, pongo una tabla de ejemplo con las probabilidades de cada evento para cada uno de los cinco caballos del caso inicial. Además, he escrito en R una función para cada cálculo, de tal forma que podéis automatizar el proceso.

Caballo Ganador Colocado[2] Colocado[3]
1 0.35 0.62 0.82
2 0.20 0.41 0.63
3 0.13 0.28 0.46
4 0.15 0.32 0.52
5 0.17 0.36 0.57


Gemela

En una gemela debes acertar los caballos que llegarán en primera y segunda posición. Hay dos variantes, reversible y no reversible. En la primera se obtiene beneficio indistintamente del orden, mientras que en la segunda debes acertar cada caballo en la posición en la que llegará, 1º o 2º.

Fórmula para la gemela no reversible para un caballo i como ganador y un caballo m como segundo, en una carrera de j participantes:

Fórmula para la gemela reversible para un caballo i como ganador y un caballo m como segundo, en una carrera de j participantes:

Trío

Un trío consiste en ampliar la gemela no reversible hasta tres posiciones, de tal forma que debes acertar qué caballo terminará primero, cuál segundo y cuál tercero. La fórmula para los caballos i, m, n, en las posiciones 1, 2 y 3, respectivamente, sería:

Es frecuente un formato alternativo al trío “normal”, conocido como “trío box”, que básicamente es incluir en el mismo boleto de apuestas todas las combinaciones posibles de tríos dados tres caballos. Esto hacen 3! o, lo que es lo mismo, 6 posibles tríos. La fórmula sería demasiado larga, pero básicamente consiste en sumar las probabilidades de cada trío por separado. Te dejo el código en R más abajo para que no tengas que calcularlo a mano.

Doble

En la apuesta doble debes acertar el ganador de dos carreras. En ocasiones deben ser consecutivas, pero no siempre esto es un requisito. La fórmula se calcula multiplicando las probabilidades de ganador de la selección de la primera carrera (pi) por las probabilidades de ganador de la selección de la segunda (pm).

Pick 3, Pick 4, etc.

Estas apuestas son una extensión de la anterior, pero esta vez incluyendo 3, 4 … k carreras, normalmente hasta la Pick 6. Su cálculo es sencillo:

Sistemas de apuestas: pari-mutuel vs bookies

A la hora de realizar tu apuesta hípica fundamentalmente tendrás dos opciones: el hipódromo o la casa de apuestas. En la casa de apuestas te encontrarás o bien una cuota SP, es decir, aún sin determinar, o bien la cuota numérica. La cuota indica cuánto recibirás si tu selección es acertada. Los beneficios se calculan entonces, siendo i la inversión y c la cuota, como:

En el hipódromo la situación es algo distinta, ya que funciona por dividendos y no por cuotas. Todas las inversiones del mismo tipo para la misma carrera se añaden a un pool y los beneficios se obtienen de este al dividirlo de manera proporcional a la inversión entre los distintos apostantes que acertaron.

Pongamos que para la carrera de ejemplo el pool a ganador lo conforman las siguientes inversiones para cada caballo, en euros, [3000, 1500, 500, 200, 500], lo que hace un pool de 5700 euros. El dividendo, o lo que es lo mismo, el valor de 1 euro invertido en esa selección a ganador es:

En esta ecuación t indica el impuesto del hipódromo, generalmente un 20 %. pi es la suma de lo apostado para nuestra selección y el numerador de la fracción simplemente es el pool total (la suma de todo lo apostado para cada caballo). Si queremos calcular el dividendo siendo el primer caballo nuestra selección, queda algo así:

Como ves, es mucho más sencillo de lo que parece. Haciendo eso mismo con todos los caballos quedan unos dividendos de [1.52, 3.04, 11.4, 28.5, 11.4]. Este cálculo parece un ejercicio teórico inútil, ya que en las pantallas de las taquillas de apuestas te pondrá esta información, pero en el punto siguiente veremos que permite comprender conceptos muy interesantes.


Probabilidades implícitas.

Llegamos al punto final. Si has llegado hasta aquí leyendo todos los anteriores puntos quiero darte las gracias por haber aguantado, y espero que este apartado sirva, aunque sólo sea un poco, de recompensa.

Comenzaremos con la siguiente pregunta: ¿qué son las probabilidades implícitas? Son una conversión que nos permite entender las cuotas o los dividendos no sólo como beneficio sino como probabilidad de que el evento que representan tenga lugar. Su cálculo es como sigue, también muy sencillo:

t es el impuesto del hipódromo y d el dividendo de la selección. Si calculamos las probabilidades implícitas de nuestra carrera de ejemplo nos quedan lo siguiente [0.53, 0.26, 0.09, 0.04, 0.09]. Lo primero que hay que resaltar es que la suma es 1, la misma situación que una lista de probabilidades calculada por ti mismo, lo que permite comparar ambas. Y los lectores más avispados se habrán dado cuenta de que aquí está la clave.



Por si eres como yo y te lleva algo más de tiempo hacer ese tipo de conexiones, te lo explico empezando por poner en una tabla las probabilidades calculadas por ti (est), las probabilidades implícitas (impl) y la diferencia entre ambas (dif) calculada como impl – est. Esta tabla es un ejemplo al margen de los datos de esa carrera teórica de cinco caballos. Esta vez serán siete.

Caballo est impl dif
1 0.23 0.18 -0.05
2 0.10 0.15 0.05
3 0.12 0.10 -0.02
4 0.13 0.20 0.07
5 0.17 0.05 -0.12
6 0.15 0.20 0.05
7 0.10 0.12 0.02

He marcado en rojo las diferencias negativas y en la siguiente tabla pongo los mismos valores, no como probabilidades sino como dividendos en función de dichas probabilidades.

Caballo est impl dif
1 3.48 4.44 0.96
2 8 5.33 -2.67
3 6.67 8 1.33
4 6.15 4 -2.15
5 4.71 16 11.29
6 5.33 4 -1.33
7 8 6.67 -1.33

Vamos a fijarnos en el “Caballo 1”. Nosotros creemos que tiene una probabilidad de ganar de 23%, pero cuando miramos las pantallas de los dividendos vemos que cotiza a 4.44€, o lo que es lo mismo, una probabilidad implícita del 18%. Si nuestros cálculos están bien y nuestra estimación de probabilidades es correcta (y para el propósito que nos atañe vamos a suponer que sí lo están) lo que vemos es que los dividendos subestiman la capacidad de ganar de los caballos 1, 3 y 5. Y en esa diferencia entre lo que es y lo que los dividendos reflejan está la esencia de toda esta explicación. Lo muestro en un gráfico, en el que voy a representar una simulación de 10000 apuestas de 1 euro a ganador al “Caballo 1”, con probabilidad de ganar de 0.23 y unos dividendos de 2.5 € (desventajosos), 3.48€ (justos) y 4.44 € (ventajosos).

Se trata de un gráfico que se genera aleatoriamente y que puedes modificar a tu gusto. Por defecto las características son las que menciono, pero tú puedes introducir las que quieras y experimentar cómo cambia. De hecho, puedes generar el gráfico varias veces con los mismos valores y ver cómo, debido a que se trata de un proceso en el que interviene el azar, las barras van a ir variando. ¡Recuerda que las probabilidades van de 0 a 1!

Probabilidades


Dividendos




Dividendos Ventajosos Dividendos Justos Dividendos Desventajosos

Cada apuesta es independiente de la anterior y para todos los casos una había un 23% de probabilidades de ganar. He resaltado en rojo la columna que representa la apuesta ventajosa, pero es bastante evidente la diferencia entre esta y las otras dos.

Este gráfico tiene muchas lecturas, y voy a intentar ir una a una para no dejarme nada. En primer lugar confirma la idea que planteaba al comenzar el post de que da igual saber qué caballo es el que tiene más opciones de ganar, ya que lo importante es conocer en qué medida tiene más opciones. Las tres columnas del gráfico hacen referencia al caballo con más probabilidades, y un 23% no está mal, pero aún así las pérdidas son significativas en los casos desventajoso y justo.

Este expermiento además pone en duda lo eficaces que pueden llegar a ser los métodos no basados en modelos predictivos sino únicamente en cálculos y estimaciones del valor del caballo, como las “tablas”. Supongamos que después de hacer los malabares con los números y valores obtienes que “Caballo 1” es el mejor. ¿Cómo sabes si deberías apostar por él? A menos que hagas pasos posteriores, y desarrolles una forma de pasar de tus valores a probabilidades, estos serán inútiles.

Otra cosa que debería haberte llamado la atención es lo ruinoso que supone apostar a dividendos que he denominado “justos”. No tanto como los desventajosos, pero claramente no son una opción. La explicación es sencilla; y justo debajo te pongo la fórmula para calcular el dividendo adecuado, “justo”, de unas probablidaddes dadas.

Siendo pi las probabilidades de esa selección. Para unas probabilidades de 0.23 el dividendo “justo” es 1 / 0.23 = 4.35 €. ¿De dónde sale entonces el dividendo de 3.48 € del ejemplo anterior? Fácil, de calcular el dividendo justo como 0.8 / 0.23. O lo que es lo mismo, añadir al cálculo el lastre del impuesto de 0.2 (¡Ojo! Cuando hablo de “lastre” me refiero a nivel estadístico, en ningún caso entro a valorar cuestiones fiscales o de tipo económico).

Por último, quiero volver a las tablas de probablidades y dividendos. He hecho la simulación con el caballo que más probabilidades de ganar tenía, el 1, pero la columna de diferencia muestra que el 3 tiene un margen de beneficio mucho mayor. Como jugador, ¿qué deberías hacer? ¿apostar por el 1? ¿el 6? ¿los dos?

Estos y otros temas son los que iré tratando en el blog, con la idea de hacer una aproximación más rigurosa al mundo de las predicciones y apuestas en el Turf. Espero que te haya resultado más interesante que desolador y te animes a seguir el blog.

¡Nos vemos!




Bibliografía.

Figlewski, S. (2008). Subjective Information and Market Efficiency in a Betting Market. World Scientific Handbook in Financial Economics Series, 285-298. doi:10.1142/9789812819192_0029



Code Book.

Te dejo a continuación el código de R para que puedas calcular tú mismo las probabilidades para cada tipo de apuesta.


## seed & libraries
set.seed(230963)

## Win probs list
wProb <- c(0.35, 0.2, 0.13, 0.15, 0.17)

## Bet calc
placeFunction <- function(wProbs, horse) {
    placeProbs <- wProbs[horse]
    for(i in 1:length(wProbs)) {
        if(i != horse) {
            placeProbs <- 
                placeProbs + (wProbs[i] * wProbs[horse] / (1 - wProbs[i]))
        }
    }
    return(placeProbs)
}
p <- placeFunction(wProb, 1)
print(p)

showFunction <- function(wProbs, horse) {
    showProbs <- wProbs[horse]
    for(i in 1:length(wProbs)) {
        if(i != horse) {
            showProbs <- 
                showProbs + (wProbs[i] * wProbs[horse] / (1 - wProbs[i]))
        }
    }
    for(m in 1:length(wProbs)) {
        if(m != horse) {
            for(n in 1:length(wProbs)) {
                if(n != horse & n != m) {
                    showProbs <- 
                        showProbs + wProbs[m] * (wProbs[n] / (1 - wProbs[m])) * (wProbs[horse] / (1 - wProbs[m] - wProbs[n]))
                }
            }
        }
    }
    
    return(showProbs)
}
p <- showFunction(wProb, 2)
print(p)
forecastFunction <- function(wProbs, horseA, horseB, rever) {
    if(rever == TRUE) {
        forecasProbs <- 
            (wProbs[horseA] * (wProbs[horseB] / (1 - wProbs[horseA]))) +
            (wProbs[horseB] * (wProbs[horseA] / (1 - wProbs[horseB])))
    } else {
        forecasProbs <- 
            wProbs[horseA] * (wProbs[horseB] / (1 - wProbs[horseA]))
    }
    
    return(forecasProbs)
}
p <- forecastFunction(wProb, 2, 1, TRUE)
print(p)

tricastFunction <- function(wProbs, horseA, horseB, horseC) {
    tricastProbs <- 
        wProbs[horseA] * (wProbs[horseB] / (1 - wProbs[horseA])) * 
        (wProbs[horseC] / (1 - wProbs[horseA] - wProbs[horseB]))

    return(tricastProbs)
}
p <- tricastFunction(wProb, 3, 10, 11)
print(p)

triBoxFunction <- function(wProbs, horseA, horseB, horseC) {
    triBoxProbs <- 0
    
    a <- horseA
    b <- horseB
    c <- horseC
    triBoxProbs <- triBoxProbs + wProbs[a] * (wProbs[b] / (1 - wProbs[a])) * 
                        (wProbs[c] / (1 - wProbs[a] - wProbs[b]))
    
    a <- horseA
    b <- horseC
    c <- horseB
    triBoxProbs <- triBoxProbs + wProbs[a] * (wProbs[b] / (1 - wProbs[a])) * 
        (wProbs[c] / (1 - wProbs[a] - wProbs[b]))
    
    a <- horseB
    b <- horseA
    c <- horseC
    triBoxProbs <- triBoxProbs + wProbs[a] * (wProbs[b] / (1 - wProbs[a])) * 
        (wProbs[c] / (1 - wProbs[a] - wProbs[b]))
    
    a <- horseB
    b <- horseC
    c <- horseA
    triBoxProbs <- triBoxProbs + wProbs[a] * (wProbs[b] / (1 - wProbs[a])) * 
        (wProbs[c] / (1 - wProbs[a] - wProbs[b]))
    
    a <- horseC
    b <- horseA
    c <- horseB
    triBoxProbs <- triBoxProbs + wProbs[a] * (wProbs[b] / (1 - wProbs[a])) * 
        (wProbs[c] / (1 - wProbs[a] - wProbs[b]))
    
    a <- horseC
    b <- horseB
    c <- horseA
    triBoxProbs <- triBoxProbs + wProbs[a] * (wProbs[b] / (1 - wProbs[a])) * 
        (wProbs[c] / (1 - wProbs[a] - wProbs[b]))
    
	return(triBoxProbs)
}
p <- triBoxFunction(wProb, 3, 10, 11)
print(p)