Feed liveChannel BlogSports 12
Transport MQTT / SSE / RESTPush 100–500 msV1
Guides

What Is Closing Line Value (CLV)? A Bettor's Guide

Closing line value (CLV) is the gap between your bet price and the sharp no-vig close. Here's the formula, a worked example, and how to log it in code.

Closing line value is the gap between the price you bet and the price that same market closed at, measured against a sharp book. You take +150, the market settles at +130, you have positive CLV — you bought something cheaper than the market's final assessment of its worth. That's the entire concept. Everything after this is measurement discipline, and measurement discipline is where nearly everyone gets it wrong.

The short definition

CLV compares exactly two numbers: your entry price, and the closing price of the identical market at a book whose close you trust. The closing line earns that trust because it's the price that survived every injury report, every lineup leak and every dollar of informed money right up to kickoff. It is the market's last and best guess.

In decimal odds:

clv = (your_decimal_odds / closing_no_vig_decimal) - 1

Two details in that expression carry all the weight. Decimal odds, because American odds don't divide cleanly. And closing_no_vig_decimal — you must strip the bookmaker's margin out of the closing price before comparing, or you'll congratulate yourself for beating a line you merely matched.

Worked example, because the arithmetic is where people quietly cheat.

You bet Over 2.5 goals at 2.05. At close the market shows Over 2.5 at 1.95, Under 2.5 at 1.93. Implied probabilities: 1/1.95 = 0.5128 and 1/1.93 = 0.5181. They sum to 1.0309, so there's a 3.09% overround sitting in there. Normalise: fair Over probability is 0.5128 / 1.0309 = 0.4974, which is a no-vig price of 2.0105. Your CLV is 2.05 / 2.0105 − 1 = +1.96%.

You captured roughly two points of expected value on that bet. Whether it won or lost is irrelevant to that number, and that's the part people can't internalise: CLV is a property of the transaction, not the outcome.

CLV is not expected value, and it is not line movement

These three get blended together in forum posts constantly, and the confusion is expensive.

Expected value is your edge against the true probability. CLV is your edge against the closing market's estimate of the true probability. They coincide only if the closing line is perfectly efficient, which it isn't — but on liquid soccer, tennis and NBA markets it's close enough that using it as a proxy is the single most useful habit a bettor can build. A sharp close in a deep market is one of the best publicly available probability estimates for anything, full stop.

So the distinction reduces to:

  • Positive CLV means you're finding prices before the market corrects them.
  • Positive EV means you're actually right about probabilities.

You can have the second without the first. Original modelling on an illiquid market that never gets efficiently priced is a real thing. But if you're claiming positive EV and negative CLV on top-flight soccer or NBA sides, the boring explanation is almost always the correct one: your model is worse than the market and your P&L is noise.

CLV also isn't "the line moved my way." Movement in your favour is necessary, not sufficient. If a line drifts your way and then drifts back before kickoff, you didn't beat the close. Only the closing number counts, which is why a CLV log needs a snapshot policy, not a vibe.

Why it matters: convergence

Here's the whole argument for tracking CLV, and it's statistical rather than philosophical.

Say you have a genuine 2% edge on near-even-money markets. Your standard deviation per bet is roughly one unit. Distinguishing a 2% edge from zero with any confidence takes thousands of settled bets — years, for most people betting at human volume. CLV, meanwhile, is measurable on every single bet with zero variance contributed by the result. A hundred bets at a consistent +1.5% CLV is already signal. A hundred bets of results is an anecdote.

That's the fast feedback loop. It lets you answer questions while the answers are still actionable:

  • Has the market caught up to this model, or is it still working?
  • Which leagues am I genuinely beating, and which am I break-even on?
  • Am I sharper an hour before kickoff or two days out?
  • Is my bet placement slow enough that I'm systematically losing the price I modelled?

Given a choice, I'd read a bettor's CLV distribution over their P&L curve every time. The P&L tells me what happened. The CLV tells me what's going to happen.

The honest caveats

CLV gets treated as gospel and it shouldn't be.

The choice of book does all the work. Beating a recreational book's close means close to nothing — those lines are shaded toward public bias and shaded again to protect the book. Beating a low-margin, high-limit close is the claim with content. Compute CLV against a soft book and you're mostly measuring how soft that book is.

Positive CLV does not pay rent. You can post excellent CLV and lose money for a long stretch. You can post excellent CLV and get limited to $20 stakes by week three, at which point the edge is arithmetically worthless. CLV measures price quality. It says nothing about liquidity, staking, correlation between your bets, or whether you can get money down at all.

It breaks in thin markets. Obscure props, fourth-tier leagues and season futures don't have efficient closes. A closing line built on almost no money isn't a probability estimate, it's a guess with a timestamp. Treat CLV from those markets as decoration.

Late steam contaminates small samples. You bet an hour out, a lineup bombshell lands at minus-ten-minutes, and the close reflects information you could not have had. Over thousands of bets this washes out. Over fifty it can flatter or wreck you.

Suspended and voided markets create survivorship bias. When a market never closes cleanly — pulled for a lineup issue, suspended and reopened at a different number — you have no honest closing price. Silently dropping those from the log biases the result, and in my experience it biases it in your favour.

One caveat specific to us: pinnodds has no historical odds archive. We push live and prematch prices in real time; there is no endpoint that hands you last month's closes. If you want CLV analysis, you capture and store the closing snapshots yourself as they arrive. That's a real limitation, not a hidden feature, and you should plan storage before you plan strategy.

How to capture closing lines in code

The mechanism is unglamorous: subscribe to the market, keep overwriting the last-seen price, freeze it when the market stops trading. Because the feed is pushed rather than polled, the last message you receive before suspension is your closing snapshot. You never have to guess the right polling moment, which removes the single largest source of error in a homegrown CLV log.

Sketch with the Python SDK (pip install pinnodds):

import os, time
from pinnodds import Client

client = Client(api_key=os.environ["PINNODDS_API_KEY"])

closing = {}  # (event_id, market, period, handicap, side) -> snapshot

def snapshot(event, market):
    for line in market.get("lines", []):
        key = (
            event["id"],
            market["type"],
            market.get("period"),
            line.get("handicap"),
            line.get("side"),
        )
        closing[key] = {
            "price": line["price"],
            "nvp": line.get("nvp"),      # no-vig fair price -> use this for CLV
            "limit": line.get("limit"),  # Pinnacle max stake -> confidence signal
            "seen_at": time.time(),
        }

fixtures = client.prematch_fixtures(sport="soccer")
for fx in fixtures["events"]:
    markets = client.prematch_markets(event_id=fx["id"])
    for m in markets["markets"]:
        snapshot(fx, m)

That REST pass over /kit/v1/prematch/fixtures and /kit/v1/prematch/markets gives you a coarse close. For the real one, stay on the push feed: connect to /ws/feed, hold the last message per market key, and write it down the instant the market suspends. Field reference is in the docs.

Two fields there are doing the heavy lifting.

nvp is the no-vig fair price, and it's what you should store as your closing reference. It saves you the margin-stripping arithmetic and it eliminates an entire bug class — comparing a vigged price against a vigged price computed on different market widths, which produces numbers that look plausible and are simply wrong.

limit is Pinnacle's max stake, and it's the confidence signal nobody uses enough. A close carrying a large limit is a price the book is happy to be held to at size. A tiny limit on an exotic prop means treat that close with suspicion. Bucket your CLV analysis by limit and you will usually discover the "edge" in the low-limit bucket is fiction.

One more depth point that matters specifically for CLV: every line Pinnacle prices comes through, quarter lines included — soccer totals at 1.75 / 2.25 / 2.75 / 3.25 and quarter-ball handicaps at −0.75 / −1.25 / −1.75 / −2.25. If you bet Over 2.25 and your closing store only holds Over 2.5, your comparison is off by a meaningful fraction of a goal, in a direction you can't predict.

Line matching is where most CLV logs actually break

Bad CLV numbers are a join problem far more often than a maths problem. The recurring failures:

  • Comparing your 2.25 total against a 2.5 close because the store only kept half-goal lines.
  • Comparing a first-half market against a full-match close.
  • Comparing an alternative handicap at −1.25 against the main line at −1.5 with no adjustment.
  • Timezone drift quietly shifting which snapshot counts as "closing".

Key the store on the full tuple — event id, market type, period, handicap value, side — and refuse to compute CLV when the exact key is missing. A None is more honest than a fudged comparison. Every serious CLV log I've worked with has an unmatched counter, and it is never zero. If yours is zero, you're interpolating somewhere and you haven't noticed.

What good CLV looks like

Rough calibration, from what survives in these markets rather than from theory. Consistent CLV above +2% on liquid markets at real limits is a strong operation. Around +1% is a real edge, but one that needs volume and low friction to be worth the effort. If you're computing +8% on major markets, check your no-vig arithmetic and your line matching before you check your bankroll — that number is a bug far more often than it's an edge.

Track the distribution, not the mean. A mean of +1.5% built from a few enormous hits and a long tail of small negatives is a stale-line scalper. A tight cluster around +1.5% is a model. Those two things degrade differently, need different bankroll treatment, and get limited by books at different speeds.

Takeaway

Log CLV against a sharp no-vig close, keyed on the exact line you bet, bucketed by the limit that line carried — and read it before you read your P&L. Store the closes yourself as they push through, because nobody is going to hand you history. If you're wiring that up, the pinnodds feed pushes live and prematch Pinnacle prices over WebSocket with nvp and limit on every line, quarter lines included, and a free trial key takes seconds at /#pricing.

Frequently asked questions

What is closing line value in betting?

Closing line value (CLV) is the difference between the odds you bet and the odds that same market closed at, measured against a sharp book's no-vig closing price. Positive CLV means you got a better price than the market's final estimate of fair value, regardless of whether the bet won.

How do you calculate CLV?

In decimal odds, clv = (your_odds / closing_no_vig_odds) - 1. Strip the bookmaker margin from the closing two-way market first: divide each implied probability by the sum of both, then invert to get the fair price.

Is positive CLV enough to guarantee profit?

No. CLV measures price quality only — you can post strong CLV and still lose money over a long stretch, or get your account limited to stakes so small the edge is worthless. It says nothing about liquidity, staking or your ability to get money down.

Does pinnodds provide historical closing odds for CLV analysis?

No. pinnodds pushes live and prematch prices in real time and has no historical odds archive, so you capture and store closing snapshots yourself as they arrive. Staying on the /ws/feed push stream means the last message before a market suspends is your closing snapshot.

What is the difference between CLV and expected value?

Expected value is your edge against the true probability; CLV is your edge against the closing market's estimate of that probability. They only coincide if the closing line is perfectly efficient, but on liquid markets it is close enough to be the most practical proxy available.

Get real-time Pinnacle odds in your code

Live & prematch markets with instant odds-drop alerts over SSE and WebSocket. Free trial key in seconds — no card.

Start free trial