apinn.io
← All articles
Measurement7 min read

CLV: the only metric that says anything before 1,000 bets

Your ROI over 200 bets proves nothing. Your gap to the closing line does β€” provided you measure it properly.

A bettor up 8% ROI over 200 bets and a bettor down 3% over the same 200 bets can have exactly the same edge. At that sample size, variance dominates everything. That is the central problem of sports betting: the signal you want to measure is far smaller than the noise around it.

Closing line value (CLV) sidesteps the problem. Instead of waiting for results to converge, it measures whether you took a better price than the market at its close β€” the moment the market is best informed.

The formula

CLV = (price taken / closing price βˆ’ 1) Γ— 100. You bet a moneyline at 2.10 and it closes at 2.00: your CLV is +5%. You bought something the market later repriced in your favour.

def clv_pct(bet_price: float, closing_price: float) -> float:
    return (bet_price / closing_price - 1) * 100

clv_pct(2.10, 2.00)   # +5.00 %
clv_pct(1.90, 2.00)   # -5.00 %

A positive, stable average CLV over a few hundred bets is a far more reliable edge indicator than a positive ROI over the same sample. It converges faster because it does not depend on how the game ended.

Closing against what? (this is where it is won or lost)

CLV measured against a soft book's close is worthless: that book simply follows, late and with a fat margin. Your reference has to be a book that makes the market β€” which is why the Pinnacle close is the de facto standard, both in the literature and among serious bettors.

  • Use the close of the same market, same period and the SAME line. A βˆ’0.5 handicap and a βˆ’1 are not comparable.
  • Either devig both sides or neither β€” but keep one rule. Comparing a raw price taken against a devigged close manufactures an artificial negative CLV of roughly half the overround.
  • Use the last price before kick-off, not the price "around game time". Lines still move a lot in the final ten minutes.

Classic trap: measuring CLV against the close of the book you bet at. If you bet a soft book that closes wide, your CLV will look excellent when all you did was take a less bad price than another bad price.

What CLV does not tell you

CLV measures the quality of your prices, not your profitability. Three gaps show up routinely between good CLV and a growing account:

  1. Limits: +4% CLV on €20 stakes the book will not let you scale to €200 does not pay the bills.
  2. Selection: if you only bet when the price is still open, you are harvesting CLV on the least liquid markets β€” exactly where the close itself is least reliable.
  3. Vig paid: a gross CLV of +3% at a book charging 6% margin can still be a real net loss.

Conversely, persistently negative CLV alongside positive ROI is an alarm, not a success: you got lucky, and the market is telling you your prices were bad.

Automating it

The painful part is not the formula, it is having the right close for the right line months later. That is exactly what apinn's CLV endpoint is for: hand it the bet, it finds the matching closing line and returns the gap.

curl -H "X-API-Key: $APINN_KEY" \
  "https://api.apinn.io/api/clv?event_id=1610000123\
&market=moneyline&period=0&selection=home&bet_price=2.10"

# β†’ { "bet_price": 2.10, "closing_price": 2.0, "clv_pct": 5.0, ... }

For a full retrospective audit, the opening and closing endpoints give you both ends of the move, line by line. That pair is also the simplest way to spot markets where your entry timing, rather than your model, is driving your results.

Beating the close does not guarantee you win. Not beating it pretty much guarantees you lose, given a long enough horizon.

Run this maths on real data

Real-time Pinnacle odds with fair odds included, plus opening and closing history β€” self-serve access, API key in minutes.