Paris sportifs - un premier modèle

Présentation de notre premier modèle pour prédire les résultats des matchs des cinq grands championnats.

Retrouvez cet article sur notre site web.

Avant de regarder comment implémenter un tel modèle, il faut d'abord comprendre la logique des cotes fixées par les bookmakers. Elle obéit à deux dynamiques distinctes :

  • Une purement sportive ; les traders maintiennent des modèles sophistiqués pour prédire les probabilités des événements sportifs sur lesquels se tiennent des paris.

  • Une autre qui tient compte du volume de chaque pari. Plus une majorité de parieurs se positionnent sur une position, plus celle-ci voit sa cote baisser. Il s’agit pour le bookmaker de maîtriser d’éventuelles pertes.

Pour résumer, ces cotes sont la résultante d’un modèle sportif défini par le bookmaker mais aussi des tendances chez les parieurs. Cela laisse de la marge pour concevoir un modèle sportif suffisamment performant pour battre les cotes.

La source de données

N’importe qui peut aujourd’hui accéder gratuitement à quantité de données sur les matchs de football. Pour notre modèle, nous utiliserons les données de FBRef / StatsBomb. Pour l'évaluer, nous aurons également besoin des cotes de chaque match. Oddsdportal fournit justement les cotes moyennes d’avant-match à partir d’une multitude d’opérateurs.

Le périmètre sportif

On évitera des données sportives trop hétérogènes. Les matchs de Champion’s League par exemple, peuvent avoir des enjeux ou adversaires très variables. Les matchs de championnat semblent la solution la plus prudente. notre jeu de données sera constitué des matchs de championnat des 5 ligues européennes majeures, de la saison 2017-18 à la saison 2020-21. (On pourrait discuter de la spécificité des matchs lors de la pandémie, où l’importance de jouer à domicile est moindre...)

Quel modèle ?

L’issue d’un match de foot tient en partie à des phénomènes aléatoires qu’un modèle ne pourra jamais appréhender. On parle d’erreur irréductible ou de bruit. Aussi efficace soit notre modèle, il ne pourra jamais saisir une partie du problème qu’on lui demande de résoudre. Dans le football, cette incertitude doit beaucoup au faible nombre de buts, surtout en comparaison à des sports comme le basket ou le rugby. Les xG et leurs dérivés pallient ce problème ; comme indicateurs synthétiques, ils donnent une meilleure vision de la physionomie de la rencontre que le score.

Se pose alors la question, doit-on essayer de prédire directement le résultat ou préalablement les xG potentiels de chaque équipe ? Je penche pour le résultat direct. Une étape intermédiaire dans le modèle ajoute beaucoup de complexité et d'incertitude. Il faudrait notamment pouvoir estimer le nombre de tirs pour être capable de générer des probabilités de VND à partir des xG. Il faudrait aussi équilibrer les xG suivant chaque équipe ou joueur ; Messi par exemple est toujours plus performant que les prévisions des xG. De fait, les xG sont un bon indicateur pour la physionomie d’une rencontre dans une configuration donnée, pas nécessairement un assez bon proxy pour prédire le résultat. Il faut simplement garder en tête qu’il n’est pas possible de prédire l’issue d’une rencontre de football de manière certaine. Loin s’en faut.

Mais alors, quels paramètres utiliser en entrée ? On ne peut pas utiliser toutes les informations à notre disposition à cause d’un phénomène appelé curse of dimensionality ; en machine learning, plus on a de paramètres en entrée, plus il faut (exponentiellement) de données pour entraîner notre modèle. Or notre dataset ne contient que quelques milliers de matchs (ce qui est peu). Pour moi, le plus important est :

  • Les 4 ou 5 précédents matchs de chaque équipe. Cela capture à peu près l’état de forme d’une équipe et sa dynamique.

  • Savoir quelle équipe reçoit.

Voici une liste des paramètres en entrée, pour chaque équipe:

  • p_score : moyenne des buts sur les 4 derniers matchs.

  • p_score_against : moyenne des buts encaissés sur les 4 derniers matchs.

  • p_xg : xG moyens sur les 4 derniers matchs.

  • p_npxg : npxG moyens sur les 4 derniers matchs.

  • p_shots_total : nombre de tirs moyen sur les 4 derniers matchs

  • p_shots_on_target : nombre de tirs cadrés moyen sur les 4 derniers matchs.

  • p_xg_against : xG against moyens sur les 4 derniers matchs.

  • p_npxg_against : npXG against moyens sur les 4 derniers matchs.

  • p_shots_total_against : nombre moyen de tirs sur les 4 derniers matchs.

  • p_shots_on_target_against : nombre moyen de tirs cadrés sur les 4 derniers matchs.

  • p_ranking_against : classement moyen des 4 derniers adveraires.

  • L’identification de l’équipe à domicile découle de l’architecture de nos données.

Une fois cela fait, il faut choisir un algorithme de machine learning. Ici, on opte pour des Random Forests. Cet algorithme n’est pas aussi sophistiqué que bien d'autres mais il dispose de nombreux atouts, dont une évaluation out of the box des features (paramètres) les plus importants.

Préparation et découpage des données

Notre dataset contient 3744 matchs (on a supprimé les matchs où l’on ne disposait pas des données sur les 4 précédents matchs des deux équipes).

  • 1707 victoires (à domicile)

  • 1082 défaites

  • 955 nuls

Une grosse part du travail se trouve dans la mise en forme des données. Pour chaque match, il faut récupérer les 4 précédents matchs des protagonistes et calculer les différents paramètres listés ci-dessus.

On divise ensuite notre jeu de données en deux :

  • Un training set pour l’apprentissage.

  • Un test set qui nous servira à évaluer notre modèle en dernier ressort.

Evaluation du modèle

Notre modèle prédit correctement (accuracy) le résultat d’un match sur deux. Avant de trop s'exciter, un bon point de repère consiste à comparer notre modèle avec un modèle basique. Par exemple, prédire systématiquement une victoire à domicile donne une accuracy de 0.455 (sur le dataset total)...

Pour mieux saisir comment procède notre modèle, regardons la matrice de confusion. Notre modèle prédit presque systématiquement une victoire à domicile... C’est en partie dû au fait que c’est la classe majoritaire.

Mais le label prédit (v,n oud d) n’est pas tellement pertinent ici. Nous sommes plus intéressés par les probabilités de chaque label P(v), P(n), P(d). De plus, il faut tenir compte des cotes pour évaluer le gain réel de notre modèle.

Par exemple, si mon modèle prédit une victoire à 0.4 et un nul à 0.39 mais que les cotes sont respectivement de 1.2 et 4.8, il est bien plus pertinent de miser sur le match nul. C'est dans ce sens que nous définissons notre fonction qui va placer le pari en fonction des cotes et des probabilités fournies par le modèle :

Nous pouvons désormais calculer notre gain moyen sur le test set :

On trouve au final un gain moyen de 1.07, soit un bénéfice de 7%. Pour chaque euro parié, nous avons gagné en moyenne 1.07 euros. Monique, fais tes valises !

Importance des features

Comme noté plus haut, un des bénéfices des random forests tient dans leur capacité à évaluer l'importance de chaque paramètre en entrée, en voici le détail pour notre cas :

*_a et *_b correspondent respectivement aux paramètres de l'équipe à domicile et extérieur.

Comme on peut s'y attendre, les xg moyens sur les 4 précédents matchs sont les paramètres les plus utiles, bien plus que les scores...

Rapide Analyse des paris engagés

Sur l'ensemble du test set, le modèle perd 558 paris sur les 749 engagés. C'est parce que sa stratégie de mise est basée sur le meilleur rapport gain / risque et non pas sur la meilleure probabilité.

Si on essaye cette dernière stratégie (on mise sur la probabilité la plus forte), il n'y a plus que 387 paris perdus mais le gain devient alors négatif, à 0.97.

Pour conclure

Un tel outil mérite sans doute encore beaucoup d'optimisations dans les paramètres d'entrée ou dans la stratégie de paris. C'est un long mais passionnant processus, qui permet - entre autres choses - d'objectiver sa façon de penser avant de placer un pari, et nous force à nous interroger sur l'origine de nos prises de décisions.