0/70 completed
Metrics & Evaluation Interactive

Closing Line Value (CLV)

Measure betting skill by comparing your bet price to the closing line. Positive CLV = you're beating the market. The #1 predictor of long-term success.

๐Ÿ“Š What is CLV?

CLV = Closing Prob - Opening Prob

If you bet at -110 and the line closes at -115, you got a better price. The market moved to confirm your bet was sharp.

  • โ€ข Positive CLV = you bet before the line moved your way
  • โ€ข Negative CLV = line moved against you
  • โ€ข Consistent +CLV = sharp bettor

Why CLV Matters

  • โ€ข Predictive: +CLV bettors profit long-term
  • โ€ข Immediate: Don't need outcome to measure
  • โ€ข Skill signal: Better than win rate
  • โ€ข Detection: Books use CLV to identify sharps

Your Bet

Opening Line (when you bet) -110
-200 200
Closing Line -115
-200 200
Bet Size ($) 110
50 1000

๐Ÿ“Š CLV Analysis

Opening Implied 52.4%
Closing Implied 53.5%
CLV +1.11%
Dollar Value +$1.22
Winning: Positive edge detected

Cumulative CLV (50 Bets)

Upward trend = you're consistently getting better prices than the market.

CLV Benchmarks

<-2%
Square
-2 to 0
Losing
~0%
Neutral
0 to 2
Winning
>2%
Sharp

๐Ÿ’ก Practical Applications

For Bettors

  • โ†’ Track CLV for every bet, not just outcomes
  • โ†’ Bet early when you have information edge
  • โ†’ Consistent +CLV matters more than win rate

For Books

  • โ†’ CLV is the #1 sharp detection metric
  • โ†’ +2% CLV over 100+ bets = definitely sharp
  • โ†’ Use CLV to set limits and move lines

R Code Equivalent

# Calculate CLV
american_to_prob <- function(odds) { 
  if (odds < 0) return(-odds / (-odds + 100))
  return(100 / (odds + 100))
}

calculate_clv <- function(opening, closing) { 
  open_prob <- american_to_prob(opening)
  close_prob <- american_to_prob(closing)
  clv <- (close_prob - open_prob) * 100
  return(clv)
}

# Track bettor CLV
bettor_clv_analysis <- function(bets) { 
  bets$clv <- mapply(calculate_clv, bets$opening, bets$closing)
  
  list(
    avg_clv = mean(bets$clv),
    total_clv = sum(bets$clv),
    positive_rate = mean(bets$clv > 0),
    classification = ifelse(mean(bets$clv) > 2, "Sharp", 
                           ifelse(mean(bets$clv) > 0, "Winning", "Square"))
  )
}

# Example
clv <- calculate_clv(-110, -115)
cat(sprintf("CLV: %+.2f%%\n", clv))

โœ… Key Takeaways

  • โ€ข CLV = Closing prob - Opening prob
  • โ€ข Positive CLV = you beat the closing line
  • โ€ข Best predictor of long-term betting success
  • โ€ข +2% avg CLV = sharp bettor
  • โ€ข Track CLV, not just win/loss
  • โ€ข Books use CLV to identify sharps

Pricing Models & Frameworks Tutorial

Built for mastery ยท Interactive learning