Détectez les dropping odds et les mouvements de steam chez Pinnacle en temps réel
Un mouvement de steam est une baisse de prix rapide et forte chez un bookmaker qui fait le marché, comme Pinnacle, généralement parce que de l'argent « sharp » est entré d'un côté. Les bookmakers « soft » suivent souvent avec quelques secondes ou minutes de retard, ce qui fait des alertes de steam l'un des signaux les plus utiles d'un flux en direct. Dans ce guide, vous construisez un détecteur sur le WebSocket de PinnFeed. C'est un outil statistique, pas un système de pronostics.
Étape 1 — Définissez ce qu'est un steam#
Une définition pratique, à ajuster :
- la cote décimale d'une issue baisse d'au moins 5 % par rapport à son maximum des 2 dernières minutes ;
- la mise maximale du marché est d'au moins 100, car Pinnacle relève ses limites à mesure qu'il a confiance dans un prix : les mouvements sur des marchés peu liquides sont plus bruités ;
- vous alertez une fois par issue et par fenêtre, pas à chaque tick.
Étape 2 — Recevez le carnet en streaming#
Utilisez le client Python du guide Python et Node. Enregistrez-le sous pinnfeed_stream.py à côté du script ci-dessous ; il appelle on_market(old, new, event) à chaque changement de marché.
Étape 3 — Suivez le maximum glissant de chaque issue#
Gardez une courte deque de (timestamp, price) par marché et par issue, supprimez ce qui est plus ancien que la fenêtre et comparez le prix actuel au maximum de la fenêtre :
# steam.py : signale les mouvements de steam chez Pinnacle (baisses de prix rapides et fortes) depuis le WebSocket en direct.
# Utilise pinnfeed_stream.py du guide Python/Node. pip install websockets
import asyncio, collections, os, time
from pinnfeed_stream import stream, SIDES
WINDOW_S = int(os.environ.get("WINDOW_S", 120)) # fenêtre d'observation
MIN_DROP = float(os.environ.get("MIN_DROP", 0.05)) # alerte quand la cote baisse de 5 % ou plus dans la fenêtre
MIN_STAKE = float(os.environ.get("MIN_STAKE", 100)) # ignore les marchés peu liquides : la mise maximale de Pinnacle est un signal de confiance
history = collections.defaultdict(collections.deque) # (id du marché, issue) -> deque[(ts, decimal)]
alerted = {}
def on_market(old, new, event):
if not event or (new.get("maxStake") or 0) < MIN_STAKE:
return
now = time.time()
for o in new["outcomes"]:
if o["name"] not in SIDES:
continue
h = history[(new["id"], o["name"])]
h.append((now, o["decimal"]))
while h and now - h[0][0] > WINDOW_S:
h.popleft()
high = max(p for _, p in h)
drop = 1 - o["decimal"] / high
key = (new["id"], o["name"])
if drop >= MIN_DROP and now - alerted.get(key, 0) > WINDOW_S:
alerted[key] = now
pts = o.get("points")
line = "" if pts is None else f" {pts:g}" if new["type"] == "total" else f" {pts:+g}"
print(f'STEAM {event["sport"]} | {event["home"]} v {event["away"]} | {new["type"]}{line} {o["name"]}: '
f'{high:.3f} -> {o["decimal"]:.3f} (-{drop:.1%} in {WINDOW_S}s) fair {o["fair"]:.3f} max stake {new["maxStake"]}')
asyncio.run(stream({"sports": ["soccer", "tennis", "basketball"], "markets": ["moneyline", "spread", "total"],
"main": True, "specials": False}, on_market))
Lancez-le avec python steam.py. Les seuils sont des variables d'environnement ; par exemple MIN_DROP=0.03 WINDOW_S=300 python steam.py pour 3 % en cinq minutes. Une ligne typique :
STEAM tennis | Sebastian Baez v Daniil Glinka | moneyline away: 2.260 -> 2.050 (-9.3% in 120s) fair 2.143 max stake 975
Étape 4 — Ou interrogez l'endpoint REST#
Si une liste périodique vous suffit, GET /v1/drops renvoie les plus fortes chutes sur une fenêtre glissante, calculées côté serveur :
curl -H "x-api-key: $PINNFEED_KEY" "https://pinnfeed.io/v1/drops?sport=soccer&live=true&minutes=10&min_pct=5"
Chaque ligne contient l'événement, le marché, la ligne, l'issue, from, to, dropPct et movedAt. Cela fonctionne sur tous les plans, y compris Free avec ses 30 secondes de retard.
Étape 5 — Des alertes aux sélections#
- Comparez avec les bookmakers soft. Un steam n'a d'intérêt que là où le prix soft n'a pas encore bougé. Le guide du value betting montre comment chiffrer cet écart avec les cotes justes de Pinnacle.
- Privilégiez l'avant-match pour le retard des bookmakers soft ; en direct, les mouvements viennent souvent du score plutôt que de l'argent sharp.
- Mesurez-vous avec le closing line value : si vos sélections steam battent la cote de clôture en moyenne, le signal est réel.
- Publiez-les : le bot de pronostics Telegram envoie ces alertes dans un canal.
Questions fréquentes#
Quelle différence entre une chute de cote et un steam ?#
Une chute de cote, c'est n'importe quelle baisse de prix. Le steam est une chute rapide et significative chez un bookmaker sharp, généralement provoquée par de l'argent informé, qui tend ensuite à se propager aux autres bookmakers.
Pourquoi utiliser Pinnacle pour détecter le steam ?#
Pinnacle accepte des limites élevées et ajuste ses prix en fonction de l'action sharp : ses mouvements sont le meilleur signal du marché. Les bookmakers soft les copient ou suivent avec retard.
Puis-je le faire sans le WebSocket ?#
Oui, en interrogeant /v1/drops, disponible sur tous les plans. Le WebSocket voit chaque mouvement au moment où il se produit ; le polling ne le voit qu'à votre requête suivante.