Line Movement & Steam Moves¶
Summary¶
Line movement refers to how sportsbook odds change over time from when they open until the market closes (game time). These changes reflect new information (injuries, weather, lineup changes), betting volume imbalances, and sharp bookmaker reactions to wiseguy (professional bettor) action.
Steam moves are sudden, uniform line movements across multiple sportsbooks simultaneously, typically triggered by large wagers from professional bettors or syndicates. When a steam move occurs, multiple books adjust in the same direction within seconds or minutes, indicating that a significant amount of smart money has come in on one side.
Understanding line movement is important for the prediction model because: (a) steam moves can signal market corrections that the model should incorporate, (b) reverse line movement (line moving opposite to public betting) is a known market inefficiency signal, and (c) tracking CLV requires knowing both when the bet was placed and where the line closed.
Key Concepts¶
- Line opening: Initial odds set by the sportsbook, often based on power rankings or previous day lines
- Steam move: Rapid, uniform line movement across multiple books, usually indicating sharp action. Detected by monitoring odds feed for simultaneous changes.
- Reverse line movement: Line moves toward the underdog despite majority of bets being on the favorite. This is considered a strong signal that smart money is on the underdog.
- Public money vs. sharp money: Public bets (recreational) often push lines incorrectly; sharp money is more influential.
- Line capping: Practice of tracking and analyzing line movement to find inefficiencies
- Steam chasing: Following steam moves by betting the same side — considered a reactive strategy, not a predictive one
Steam Move Detection¶
Steam moves are typically detected by monitoring real-time odds feeds and flagging when:
1. Odds move > X% (e.g., 2%) across > Y books (e.g., 3+) simultaneously
2. The move happens within a short time window (< 5 minutes)
import time
from collections import defaultdict
class SteamDetector:
def __init__(self, threshold_pct=0.02, min_books=3, window_seconds=300):
self.threshold_pct = threshold_pct
self.min_books = min_books
self.window = window_seconds
self.odds_history = defaultdict(list) # event_id -> [(timestamp, odds)]
def record_odds(self, event_id, book, odds):
ts = time.time()
self.odds_history[event_id].append((ts, book, odds))
def detect_steam(self, event_id):
"""Detect steam move for an event."""
records = sorted(self.odds_history[event_id], key=lambda x: x[0])
if len(records) < 2:
return False
# Group by time windows
books_at_open = {}
books_moved = {}
for ts, book, odds in records:
if book not in books_at_open:
books_at_open[book] = odds
else:
pct_change = abs(odds - books_at_open[book]) / books_at_open[book]
if pct_change > self.threshold_pct:
books_moved[book] = (books_at_open[book], odds, ts)
# Steam: majority of tracked books moved in same direction
if len(books_moved) >= self.min_books:
direction = sum(1 if new > old else -1 for old, new, _ in books_moved.values())
return abs(direction) == len(books_moved)
return False
def reverse_line_movement(public_bets_pct, line_movement_direction):
"""
Detect reverse line movement.
If public bets 70% on A but line moves toward B, that's RLM.
"""
if public_bets_pct > 0.55 and line_movement_direction < 0:
return "RLM: sharp money on underdog despite public favorite betting"
elif public_bets_pct < 0.45 and line_movement_direction > 0:
return "RLM: sharp money on favorite despite public underdog betting"
return "Normal line movement"
Practical Notes¶
- Steam moves are most informative when they occur on Pinnacle — that's where sharp money is most visible
- For the MVP: The Odds API provides historical line data including opening and closing odds. The pipeline should store these to compute CLV for model validation.
- Reverse line movement is a statistically documented anomaly — but it requires knowing the betting split, which isn't always available from public feeds
- Line movement data is useful for backtesting: if the model predicted an outcome and the line moved toward that outcome before game time, it confirms the market eventually agreed with the model's assessment
- The client uses line movement as part of the daily pipeline data (fetch odds at multiple time points), which enables CLV calculation
Notes¶
- Steam chasing (blindly following steam moves) is not a reliable standalone strategy — by the time a steam move is detectable, the line has already moved and the value may be gone
- The model's value is in predicting BEFORE the steam move, not reacting to it
- World Cup betting: line movement is heavily influenced by public sentiment (many recreational bettors), so reverse line movement signals may be stronger in this context