Type/to search
2
Follow
490
Followers
Entre arbitrage et prédiction : une expérience naïve de stratégie de convergence de chemins pour la Coupe du Monde
Discussions
Created 2026-06-18 09:09:14  Updated 2026-06-22 15:37:13
 0
 210

img

La Coupe du Monde vient à peine de débuter que le marché nous a déjà offert une petite leçon édifiante : les équipes fortes ne sont pas à l'abri d'un retournement, mais la manière dont elles chutent est souvent plus créative qu'on ne l'imagine.

Prenons l'exemple de l'Espagne 0-0 Cap-Vert. Avant le match, si l'on ne regarde que la force, le classement et la profondeur de l'effectif, l'intuition de la plupart des gens est simple : l'Espagne devrait gagner, non ? Mais c'est là que le football est le plus intéressant – et le plus frustrant pour les traders. Vous pensez acheter "victoire de l'équipe forte", mais en réalité, vous achetez un feuilleton de 90 minutes. Pas de but dans les 15 premières minutes, les cotes bougent ; toujours 0-0 à la demi-heure, le marché commence à froncer les sourcils ; à la 70e minute, rien n'a changé, et cette victoire de l'équipe forte qui semblait si sûre devient soudainement moins certaine.

img

C'est là qu'on rencontre un dilemme classique : l'arbitrage est formidable, la prédiction est difficile.

En théorie, un véritable arbitrage devrait être sans risque. Par exemple, trouver un ensemble de contrats mutuellement exclusifs et exhaustifs, de sorte que quelle que soit l'issue, la combinaison soit exécutable et que le coût d'achat soit inférieur au montant de l'exécution. Cela semble merveilleux, comme une sieste de trader. Mais le problème est là : de telles opportunités sont rares, disparaissent rapidement lorsqu'elles apparaissent, et leur capacité est souvent insuffisante.

La prédiction est une autre histoire. Vous pouvez juger qu'une équipe forte a de grandes chances de gagner, analyser la composition, la forme, le calendrier, les blessures, ou encore regarder les probabilités implicites des cotes. Mais le match ne coopère pas simplement parce que nous avons analysé sérieusement. Au football surtout, un carton rouge précoce, un poteau, un VAR absurde peuvent transformer une logique magnifique en un silence gênant de trois secondes dans le débriefing d'après-match.

img

Alors la question se pose : si l'arbitrage pur est trop rare et la prédiction pure trop aléatoire, peut-on se situer entre les deux ? Le marché lui-même nous donne déjà certaines probabilités préalables, comme le prix de la victoire de l'équipe forte, le prix du 0-0, le prix du 0-1. Ces prix ne sortent pas de nulle part ; ils reflètent la tarification collective du marché sur différents scénarios. Ne pourrions-nous pas utiliser ces probabilités préalables, et y ajouter un peu de notre propre modèle mathématique, pour construire une combinaison imparfaite mais mieux protégée, afin d'ouvrir une fenêtre de "convergence de scénarios" ?

C'est le point de départ de cette idée.

Ce n'est pas un arbitrage sans risque traditionnel, ni une prédiction à l'aveugle. C'est plutôt un compromis : d'abord, reconnaître que la probabilité principale donnée par le marché a une valeur de référence ; ensuite, utiliser des scénarios à faible probabilité pour protéger les parties les plus fragiles du jugement principal ; et enfin, vérifier avec un modèle simple si le prix est encore acceptable.

Supposons un match où le Brésil est nettement plus fort qu'Haïti. Le prix de la victoire du Brésil sur le marché est de 0,89, ce qui indique que la victoire brésilienne est un scénario principal fort. Mais nous n'achetons pas directement la victoire du Brésil ; nous observons également deux scénarios de protection : le 0-0 et le 0-1. Car pour un jugement de victoire d'une équipe forte, les scénarios précoces les plus gênants ne sont pas tous les résultats, mais plutôt le fait que le match tarde à s'ouvrir ou que l'équipe faible marque un but surprise.

La combinaison initiale devient donc :

text
Victoire du Brésil Oui 0-0 Oui 0-1 Oui

Supposons les prix suivants :

text
Victoire du Brésil = 0,89 0-0 = 0,016 0-1 = 0,011

Coût total des trois éléments :

text
C = 0,89 + 0,016 + 0,011 = 0,917

Cet ensemble n'est pas exhaustif. Il ne couvre pas le 1-1, le 0-2, le 2-2, ni tous les scénarios étranges. Donc, si on le conserve jusqu'à la fin du match, il peut évidemment perdre, et même perdre franchement. Mais il a une caractéristique importante : il rassemble les trois probabilités déjà données par le marché, formant un panier de scénarios autour de la victoire principale.

Si le Brésil gagne finalement, la combinaison rapporte 1. Si le résultat final est 0-0 ou 0-1, elle rapporte également 1. Autrement dit, on achète :

img

text
Victoire du Brésil ∪ 0-0 ∪ 0-1

Si l'un de ces scénarios se réalise, le versement à l'échéance est de 1. Le coût est de 0,917, laissant une marge de 0,083 dans les scénarios couverts. Mais l'essentiel n'est pas à la fin, c'est en cours de route.

Si le Brésil marque tôt, portant le score à 1-0, alors les deux jambes de protection (0-0 et 0-1) deviennent quasiment nulles, mais le prix de la victoire du Brésil augmente. Tant que le prix de vente de la victoire du Brésil dépasse le coût initial total, et y ajoute un bénéfice cible, on peut clôturer la jambe principale et converger la combinaison par anticipation.

La formule est simple :

text
Condition de prise de bénéfices = offre de Victoire Brésil >= coût initial total C + bénéfice cible

Par exemple, si le bénéfice cible est fixé à 0,02 :

text
Prix déclencheur = 0,917 + 0,02 = 0,937

Si après le 1-0, l'offre pour la victoire du Brésil atteint 0,95, alors :

text
Bénéfice verrouillé = 0,95 - 0,917 = 0,033

Ici, on ne gagne pas de l'argent grâce au tirage au sort final, mais parce que le scénario du match est entré dans une branche favorable, permettant de vendre la combinaison par anticipation. Ce processus est un peu comme si le marché vous ouvrait une petite fenêtre : ne vous mettez pas à écrire un poème devant, passez par la fenêtre d'abord.

Mais il y a encore un problème : le fait que les trois jambes semblent bon marché signifie-t-il qu'il faut les acheter ? Pas nécessairement. Le prix du marché n'est qu'une première couche d'information. Nous avons besoin de notre propre règle de référence, même si elle est rudimentaire.

Ici, j'utilise le modèle de Poisson le plus basique pour les buts.

Le score au football peut être grossièrement modélisé comme un processus aléatoire où chaque équipe marque des buts sur 90 minutes. Supposons que le nombre attendu de buts de l'équipe à domicile sur 90 minutes soit λ_domicile, et celui de l'équipe visiteuse λ_visiteur. Alors la probabilité que l'équipe à domicile marque i buts et l'équipe visiteuse j buts s'écrit :

text
P(i, j) = Pois(i; λ_domicile) × Pois(j; λ_visiteur)

où :

text
Pois(k; λ) = e^(-λ) × λ^k / k!

img

C'est évidemment très grossier. Le football n'est pas une machine à loterie indépendante ; la tactique change après un but, un carton rouge change la donne, la psychologie aussi. Mais l'avantage est que c'est simple, transparent, et cela nous empêche au moins de prendre des décisions purement intuitives.

Avant le match, le modèle de Poisson peut d'abord nous donner une référence initiale. On peut fournir manuellement λ_domicile et λ_visiteur, ou laisser le programme les déduire à rebours à partir des cotes exactes des scores sur le marché. Par exemple, les cotes pour 0-0, 0-1, 1-0, 1-1, 2-0, 2-1, 3-0 sont chacune un point de probabilité donné par le marché. Le programme doit trouver une paire λ_domicile et λ_visiteur telle que les probabilités de score calculées par le modèle de Poisson soient aussi proches que possible de ces prix de marché.

Autrement dit, le marché dit : "Je pense que ces scores valent à peu près ces prix." Le modèle de Poisson murmure à côté : "Laisse-moi essayer de les ajuster pour voir quelle intensité de buts est implicite derrière ces prix."

Dans la stratégie, on peut configurer :

python
CALIBRATE_LAMBDA_FROM_MARKET = True MODEL_SCORE_SAMPLES = "0-0,0-1,1-0,1-1,2-0,2-1,3-0"

Ces scores sont utilisés uniquement pour la modélisation, pas pour la passation d'ordres. Les jambes réellement négociées restent :

text
Victoire de l'équipe cible 0-0 0-1

Le code utilise une recherche par grille pour ajuster λ. Ce n'est pas compliqué, mais c'est très intuitif.

python
def fit_lambdas_from_score_markets(quotes, model_score_legs, event_state=None): samples = [] live_score = event_state.get("score_tuple") if event_state else None minute = event_state.get("elapsed") if event_state else None is_live = bool(live_score and minute not in [None, ""]) for leg in model_score_legs: q = quotes.get(leg["name"]) p_market = quote_probability(q) if p_market is None: continue target_h, target_a = parse_score_text(leg["score"]) if is_live: current_h, current_a = live_score if current_h > target_h or current_a > target_a: continue samples.append((target_h - current_h, target_a - current_a, p_market, leg["score"])) else: samples.append((target_h, target_a, p_market, leg["score"])) if len(samples) < 2: return None best = None for ih in range(5, 501, 5): lh = ih / 100.0 for ia in range(5, 501, 5): la = ia / 100.0 err = 0.0 for add_h, add_a, p_market, _score in samples: p_model = poisson_pmf(add_h, lh) * poisson_pmf(add_a, la) err += (p_model - p_market) ** 2 if best is None or err < best["err"]: best = {"lambda_home": lh, "lambda_away": la, "err": err, "samples": samples} if is_live: ratio = max(0.01, max(0.0, 90.0 - float(minute)) / 90.0) best["lambda_home"] = best["lambda_home"] / ratio best["lambda_away"] = best["lambda_away"] / ratio best["source"] = "live_score_markets" else: best["source"] = "pre_match_score_markets" return best

Avant le match, ce λ n'est qu'un calibrage initial. Comme le match n'a pas encore commencé, il n'y a pas de trajectoire en temps réel à mettre à jour, le score par défaut est toujours 0:0 et le temps restant est de 90 minutes. À ce stade, nous l'utilisons comme filtre d'entrée :

模型覆盖概率 = P(目标队胜) + P(0:0) + P(0:1)

Ensuite, on exige :

模型覆盖概率 - 市场成本 >= 安全边际

On n'autorise l'ouverture d'une position que lorsque le prix du marché est suffisamment bas et que le modèle estime que ce panier présente un léger avantage.

Ce qui devient vraiment intéressant, c'est après le début du match.

Une fois le match commencé, le modèle de Poisson n'est plus statique. Supposons que le match en soit à la 30e minute, le score actuel est toujours 0:0, le temps restant n'est que de 60 minutes, et l'intensité future des buts doit être réduite proportionnellement au temps restant :

text
λ_home_remaining = λ_home × (90 - t) / 90 λ_away_remaining = λ_away × (90 - t) / 90

Si le score actuel est déjà 1:0, alors les scores 0:0 et 0:1 ne peuvent plus se produire. Le modèle doit alors partir du score actuel et ne calculer que les buts qui seront marqués dans le temps restant. Seuls les scores finaux tels que 2:0, 2:1, 3:0, 1:1, qui sont encore possibles, peuvent participer à la nouvelle estimation.

C'est la clé de la mise à jour en temps réel du modèle de Poisson : il ne s'agit pas de réduire mécaniquement le λ d'avant-match chaque minute, mais de combiner le score actuel, le temps restant et les marchés de score exact encore possibles pour réestimer comment le match peut encore évoluer.

La stratégie finale se compose de trois niveaux de décision.

Premier niveau : le coût du marché

win_ask + 0:0_ask + 0:1_ask <= 最大允许成本

Deuxième niveau : le filtre de Poisson

模型覆盖概率 - 市场成本 >= 安全边际

Troisième niveau : la convergence de la trajectoire

当前组合 bid 价值 >= 初始成本 + 目标利润

Ce n'est que lorsque la première et la deuxième condition sont simultanément remplies que l'on envisage d'entrer. Une fois entré, on ne se fie plus au modèle pour fantasmer le résultat final, mais on utilise le bid réel du marché pour déterminer si l'on peut clôturer. Le modèle améliore la qualité de l'ouverture, le marché décide si l'on peut réaliser le profit.

La recherche de contrats est également conçue pour être aussi simple que possible. Le slug du marché de la Coupe du monde sur Polymarket est très structuré. Par exemple, le slug d'event d'un match est :

python
EVENT_SLUG = "fifwc-aut-jor-2026-06-17"

Si nous protégeons la victoire de la Jordanie, le suffixe du contrat de victoire correspondant est :

python
WIN_SUFFIX = "jor"

Alors les trois contrats nécessaires pour la transaction peuvent être directement construits :

python
def yes_symbol(slug): return slug + "_USDC.Yes" def build_legs(): legs = [ { "name": "win", "slug": EVENT_SLUG + "-" + WIN_SUFFIX, "symbol": yes_symbol(EVENT_SLUG + "-" + WIN_SUFFIX), "kind": "win", } ] for score in parse_scores(PROTECT_SCORES): legs.append( { "name": "score_" + score.replace("-", "_"), "slug": EVENT_SLUG + "-exact-score-" + score, "symbol": yes_symbol(EVENT_SLUG + "-exact-score-" + score), "kind": "score", "score": score, } ) return legs

Ici, il faut éviter autant que possible d'utiliser les noms d'équipes pour des recherches floues. Par exemple, si l'on cherche Jordan, on risque de trouver Michael B. Jordan, Jordan Pickford, Jordan Spieth, et finalement avant même que la stratégie de football n'ait commencé, le monde du divertissement, le gardien anglais et le golf sont déjà à table. Construire les contrats à partir du slug d'event est beaucoup plus propre.

Pendant le match, on a également besoin du score en temps réel. La première version peut le récupérer directement depuis l'événement Polymarket Gamma :

python
def get_event_state(): data = get_json(GAMMA_BASE + "/events", slug=EVENT_SLUG) e = data[0] return { "title": e.get("title"), "score": e.get("score"), "score_tuple": parse_score(e.get("score")), "elapsed": e.get("elapsed"), "period": e.get("period"), "live": bool(e.get("live")), "ended": bool(e.get("ended")), "start_time": e.get("startTime"), }

Calcul de la valeur actuelle du panier en utilisant le bid réel du carnet d’ordres :

python
def basket_bid_value(legs, quotes): total = 0.0 for leg in legs: pos = positions.get(leg["name"], {}) amount = float(pos.get("amount", 0)) if amount <= 0: continue q = quotes.get(leg["name"]) if not q or q["bid"] is None: continue total += amount * q["bid"] return total

Logique de take‑profit :

python
cost = current_position_cost() value = basket_bid_value(legs, quotes) target = cost + TARGET_PROFIT * SHARES if value >= target: close_all()

Voilà la version minimale. Elle ne prétend pas avoir résolu les prédictions footballistiques, ni annoncer un arbitrage stable. Elle essaie simplement d’explorer la zone grise entre « arbitrage » et « prédiction ».

La beauté de l’arbitrage réside dans la certitude, mais la certitude est rare. La séduction de la prédiction tient à son ampleur, mais le hasard y est grand. Ce que fait cette stratégie, c’est prendre les prix prévisionnels fournis par le marché comme matière première, combiner un jugement principal à forte probabilité avec deux chemins de protection à faible probabilité, filtrer grossièrement le tout avec un modèle de Poisson, et tenter de construire une fenêtre qui puisse converger en avance pendant le déroulement du match.

Il faut être clair sur le risque. Ce panier n’est pas un ensemble complet d’issues, ce n’est pas un arbitrage sans risque. Elle ne convient qu’aux matches où l’écart de force est suffisamment net, où le chemin principal est assez clair et où les chemins de protection sont suffisamment peu chers. Si le match est très équilibré, ou si les jambes de protection sont déjà chères, il est inutile de forcer. Le problème plus gênant est qu’elle ne couvre pas tous les chemins défavorables – par exemple 1:1, 0:2, 2:2 – qui peuvent tous entraîner une perte significative du panier. Il faut donc impérativement fixer une limite de taille de position, une perte maximale et une règle de stop‑loss ; on ne doit pas traiter cette stratégie comme un arbitrage sous prétexte qu’elle « en a l’air ».

Le modèle de Poisson n’est pas non plus une baguette magique. C’est seulement un socle mathématique très simple, qui nous permet de passer de « j’ai l’impression que ce prix est intéressant » à « au moins j’ai vérifié ce prix avec un modèle transparent ». Il se trompera, le marché se trompera aussi, et nous‑mêmes nous tromperons encore plus. La partie la plus honnête du trading, c’est probablement de reconnaître que tout cela peut se tromper, et de faire en sorte que l’erreur ne fasse pas tout basculer d’un seul coup.

Cette tentative est très modeste. Elle ressemble davantage à une question : alors que les opportunités d’arbitrage pur se raréfient et que la prédiction pure est trop difficile, pouvons‑nous, en utilisant les probabilités déjà données par le marché, construire des transactions plus structurées ? Non pas pour rêver d’éliminer le risque, mais pour le décomposer et voir par quels chemins il arrive.

Peut‑être que ce n’est pas la réponse, mais c’est un petit trou qui mérite d’être creusé. La prédiction nous dit quelle route principale est probablement la plus large, l’esprit d’arbitrage nous rappelle de ne pas regarder seulement la direction, mais aussi la structure de l’ensemble. Entre les deux, il y a peut‑être beaucoup d’autres pistes à explorer.

Code source de la stratégie : Stratégie de convergence de chemins footballistiques sur Polymarket

Comment
All comments (0)
No data
No data
  • 1
Forums
PINE Language
Get the app
iPhone Download
© 2015 - ∞ INVENTOR PTE LTD (SG)