# Closing Line Value: What It Is and How to Measure It

By Brandon · 2 November 2026

> CLV = your odds vs no-vig closing odds. Beating the close consistently is the best early sign of +EV betting; log bets precisely and judge after 100–500 bets.

## Key takeaways

- Closing line value is the percentage difference between the odds you bet and the no-vig fair closing odds.
- Consistently beating the close is the strongest available early signal that your model finds +EV bets.
- Compute CLV with the formula (your decimal odds / fair closing decimal odds) - 1, after removing the vig from the close.
- CLV carries real signal from about 100 bets and becomes reliable past 500, while win rate and ROI need far larger samples.
- Log timestamp, event ID, market, selection, book, and exact odds at bet time, then fetch the closing snapshot after settlement.

Closing line value (CLV) is the difference between the price you took and the closing line, expressed as a percentage. If you consistently beat the close, the market is telling you your model finds +EV bets before the books adjust, which is the strongest available predictor of long-term profit. This guide walks through a full worked CLV calculation and shows how to pull historical closing lines programmatically so you can build your own tracker.

## What is closing line value in betting?

Closing line value (CLV) is the difference between the odds you took and the odds available at kickoff, when the market has absorbed the sharpest money and the line is at its most efficient. If you bet at +120 and the line closes at +105, you beat the close; if it closes at +135, you lost CLV. Expressed as a percentage, it tells you whether you're getting prices better than the final consensus.

Why it matters: the closing line is widely treated as the sharpest available price, and consistently beating it is a well-documented signal of long-term profit, per [Pinnacle's betting resources](https://www.pinnacle.com/betting-resources). A model that loses CLV on every bet is unlikely to be +EV regardless of short-term results.

For developers, CLV is computable: capture odds at bet time, capture closing odds, compare. PingOdds ([https://pingodds.com/](https://pingodds.com/)) returns per-response freshness metadata so your closing snapshot is genuinely live.

## Why beating the closing line predicts long-term profit

### The closing line as market consensus

By kickoff, a betting line has absorbed the money of sharp bettors, market makers, and every model reacting to news like injuries and lineup changes. That final price is the sharpest available estimate of true probability, which is why books use it as their benchmark. If you consistently get better prices than the close, you are taking positions the market later agrees were underpriced. That is the definition of +EV: positive CLV means your entry beat the consensus, not that you got lucky on one ticket.

### CLV vs. win rate as a performance metric

Win rate over a small sample is noise. A bettor can go 12-8 on a hot streak with negative CLV and still be losing long-term, while a bettor with steady positive CLV can lose for weeks and remain profitable over thousands of bets. CLV is measurable on every single bet immediately, so it works as a feedback loop for your model before variance resolves. Track it continuously: pull open and closing prices for each market you bet, compute the delta, and watch the trend. Streaming feeds make this practical, since you can snapshot lines the moment you bet and again at close ([https://pingodds.com/docs/streaming](https://pingodds.com/docs/streaming)).

## Closing line value example: full worked calculation

### Step 1: record the odds you bet

Say an NBA total opens at o210 (-110) / u210 (-110) and you bet the over at -110, decimal 1.909, in American format. Hours later the line closes at o210 (-120) / u210 (+100). The market moved toward the over, which is the direction that matters for your CLV.

### Step 2: convert the closing line to no-vig fair odds

The closing prices carry vig, so strip it before comparing. Convert each side to implied probability (-120 → 120/220 = 54.55%, +100 → 100/200 = 50.00%), sum them (104.55%), and divide each side by that sum to get fair probabilities: 52.15% for the over, 47.85% for the under. This overround-removal method is standard practice, and [Pinnacle's betting resources](https://www.pinnacle.com/en/betting-resources/) document the same margin-removal logic in their guides to odds and pricing. Fair decimal odds for the under are 1 / 0.4785 = 2.090, and the fair price for the over is 1 / 0.5215 = 1.918.

### Step 3: compute CLV as a percentage

CLV = (your decimal odds / fair closing decimal odds) − 1. You took the over at 1.909 against a fair close of 1.918: 1.909 / 1.918 − 1 = −0.47%. You lost this one, narrowly, because -110 on a -110/-110 open is exactly fair and the close moved slightly past you.

### Interpreting the result

A negative number here does not mean the bet was bad; it means you got no edge relative to where sharp money pushed the line. Flip the example: bet the under at +105 (2.05) before the move, against that same fair close of 2.090 for the under, and your CLV is 2.05 / 2.090 − 1 = −1.9%, still negative because the market closed toward the over. Now imagine you had taken the over at +100 (2.00) early: 2.00 / 1.918 − 1 = +4.3%. That is the number a tracker should log on every bet, and it is exactly the per-response freshness metadata PingOdds is built around, so your script knows the close timestamp it is comparing against. Plans and credit limits are at [PingOdds pricing](https://pingodds.com/pricing).

## How to build a closing line value calculator

Three pieces: odds conversion, vig removal, and the CLV formula. All fit in \~30 lines of Python.

### Odds conversion formulas

American to decimal: if odds are positive, `decimal = (american / 100) + 1`. If negative, `decimal = (100 / abs(american)) + 1`. So +150 becomes 2.50 and -110 becomes 1.9091.

To de-vig a two-way market, convert both sides to implied probability (`1 / decimal`), sum them, then divide each side by the sum. For -110/-110, the raw sum is 1.0909, so the no-vig fair probability for each side is 0.5, giving a fair decimal price of 2.00.

### CLV formula in code

CLV compares the price you bet to the closing no-vig fair price:

```python
def clv(bet_american, close_american):
    bet = american_to_decimal(bet_american)
    close = american_to_decimal(close_american)
    return (bet / close - 1) * 100

```

Bet Lakers +150, they close at +130 (2.50 vs 2.30): `(2.50 / 2.30 - 1) * 100 = +8.7%` CLV. For de-vigged closes, pass the fair decimal price instead of the raw closing odds.

If you're running this against a live feed, PingOdds' freshness metadata ([docs](https://pingodds.com/docs/mcp)) tells you whether your "closing" snapshot is actually current, so stale cache doesn't fake a positive CLV.

## Pulling historical closing lines programmatically via an odds API

### What to log at bet time

Store the timestamp, event ID, market, selection, and the exact decimal odds you took, plus the book. A bet logged as "Lakers -4.5 at 1.91, DraftKings, 2024-11-12T19:42Z" is reproducible; "took -4.5 Tuesday" is not. Without the precise price and time, your CLV is an estimate, not a measurement.

### Fetching closing lines after the game

Once the event settles, query the same event and market for the closing snapshot and compute `CLV = (your_decimal_odds / closing_decimal_odds) - 1`. The [Odds API documentation](https://the-odds-api.com/docs/) describes historical odds endpoints that return snapshots from a requested timestamp, so you can pull the pre-game market state nearest kickoff rather than reconstructing it from memory. Batch this nightly: one job fetches closes for every unsettled bet in your log and appends results to a CSV or SQLite table.

### Freshness metadata: why cached closes corrupt CLV

If your API serves a cached response as "live," you might compare your price against a line that moved hours after you bet, inflating or deflating CLV silently. Check per-response timestamps before trusting a close: if the snapshot is older than kickoff minus your bet time window, flag it. This is why PingOdds ships freshness metadata with every response, so a stale cached line can never pass for live. We are honest about the gap: we do not yet expose deep historical archives the way some incumbents do, so for old events you may still need to have logged closes yourself.

Track data quality alongside CLV. A tracker fed by unverifiable snapshots measures nothing.

## What counts as good CLV in sports betting?

Any positive closing line value is a good sign: it means you beat the market's last price, and the closing line is the sharpest number available. Sustained positive CLV of even 1-2% per bet is meaningful over hundreds of wagers. Negative CLV means the market moved against you after you bet, which usually predicts losses regardless of short-term results.

Sample size decides whether your CLV number means anything. A handful of bets tells you nothing, because one steam move can swing the average. With 100+ bets your CLV starts to carry signal, and past 500 it becomes a reliable read on whether your model finds +EV spots or is just guessing well.

## CLV vs. other metrics: how to judge your betting model

CLV is the fastest signal you have, but it is not the only one. ROI and win rate are lagging: they only stabilize after hundreds of bets, because short-run variance swamps edge. The law of large numbers is why a model with real +EV can look terrible for a month ([law of large numbers](https://en.wikipedia.org/wiki/Law_of_large_numbers)).


| Metric      | What it measures                         | Lag                           |
| ----------- | ---------------------------------------- | ----------------------------- |
| CLV         | Whether your price beat the closing line | Immediate, per bet            |
| ROI         | Actual profit per unit staked            | Slow, needs large samples     |
| Win rate    | Frequency of winners                     | Misleading alone; odds matter |
| Calibration | Predicted probabilities vs. outcomes     | Medium, needs bucketed data   |


Track CLV for fast feedback, calibration for model quality, and ROI as the confirmation that arrives later.

## Common mistakes when measuring closing line value

Four errors skew CLV readings. First, comparing against a viggy close: if the closing line carries 4-5% hold, your no-vig fair price differs from the book's raw number, so calculate CLV against de-vigged odds or you'll overstate edge. Second, using the wrong book's close: if you bet a soft book's opener, compare to that market's close, not a sharp book like Pinnacle you didn't have access to, or you're measuring availability, not skill. Third, ignoring sport-specific line movement: NFL closes move less than NBA or soccer, so a flat CLV target across sports misreads performance. Fourth, small samples: 20 bets tell you almost nothing; CLV variance is high, and you need hundreds of bets before the number means anything. Track all four in your tracker or its output misleads you.

## FAQ

### Is positive CLV guaranteed to make money?

No. Positive CLV is a strong statistical signal, not a promise. It shows you're getting prices better than the final consensus, which correlates with long-term profit, but individual bets can still lose and short samples can go either way. Treat sustained positive CLV as evidence your model finds +EV spots, and use ROI over large samples as confirmation.

### How many bets do I need before my CLV number means anything?

Around 100 bets is where CLV starts to carry real signal, since a single steam move can distort a smaller sample. Past 500 bets, the average becomes a reliable read on whether your model beats the market or is just getting lucky. Below roughly 20 bets, the number tells you almost nothing.

### Can I calculate closing line value for player props, or only main lines?

You can calculate it for any market where you can capture both your bet price and a closing price, including player props. The same formula applies: your decimal odds divided by the no-vig fair closing odds, minus one. Props close less efficiently than main lines in some cases, so interpret prop CLV with slightly more caution.

### What's the difference between CLV and MCLV (median closing line value)?

CLV per bet is the individual comparison of your price to the close; MCLV is the median of those values across a set of bets. Using the median instead of the mean reduces the distortion from outliers, like one bet that caught a massive line move. A tracker reporting MCLV gives a more stable picture of typical performance.

---

Source: https://pingodds.com/blog/closing-line-value-what-it-is-and-how-to-measure-it
