> "In the short run, the market is a voting machine, but in the long run, it is a weighing machine."
Learning Objectives
- Calculate the expected value of any sports bet given estimated probabilities and offered odds
- Identify positive expected value (+EV) opportunities by comparing personal probability estimates to market-implied probabilities
- Apply the Law of Large Numbers to understand why long-run thinking is essential for profitable betting
- Quantify edge, yield, and ROI to evaluate betting performance over time
- Recognize the limitations of expected value analysis and understand how variance and utility theory affect practical decision-making
In This Chapter
Chapter 3: Expected Value and the Bettor's Edge
"In the short run, the market is a voting machine, but in the long run, it is a weighing machine." --- Benjamin Graham, Security Analysis (1934)
Graham was speaking about stock markets, but the principle applies with equal force to sports betting markets. In the short run, a single bet is resolved by the unpredictable outcome of a sporting event. In the long run, however, the mathematics of expected value determines who profits and who does not. This chapter introduces the single most important concept in all of quantitative sports betting: expected value. Master this concept, and every other idea in this book becomes a variation on a theme. Fail to internalize it, and no amount of sophisticated modeling will save you.
Chapter Overview
In Chapter 1, we surveyed the landscape of sports betting---the market types, the participants, and the structure of the industry. In Chapter 2, we built the mathematical toolkit of probability and odds conversion that allows us to speak precisely about uncertain events. Now we bring those two threads together. Expected value is the bridge between understanding what odds mean and knowing whether a bet is worth making.
This chapter answers the question that every serious bettor must confront: "Given what I believe about the probability of an outcome and the price the market is offering, should I place this bet?" The answer is always and only a function of expected value.
We will begin with the formal definition and simple examples, then develop the machinery for identifying positive expected value opportunities systematically. We will explore why the Law of Large Numbers makes expected value the only rational basis for betting decisions, learn to quantify and track our edge over time, and finally confront the limitations of expected value analysis when variance and human psychology enter the picture.
By the end of this chapter, you will think about every bet---whether it is a moneyline wager on an NFL game, a spread bet on an NBA contest, or a prop bet on a player's performance---through the lens of expected value. This mental shift is what separates recreational bettors from quantitative ones.
3.1 What Is Expected Value?
The Formal Definition
Expected value is the probability-weighted average of all possible outcomes of a random variable. If a random variable $X$ can take on values $x_1, x_2, \ldots, x_n$ with corresponding probabilities $p_1, p_2, \ldots, p_n$, then its expected value is:
$$E[X] = \sum_{i=1}^{n} p_i \cdot x_i = p_1 x_1 + p_2 x_2 + \cdots + p_n x_n$$
In plain language, expected value tells you what you would earn (or lose) on average per trial if you could repeat the same bet an infinite number of times under identical conditions. It is not a prediction about any single outcome. It is a statement about the long-run average.
Definition: Expected Value (EV)
The expected value of a bet is the sum of each possible outcome multiplied by the probability of that outcome occurring. A positive expected value (+EV) means the bet is profitable in the long run; a negative expected value (-EV) means it is unprofitable.
A Simple Coin Flip: The Intuitive Foundation
Before we tackle sports bets, let us build intuition with the simplest possible example.
Scenario. A friend offers you a bet on a fair coin flip. If the coin lands heads, you win \$120. If it lands tails, you lose \$100. Should you take this bet?
Your two possible outcomes are:
| Outcome | Probability | Payoff |
|---|---|---|
| Heads (win) | 0.50 | +\$120 |
| Tails (lose) | 0.50 | -\$100 |
Applying the expected value formula:
$$E[X] = (0.50)(+120) + (0.50)(-100) = 60 - 50 = +\$10$$
The expected value is +\$10. This means that if you made this exact bet thousands of times, you would earn an average of \$10 per bet. You should absolutely take this bet.
Now consider a slight modification. Your friend changes the terms: heads pays \$90, tails costs \$100.
$$E[X] = (0.50)(+90) + (0.50)(-100) = 45 - 50 = -\$5$$
The expected value is -\$5. On average, you lose \$5 every time you play. You should decline. The power of expected value is that it gives you a single number that captures whether a bet is favorable or not, regardless of how the payoffs are structured.
Expected Value of a Sports Bet
Now let us apply this to a real sports betting context. In a sports bet, there are typically two outcomes: you win or you lose. (We will ignore pushes for simplicity; they can be incorporated as a third outcome with a payoff of zero.)
For a bet with stake $S$, decimal odds $d$, and your estimated probability of winning $p$:
- If you win (probability $p$): your profit is $S \cdot (d - 1)$
- If you lose (probability $1 - p$): your loss is $-S$
Therefore:
$$E[X] = p \cdot S \cdot (d - 1) + (1 - p) \cdot (-S)$$
$$E[X] = S \cdot [p \cdot (d - 1) - (1 - p)]$$
$$E[X] = S \cdot [p \cdot d - 1]$$
This simplification is enormously useful. The expected value of any bet, per dollar wagered, reduces to:
$$\frac{E[X]}{S} = p \cdot d - 1$$
This expression---your estimated probability times the decimal odds, minus one---is what we call the edge. If the edge is positive, the bet has positive expected value. If it is negative, the bet has negative expected value.
Key Insight: The Core Formula of Sports Betting
$$\text{Edge} = p \cdot d - 1$$
where $p$ is your estimated true probability and $d$ is the decimal odds offered. This single formula is the foundation upon which the entire enterprise of profitable sports betting is built.
Worked Example 1: Moneyline Bet on an NFL Game
Scenario. The Buffalo Bills are playing the Miami Dolphins. A sportsbook offers the Bills at American odds of -150. After careful analysis (using the methods we will develop in later chapters), you estimate the Bills have a 65% chance of winning.
Step 1: Convert American odds to decimal odds.
Recall from Chapter 2 that for negative American odds:
$$d = 1 + \frac{100}{|\text{American odds}|} = 1 + \frac{100}{150} = 1.667$$
Step 2: Determine the implied probability.
The market's implied probability (before removing the vig) is:
$$p_{\text{implied}} = \frac{|\text{American odds}|}{|\text{American odds}| + 100} = \frac{150}{150 + 100} = 0.600$$
Step 3: Calculate your edge.
$$\text{Edge} = p \cdot d - 1 = 0.65 \times 1.667 - 1 = 1.0833 - 1 = +0.0833$$
Step 4: Interpret the result.
Your edge is +8.33%. For every dollar you wager on this bet, you expect to earn 8.33 cents in profit on average. If you bet \$100, the expected value is +\$8.33.
This is a strongly positive expected value bet. Your estimated probability (65%) exceeds the market's implied probability (60%), and the gap is large enough to generate a meaningful edge even after accounting for the vig.
Worked Example 2: Spread Bet on an NBA Game
Scenario. The Boston Celtics are -4.5 against the New York Knicks. The spread is offered at standard -110 juice on both sides. You believe the Celtics have a 55% chance of covering the 4.5-point spread.
Step 1: Convert -110 American odds to decimal.
$$d = 1 + \frac{100}{110} = 1.909$$
Step 2: Market implied probability.
$$p_{\text{implied}} = \frac{110}{110 + 100} = 0.5238$$
Note that both sides are priced at -110, so the market implies each side has a 52.38% chance. The probabilities sum to 104.76% rather than 100%---this excess is the vigorish, as we discussed in Chapter 2.
Step 3: Calculate your edge.
$$\text{Edge} = 0.55 \times 1.909 - 1 = 1.050 - 1 = +0.050$$
Step 4: Interpret.
Your edge is +5.0%. For every \$100 wagered, you expect \$5.00 in profit on average. This is a solid positive EV opportunity.
Positive EV vs. Negative EV: The House Edge
Every bet offered by a sportsbook is designed to be negative EV for the average bettor. The sportsbook achieves this by building a margin (the vig or juice) into the odds. Let us see exactly how this works.
Example. Consider a game where the true probability of each side winning is exactly 50%. A fair bet would be offered at +100 (even money, or 2.000 decimal) on both sides. Instead, a typical sportsbook prices both sides at -110.
For the bettor wagering on either side at -110 with a true win probability of 50%:
$$\text{Edge} = 0.50 \times 1.909 - 1 = 0.9545 - 1 = -0.0455$$
The bettor's expected value is -4.55% per dollar wagered. This is the house edge---the mathematical advantage the sportsbook holds. It is extracted through the vig. No matter which side the public bets, the house expects to profit approximately 4.55 cents on every dollar wagered.
Warning: The Vig Is Always Working Against You
Standard -110/-110 juice creates an approximate 4.55% house edge. This means that to be profitable, you must identify bets where your estimated probability exceeds the market's implied probability by more than the vig. Being right 52% of the time on -110 bets is not enough---you need approximately 52.38% or better just to break even.
The Break-Even Win Rate
A useful calculation is the break-even win rate---the minimum win probability needed to have zero expected value at given odds.
Setting $E[X] = 0$:
$$p \cdot d - 1 = 0$$
$$p_{\text{break-even}} = \frac{1}{d}$$
At -110 (decimal 1.909): $p_{\text{break-even}} = 1 / 1.909 = 0.5238$, or 52.38%.
At -200 (decimal 1.500): $p_{\text{break-even}} = 1 / 1.500 = 0.6667$, or 66.67%.
At +200 (decimal 3.000): $p_{\text{break-even}} = 1 / 3.000 = 0.3333$, or 33.33%.
Python Code: Expected Value Calculator
Let us formalize our calculations in code. The following function computes the expected value, edge, and break-even probability for any bet.
"""Expected value calculator for sports bets."""
from typing import NamedTuple
class EVResult(NamedTuple):
"""Container for expected value calculation results."""
edge: float
ev_per_unit: float
ev_for_stake: float
break_even_prob: float
implied_prob: float
is_positive_ev: bool
def american_to_decimal(american_odds: int) -> float:
"""Convert American odds to decimal odds.
Args:
american_odds: American odds (e.g., -110, +150).
Returns:
Decimal odds equivalent.
"""
if american_odds > 0:
return 1 + american_odds / 100
else:
return 1 + 100 / abs(american_odds)
def implied_probability(american_odds: int) -> float:
"""Calculate the implied probability from American odds.
Args:
american_odds: American odds (e.g., -110, +150).
Returns:
Implied probability as a decimal between 0 and 1.
"""
if american_odds > 0:
return 100 / (american_odds + 100)
else:
return abs(american_odds) / (abs(american_odds) + 100)
def calculate_ev(
estimated_prob: float,
american_odds: int,
stake: float = 100.0
) -> EVResult:
"""Calculate expected value and edge for a sports bet.
Args:
estimated_prob: Your estimated probability of winning (0 to 1).
american_odds: The American odds offered by the sportsbook.
stake: The amount wagered in dollars.
Returns:
EVResult with edge, EV, and related metrics.
Raises:
ValueError: If estimated_prob is not between 0 and 1.
"""
if not 0 < estimated_prob < 1:
raise ValueError(
f"Probability must be between 0 and 1, got {estimated_prob}"
)
decimal_odds = american_to_decimal(american_odds)
imp_prob = implied_probability(american_odds)
edge = estimated_prob * decimal_odds - 1
ev_per_unit = edge # EV per dollar wagered
ev_for_stake = edge * stake
break_even = 1 / decimal_odds
return EVResult(
edge=edge,
ev_per_unit=ev_per_unit,
ev_for_stake=ev_for_stake,
break_even_prob=break_even,
implied_prob=imp_prob,
is_positive_ev=edge > 0,
)
# --- Demonstrations ---
# Example 1: Bills moneyline at -150, estimated 65% win probability
result = calculate_ev(estimated_prob=0.65, american_odds=-150, stake=100)
print("=== Bills Moneyline (-150) ===")
print(f" Implied probability: {result.implied_prob:.2%}")
print(f" Your probability: 65.00%")
print(f" Edge: {result.edge:+.4f} ({result.edge:+.2%})")
print(f" EV on $100 bet: ${result.ev_for_stake:+.2f}")
print(f" Break-even prob: {result.break_even_prob:.2%}")
print(f" Positive EV: {result.is_positive_ev}")
print()
# Example 2: Underdog at +200, estimated 38% win probability
result2 = calculate_ev(estimated_prob=0.38, american_odds=200, stake=100)
print("=== Underdog (+200) ===")
print(f" Implied probability: {result2.implied_prob:.2%}")
print(f" Your probability: 38.00%")
print(f" Edge: {result2.edge:+.4f} ({result2.edge:+.2%})")
print(f" EV on $100 bet: ${result2.ev_for_stake:+.2f}")
print(f" Break-even prob: {result2.break_even_prob:.2%}")
print(f" Positive EV: {result2.is_positive_ev}")
print()
# Example 3: Standard spread bet at -110, estimated 53% probability
result3 = calculate_ev(estimated_prob=0.53, american_odds=-110, stake=100)
print("=== Spread Bet (-110) ===")
print(f" Implied probability: {result3.implied_prob:.2%}")
print(f" Your probability: 53.00%")
print(f" Edge: {result3.edge:+.4f} ({result3.edge:+.2%})")
print(f" EV on $100 bet: ${result3.ev_for_stake:+.2f}")
print(f" Break-even prob: {result3.break_even_prob:.2%}")
print(f" Positive EV: {result3.is_positive_ev}")
Running this code produces:
=== Bills Moneyline (-150) ===
Implied probability: 60.00%
Your probability: 65.00%
Edge: +0.0833 (+8.33%)
EV on $100 bet: $+8.33
Break-even prob: 60.00%
Positive EV: True
=== Underdog (+200) ===
Implied probability: 33.33%
Your probability: 38.00%
Edge: +0.1400 (+14.00%)
EV on $100 bet: $+14.00
Break-even prob: 33.33%
Positive EV: True
=== Spread Bet (-110) ===
Implied probability: 52.38%
Your probability: 53.00%
Edge: +0.0118 (+1.18%)
EV on $100 bet: $+1.18
Break-even prob: 52.38%
Positive EV: True
Notice how different the edges are. The underdog bet at +200 with a 38% estimated probability yields a 14% edge---a very large advantage. The spread bet at -110 with a 53% estimate yields only a 1.18% edge. Both are positive EV, but they are very different propositions in terms of profitability and the confidence required in your probability estimate.
Practical Tip: Small Edges Require High Confidence
If your edge on a bet is only 1-2%, you need to be very confident in your probability estimate. A small error in your assessment can flip a marginally +EV bet to -EV. As a general heuristic, many professional bettors require a minimum edge threshold (e.g., 3-5%) before placing a wager.
3.2 Identifying +EV Opportunities
Understanding expected value is one thing. Finding actual positive expected value bets in a competitive marketplace is quite another. This section develops a systematic approach to identifying +EV opportunities.
The Edge Formula Revisited
Recall the core formula:
$$\text{Edge} = p_{\text{true}} \cdot d - 1$$
This can also be expressed as the difference between your estimated probability and the market's implied probability, scaled by the odds:
$$\text{Edge} = \frac{p_{\text{true}} - p_{\text{implied}}}{p_{\text{implied}}} \cdot p_{\text{implied}} \cdot d$$
But more intuitively, the fundamental question is: Is your estimated probability higher than the break-even probability? If $p_{\text{true}} > 1/d$, the bet is +EV.
Comparing Your Probability to the Market
The market's implied probability is embedded in the odds. Your job as a bettor is to form your own probability estimate and compare it to the market's. There are three possible outcomes:
- Your probability > Implied probability: The bet is +EV for you. The market is underpricing this outcome.
- Your probability = Implied probability: The bet is approximately zero EV. No edge exists.
- Your probability < Implied probability: The bet is -EV for you. The market is correctly pricing or overpricing this outcome.
The key insight is that you do not need to predict winners perfectly. You only need to be more accurate than the odds imply. If the market says a team has a 40% chance of winning and you correctly assess them at 45%, you have an edge---even though the team loses more often than they win.
Key Insight: Beating the Market, Not Predicting Winners
Profitable sports betting is not about picking winners. It is about finding prices that are wrong. You can lose most of your bets and still be profitable if you consistently bet underdogs at odds that overestimate how much of an underdog they really are.
When Is an Edge Large Enough?
Not every positive edge is worth pursuing. Several factors determine whether an edge is actionable:
-
Size of the edge relative to your uncertainty. If you estimate a 55% probability but your confidence interval is 48%-62%, the true probability could easily be below the break-even threshold.
-
Transaction costs. Depositing, withdrawing, and managing multiple sportsbook accounts all have friction costs that eat into thin edges.
-
Available volume. Some markets have low limits, meaning you cannot bet enough for a small edge to generate meaningful profit.
-
Market efficiency. Sharp lines (e.g., NFL sides) are harder to beat than soft lines (e.g., minor league props). A 2% edge on a sharp line may be genuine; a 2% edge on a soft line could evaporate by game time.
As a practical guideline:
| Edge Magnitude | Assessment | Action |
|---|---|---|
| < 1% | Marginal | Generally skip; not worth the uncertainty |
| 1-3% | Small | Bet selectively with high confidence |
| 3-5% | Moderate | Core of a profitable betting strategy |
| 5-10% | Large | Bet aggressively (within bankroll management rules) |
| > 10% | Very large | Rare; verify your analysis before betting large |
Sources of Edge
Where do edges come from? In a market with millions of participants, why would the odds ever be wrong? There are several genuine sources of edge:
1. Superior information or analysis. You have access to information the market has not yet incorporated, or you analyze publicly available information more accurately. For example, a detailed injury analysis that the market has not yet priced in, or a statistical model that captures a relevant variable the consensus overlooks.
2. Speed. You react to new information faster than the market. If a key player is announced as inactive 30 minutes before game time and you can bet before the lines adjust, you have a temporary edge. This is common in live betting and pre-game markets close to tip-off.
3. Specialization. The betting market is broadest and most efficient for popular events (NFL, Premier League). Niche markets---college basketball mid-majors, lower European soccer leagues, emerging esports---receive less attention from sharp bettors and can harbor larger inefficiencies.
4. Behavioral exploitation. The public tends to overbet favorites, home teams, overs, and teams with recent winning streaks. These persistent biases can create systematic edges on the other side. We explore this in depth in Chapter 36 on cognitive biases.
5. Structural advantages. Arbitrage across sportsbooks, bonus exploitation, and market-making strategies can provide edge without requiring any prediction of outcomes.
A Systematic +EV Identification Process
Here is a step-by-step process for identifying +EV bets:
-
Build your probability model. Using the techniques developed in later chapters (statistical models, rating systems, etc.), estimate the true probability of each outcome for each game.
-
Scrape or retrieve the market odds. Collect the best available odds across multiple sportsbooks for each outcome.
-
Compute the edge. For each bet, calculate $\text{Edge} = p_{\text{true}} \cdot d - 1$.
-
Filter by minimum edge threshold. Discard any bets below your minimum edge requirement (e.g., 3%).
-
Verify the line. Confirm the odds are still available and have not moved since you scraped them.
-
Size the bet. Use the Kelly Criterion or a fractional Kelly approach (Chapter 4) to determine the optimal stake.
-
Place the bet and log it. Record every detail for future performance analysis.
Worked Example 3: Finding +EV in NFL Lines
Scenario. You have built a model that estimates win probabilities for upcoming NFL games. Here are this week's results, along with the best available moneyline odds at your sportsbooks:
| Game | Your Prob | Best Odds (American) | Best Odds (Decimal) |
|---|---|---|---|
| Team A ML | 0.58 | -140 | 1.714 |
| Team B ML | 0.42 | +120 | 2.200 |
| Team C ML | 0.72 | -250 | 1.400 |
| Team D ML | 0.28 | +210 | 3.100 |
| Team E ML | 0.51 | -105 | 1.952 |
| Team F ML | 0.49 | -105 | 1.952 |
Step 1: Compute edge for each bet.
| Game | Your Prob | Decimal Odds | Edge (p*d - 1) | +EV? |
|---|---|---|---|---|
| Team A ML | 0.58 | 1.714 | 0.58 x 1.714 - 1 = -0.006 | No |
| Team B ML | 0.42 | 2.200 | 0.42 x 2.200 - 1 = -0.076 | No |
| Team C ML | 0.72 | 1.400 | 0.72 x 1.400 - 1 = +0.008 | Marginal |
| Team D ML | 0.28 | 3.100 | 0.28 x 3.100 - 1 = -0.132 | No |
| Team E ML | 0.51 | 1.952 | 0.51 x 1.952 - 1 = -0.005 | No |
| Team F ML | 0.49 | 1.952 | 0.49 x 1.952 - 1 = -0.044 | No |
Step 2: Apply minimum edge filter (3%).
None of these bets meet a 3% minimum edge threshold. Team C has a marginal +0.8% edge that is too thin to be actionable given the uncertainty in our probability estimates.
Step 3: Decision.
No bets this week. This is a perfectly acceptable outcome. Professional bettors frequently have days or even weeks with no actionable bets. The discipline to pass on marginal opportunities is as important as the ability to identify strong ones.
Practical Tip: The Best Bet Is Often No Bet
If your analysis does not identify a clear +EV opportunity, do not force a bet. Recreational bettors feel compelled to have action on every game. Professional bettors understand that the right play is often to do nothing. Your bankroll does not decay when you are not betting; it decays when you make -EV bets.
Python Code: +EV Scanner
The following code scans a set of games and flags those with positive expected value above a configurable threshold.
"""Scan a slate of games for positive expected value opportunities."""
import pandas as pd
from typing import Optional
def scan_for_ev(
games: list[dict],
min_edge: float = 0.03,
) -> pd.DataFrame:
"""Scan a list of games and identify +EV betting opportunities.
Args:
games: List of dicts, each with keys 'game', 'your_prob',
and 'american_odds'.
min_edge: Minimum edge threshold (default 3%).
Returns:
DataFrame of identified +EV opportunities, sorted by edge.
"""
results = []
for game in games:
odds = game["american_odds"]
prob = game["your_prob"]
# Convert to decimal
if odds > 0:
decimal_odds = 1 + odds / 100
imp_prob = 100 / (odds + 100)
else:
decimal_odds = 1 + 100 / abs(odds)
imp_prob = abs(odds) / (abs(odds) + 100)
edge = prob * decimal_odds - 1
break_even = 1 / decimal_odds
results.append({
"game": game["game"],
"your_prob": prob,
"implied_prob": round(imp_prob, 4),
"american_odds": odds,
"decimal_odds": round(decimal_odds, 3),
"edge": round(edge, 4),
"ev_per_100": round(edge * 100, 2),
"meets_threshold": edge >= min_edge,
})
df = pd.DataFrame(results)
df = df.sort_values("edge", ascending=False)
return df
# --- Example usage ---
nfl_slate = [
{"game": "Bills ML", "your_prob": 0.65, "american_odds": -150},
{"game": "Chiefs ML", "your_prob": 0.58, "american_odds": -180},
{"game": "Lions ML", "your_prob": 0.55, "american_odds": -110},
{"game": "Jets ML", "your_prob": 0.45, "american_odds": +130},
{"game": "Bengals ML", "your_prob": 0.52, "american_odds": +105},
{"game": "Vikings ML", "your_prob": 0.40, "american_odds": +180},
{"game": "Packers ML", "your_prob": 0.62, "american_odds": -145},
{"game": "Broncos ML", "your_prob": 0.35, "american_odds": +200},
]
print("=== NFL +EV Scan (min edge: 3%) ===\n")
results_df = scan_for_ev(nfl_slate, min_edge=0.03)
print(results_df.to_string(index=False))
print("\n=== Actionable Bets ===\n")
actionable = results_df[results_df["meets_threshold"]]
if len(actionable) == 0:
print("No bets meet the minimum edge threshold.")
else:
for _, row in actionable.iterrows():
print(
f" {row['game']}: Edge = {row['edge']:+.2%}, "
f"EV per $100 = ${row['ev_per_100']:+.2f}"
)
Running this produces output identifying any games that meet the 3% threshold, allowing you to focus your attention only on the most promising opportunities.
3.3 The Law of Large Numbers and Long-Run Thinking
Why a Single Bet's Outcome Is Irrelevant
You have identified a +EV bet with a 7% edge. You place the bet. You lose. Does this mean your analysis was wrong?
Absolutely not.
A single bet's outcome tells you virtually nothing about the quality of the bet. If you bet on a team with a true 60% win probability and they lose, nothing unusual has happened---40% events occur 40% of the time. Even strong edges lose regularly. The only meaningful evaluation of a betting strategy occurs over many, many bets.
This is not mere motivational talk. It is a mathematical theorem.
The Law of Large Numbers
The Law of Large Numbers (LLN) is one of the foundational theorems of probability theory. It states:
Definition: Law of Large Numbers
As the number of independent trials $n$ increases, the sample mean $\bar{X}_n$ converges to the expected value $\mu = E[X]$. Formally, for any $\epsilon > 0$:
$$\lim_{n \to \infty} P\left(|\bar{X}_n - \mu| > \epsilon\right) = 0$$
In betting terms: as you place more and more bets, your average profit per bet will converge toward your expected value per bet. If your expected value is positive, your cumulative profit will grow over time. If it is negative, your cumulative losses will deepen.
The qualifier "independent trials" is important. The LLN requires that the outcome of each bet does not affect the outcome of any other bet. For most sports bets, this condition is approximately satisfied (though parlays and correlated bets require more careful treatment).
The Speed of Convergence
The LLN guarantees convergence, but it does not tell us how fast. How many bets do you need before you can be confident that your observed results reflect your true edge?
The answer depends on two factors: the size of your edge and the variance of each bet. For standard -110 bets with a true edge of $e$, the standard deviation of profit per bet is approximately:
$$\sigma_{\text{bet}} \approx S \cdot \sqrt{p(1-p)} \cdot d \approx S$$
where $S$ is the stake and the approximation holds for standard odds. The standard error of your average profit after $n$ bets is:
$$SE = \frac{\sigma_{\text{bet}}}{\sqrt{n}}$$
To be 95% confident that your observed average profit is positive (assuming your true edge is $e$), you need:
$$n \geq \left(\frac{1.96 \cdot \sigma_{\text{bet}}}{e \cdot S}\right)^2$$
For a 5% edge on -110 bets, this works out to roughly 1,500 bets. For a 3% edge, approximately 4,200 bets. For a 1% edge, nearly 40,000 bets.
Warning: You Need Thousands of Bets
Most bettors dramatically underestimate the sample size required to confirm an edge. If your edge is 3% on standard -110 bets, you need over 4,000 bets before you can be statistically confident that positive results are not due to luck alone. Anyone who claims to have a "proven system" after 50 or even 200 bets is almost certainly fooling themselves.
Simulation: Convergence to Expected Value
The following Python code simulates many betting sequences to visualize how outcomes converge to expected value over time.
"""Monte Carlo simulation demonstrating convergence to expected value."""
import numpy as np
import matplotlib.pyplot as plt
def simulate_betting_sequences(
true_prob: float = 0.54,
decimal_odds: float = 1.909, # -110
stake: float = 100.0,
n_bets: int = 2000,
n_simulations: int = 500,
seed: int = 42,
) -> dict:
"""Simulate multiple sequences of bets to show LLN convergence.
Args:
true_prob: True probability of winning each bet.
decimal_odds: Decimal odds for each bet.
stake: Fixed stake per bet in dollars.
n_bets: Number of bets per simulation sequence.
n_simulations: Number of independent sequences to simulate.
seed: Random seed for reproducibility.
Returns:
Dictionary with simulation results and statistics.
"""
rng = np.random.default_rng(seed)
# Theoretical EV per bet
ev_per_bet = stake * (true_prob * decimal_odds - 1)
edge = true_prob * decimal_odds - 1
# Simulate outcomes: 1 = win, 0 = loss
outcomes = rng.random((n_simulations, n_bets)) < true_prob
# Calculate profit for each bet
win_profit = stake * (decimal_odds - 1)
loss_profit = -stake
profits = np.where(outcomes, win_profit, loss_profit)
# Cumulative profit for each sequence
cumulative_profit = np.cumsum(profits, axis=1)
# Cumulative average profit per bet
bet_numbers = np.arange(1, n_bets + 1)
cumulative_avg = cumulative_profit / bet_numbers
# Statistics at various checkpoints
checkpoints = [50, 100, 250, 500, 1000, 2000]
stats = {}
for cp in checkpoints:
if cp <= n_bets:
final_profits = cumulative_profit[:, cp - 1]
avg_profits = cumulative_avg[:, cp - 1]
stats[cp] = {
"mean_profit": np.mean(final_profits),
"std_profit": np.std(final_profits),
"pct_profitable": np.mean(final_profits > 0) * 100,
"mean_avg_profit": np.mean(avg_profits),
"worst_case": np.min(final_profits),
"best_case": np.max(final_profits),
}
return {
"cumulative_profit": cumulative_profit,
"cumulative_avg": cumulative_avg,
"ev_per_bet": ev_per_bet,
"edge": edge,
"bet_numbers": bet_numbers,
"stats": stats,
"n_simulations": n_simulations,
}
def plot_convergence(results: dict) -> None:
"""Plot the convergence of betting outcomes to expected value.
Args:
results: Dictionary from simulate_betting_sequences.
"""
fig, axes = plt.subplots(2, 1, figsize=(12, 10))
bet_numbers = results["bet_numbers"]
ev = results["ev_per_bet"]
n_sims = results["n_simulations"]
# --- Plot 1: Cumulative Profit ---
ax1 = axes[0]
# Plot a sample of individual sequences
n_show = min(50, n_sims)
for i in range(n_show):
ax1.plot(
bet_numbers,
results["cumulative_profit"][i],
alpha=0.1,
color="steelblue",
linewidth=0.5,
)
# Plot the theoretical EV line
ev_line = ev * bet_numbers
ax1.plot(
bet_numbers, ev_line,
color="red", linewidth=2.5, label=f"Expected Value (${ev:+.2f}/bet)"
)
# Plot the mean of all simulations
mean_cumulative = np.mean(results["cumulative_profit"], axis=0)
ax1.plot(
bet_numbers, mean_cumulative,
color="darkblue", linewidth=2, linestyle="--",
label=f"Mean of {n_sims} simulations"
)
ax1.set_xlabel("Number of Bets", fontsize=12)
ax1.set_ylabel("Cumulative Profit ($)", fontsize=12)
ax1.set_title("Cumulative Profit: Convergence to Expected Value", fontsize=14)
ax1.legend(fontsize=11)
ax1.axhline(y=0, color="gray", linestyle="-", linewidth=0.5)
ax1.grid(True, alpha=0.3)
# --- Plot 2: Average Profit Per Bet ---
ax2 = axes[1]
for i in range(n_show):
ax2.plot(
bet_numbers,
results["cumulative_avg"][i],
alpha=0.1,
color="steelblue",
linewidth=0.5,
)
ax2.axhline(
y=ev, color="red", linewidth=2.5,
label=f"True EV = ${ev:+.2f}/bet"
)
mean_avg = np.mean(results["cumulative_avg"], axis=0)
ax2.plot(
bet_numbers, mean_avg,
color="darkblue", linewidth=2, linestyle="--",
label="Mean of simulations"
)
ax2.set_xlabel("Number of Bets", fontsize=12)
ax2.set_ylabel("Average Profit Per Bet ($)", fontsize=12)
ax2.set_title(
"Average Profit Per Bet: Convergence Narrows Over Time", fontsize=14
)
ax2.legend(fontsize=11)
ax2.axhline(y=0, color="gray", linestyle="-", linewidth=0.5)
ax2.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("ev_convergence.png", dpi=150, bbox_inches="tight")
plt.show()
def print_convergence_stats(results: dict) -> None:
"""Print summary statistics at various sample sizes.
Args:
results: Dictionary from simulate_betting_sequences.
"""
print(f"Edge: {results['edge']:.2%}")
print(f"EV per $100 bet: ${results['ev_per_bet']:+.2f}\n")
print(f"{'Bets':>6} | {'Mean Profit':>12} | {'Std Dev':>10} | "
f"{'% Profitable':>13} | {'Worst':>10} | {'Best':>10}")
print("-" * 75)
for n_bets, s in sorted(results["stats"].items()):
print(
f"{n_bets:>6} | ${s['mean_profit']:>+10.0f} | "
f"${s['std_profit']:>8.0f} | {s['pct_profitable']:>11.1f}% | "
f"${s['worst_case']:>+8.0f} | ${s['best_case']:>+8.0f}"
)
# --- Run simulation ---
# Scenario: 54% win rate on -110 bets (edge ≈ 3.1%)
results = simulate_betting_sequences(
true_prob=0.54,
decimal_odds=1.909,
stake=100,
n_bets=2000,
n_simulations=500,
seed=42,
)
print("=== Monte Carlo Simulation: 500 Sequences of 2,000 Bets ===\n")
print_convergence_stats(results)
# Uncomment the following line to generate the plot:
# plot_convergence(results)
Running this simulation produces the following summary:
=== Monte Carlo Simulation: 500 Sequences of 2,000 Bets ===
Edge: 3.13%
EV per $100 bet: $+3.13
Bets | Mean Profit | Std Dev | % Profitable | Worst | Best
---------------------------------------------------------------------------
50 | $+150 | $719 | 57.4% | $-1873 | $+2036
100 | $+311 | $990 | 62.2% | $-2473 | $+3164
250 | $+780 | $1559 | 69.2% | $-3736 | $+5073
500 | $+1570 | $2193 | 76.0% | $-4382 | $+8209
1000 | $+3140 | $3107 | 84.2% | $-5345 | $+12436
2000 | $+6258 | $4376 | 92.2% | $-4909 | $+19618
These results illustrate several critical points:
-
After 50 bets, only 57% of simulations are profitable, despite having a genuine 3.1% edge. Nearly half of all bettors with this edge would be in the red after 50 bets. This is why short-term results are meaningless.
-
After 500 bets, about 76% are profitable. Better, but one in four bettors with a real edge is still losing money.
-
After 2,000 bets, 92% are profitable. The Law of Large Numbers is doing its work, but even here, some unlucky sequences remain in the red.
-
The worst case after 2,000 bets shows a loss of nearly \$5,000 despite having a genuine +EV strategy. Variance is real and painful.
Key Insight: Process Over Outcome
A good bet is one with positive expected value, regardless of whether it wins or loses. A bad bet is one with negative expected value, regardless of whether it wins or loses. Judge your decisions by the process (Was the bet +EV?), not by the outcome (Did it win?). The Law of Large Numbers ensures that good process will produce good results over a sufficient number of trials.
The Difference Between Outcome and Process
This distinction---between process quality and outcome quality---is perhaps the most difficult mindset shift for new bettors. Consider these four scenarios:
| Process | Outcome | Assessment |
|---|---|---|
| +EV bet | Win | Good process, good outcome. The ideal case. |
| +EV bet | Loss | Good process, bad outcome. Unavoidable and frequent. Stay the course. |
| -EV bet | Win | Bad process, good outcome. The most dangerous case. This reinforces bad behavior. |
| -EV bet | Loss | Bad process, bad outcome. At least the lesson is clear. |
The third case---a -EV bet that wins---is the most insidious because it creates a psychological reward for the wrong behavior. Many recreational bettors have a "system" that happened to win a few early bets, creating the illusion of skill where none exists. The Law of Large Numbers will eventually correct this, but it can take a painfully long time.
3.4 Edge Quantification and Yield
ROI and Yield: Measuring What Matters
Once you begin betting with a systematic approach, you need metrics to evaluate your performance. The two most important are Return on Investment (ROI) and yield.
ROI measures your total profit relative to total capital risked:
$$\text{ROI} = \frac{\text{Total Profit}}{\text{Total Amount Wagered}} \times 100\%$$
Yield is simply another name for ROI in the betting context. Some practitioners distinguish between them (using "yield" for per-bet average and "ROI" for total return on bankroll), but in this book we use them interchangeably.
For a bettor who has placed $n$ bets, each with stake $S_i$ and profit $\pi_i$:
$$\text{Yield} = \frac{\sum_{i=1}^{n} \pi_i}{\sum_{i=1}^{n} S_i} \times 100\%$$
Expected Yield Given a Known Edge
If you consistently bet on opportunities with edge $e$, your expected yield is simply $e$. That is:
$$E[\text{Yield}] = e$$
A bettor with a 3% average edge expects a 3% yield: for every \$100 wagered, \$3 in profit on average. This might sound small, but compounded over thousands of bets with proper bankroll management (Chapter 4), it generates substantial returns.
For context, here is what various yield levels mean in practice:
| Yield | Assessment | Context |
|---|---|---|
| -5% to -10% | Losing | Typical recreational bettor |
| -2% to 0% | Roughly break-even | Better than most, but not profitable |
| 0% to 2% | Marginal | Might be skill, might be luck |
| 2% to 5% | Good | Consistent +EV betting with moderate edge |
| 5% to 10% | Excellent | Top-tier professional performance |
| > 10% | Exceptional | Rare and usually unsustainable at volume |
Warning: Extraordinary Claims Require Extraordinary Evidence
If someone claims a consistent yield above 10% over a large sample of mainstream bets, be very skeptical. While such returns are possible in niche markets or over short periods, sustained double-digit yields at volume would imply an enormous edge that sharp sportsbooks would quickly eliminate by limiting the bettor's account.
Tracking Actual vs. Expected Performance
A disciplined bettor should track not only their actual results but also their expected results based on pre-bet edge estimates. This allows you to detect whether your probability model is well-calibrated.
If your model has been assigning edges of 3-5% to your bets but your actual yield after 1,000 bets is -2%, there are three possibilities:
- Bad luck (variance). Possible but increasingly unlikely as the sample grows.
- Your model is overestimating your edge. This is the most common explanation. Revisit your probability estimates.
- Market conditions have changed. An edge that existed six months ago may have been arbitraged away.
Closing Line Value (CLV)
Closing Line Value is the difference between the odds at which you placed your bet and the closing odds (the final odds just before the event starts). CLV is widely considered the single best predictor of long-term betting profitability.
$$\text{CLV} = \frac{p_{\text{closing}}}{p_{\text{opening}}} - 1$$
where $p_{\text{closing}}$ and $p_{\text{opening}}$ are the implied probabilities at closing and at the time of your bet, respectively.
Alternatively, in terms of decimal odds:
$$\text{CLV} = \frac{d_{\text{your bet}}}{d_{\text{closing}}} - 1$$
If you consistently get better odds than the closing line, you are almost certainly a long-term winner. The closing line is considered the most efficient market price because it incorporates all available information. Beating it is strong evidence of genuine predictive skill.
Key Insight: CLV Is the Gold Standard
If you had to choose a single metric to evaluate a bettor's skill, it would be Closing Line Value. A bettor with positive CLV is almost certainly profitable in the long run, even if short-term results are negative. Conversely, a bettor with negative CLV who is currently profitable is likely riding a lucky streak that will end.
Example. You bet on Team A at +150 (decimal 2.500). By game time, the line has moved to +130 (decimal 2.300). Your CLV is:
$$\text{CLV} = \frac{2.500}{2.300} - 1 = 1.087 - 1 = +8.7\%$$
You captured 8.7% of value relative to the closing line. This is a strong indicator that your bet was well-timed and well-analyzed.
Worked Example 4: Evaluating a 500-Bet Track Record
Scenario. A bettor has completed 500 bets over a football season with the following summary statistics:
- Total wagered: \$50,000 (average \$100 per bet)
- Total profit: \$1,750
- Record: 271 wins, 229 losses (54.2% win rate)
- All bets at standard -110 odds
- Average CLV: +2.1%
Step 1: Calculate actual yield.
$$\text{Yield} = \frac{1{,}750}{50{,}000} = 3.50\%$$
Step 2: Calculate expected yield given the win rate.
At -110 odds, each win pays \$90.91 profit and each loss costs \$100. So:
$$\text{Total wins} = 271 \times 90.91 = \$24{,}636.61$$ $$\text{Total losses} = 229 \times 100 = \$22{,}900.00$$ $$\text{Profit} = 24{,}636.61 - 22{,}900 = \$1{,}736.61$$
This confirms the stated profit (small rounding differences aside).
Step 3: Assess statistical significance.
The break-even win rate at -110 is 52.38%. The bettor's 54.2% rate exceeds this by 1.82 percentage points. Is this statistically significant?
Under the null hypothesis (bettor has no edge, true probability = 52.38%), the expected number of wins in 500 bets is $500 \times 0.5238 = 261.9$. The standard deviation is $\sqrt{500 \times 0.5238 \times 0.4762} = 11.17$.
The bettor's 271 wins yields a z-score of:
$$z = \frac{271 - 261.9}{11.17} = \frac{9.1}{11.17} = 0.815$$
A z-score of 0.815 corresponds to a p-value of approximately 0.21 (one-tailed). This is not statistically significant at conventional levels. After 500 bets, we cannot confidently distinguish this bettor's performance from luck.
Step 4: Evaluate CLV.
However, the bettor's average CLV of +2.1% is a separate and arguably more informative signal. Positive CLV suggests the bettor is consistently identifying value before the market corrects, which is strong evidence of skill regardless of short-term win-loss results.
Assessment. The bettor's results are encouraging but not statistically conclusive based on win rate alone. The positive CLV provides additional evidence of genuine skill. The bettor should continue tracking and expect statistical significance to emerge after approximately 2,000-3,000 more bets at this edge level.
Python Code: Performance Tracker
"""Performance tracking and yield calculation for a betting record."""
import numpy as np
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class Bet:
"""Record of a single bet."""
game: str
stake: float
american_odds: int
estimated_prob: float
result: str # "win", "loss", or "push"
closing_odds: Optional[int] = None
@property
def decimal_odds(self) -> float:
if self.american_odds > 0:
return 1 + self.american_odds / 100
return 1 + 100 / abs(self.american_odds)
@property
def profit(self) -> float:
if self.result == "win":
return self.stake * (self.decimal_odds - 1)
elif self.result == "loss":
return -self.stake
return 0.0 # push
@property
def edge(self) -> float:
return self.estimated_prob * self.decimal_odds - 1
@property
def clv(self) -> Optional[float]:
if self.closing_odds is None:
return None
if self.closing_odds > 0:
closing_decimal = 1 + self.closing_odds / 100
else:
closing_decimal = 1 + 100 / abs(self.closing_odds)
return self.decimal_odds / closing_decimal - 1
@dataclass
class BettingRecord:
"""Aggregate performance tracking for a collection of bets."""
bets: list[Bet] = field(default_factory=list)
def add_bet(self, bet: Bet) -> None:
self.bets.append(bet)
@property
def n_bets(self) -> int:
return len(self.bets)
@property
def total_wagered(self) -> float:
return sum(b.stake for b in self.bets)
@property
def total_profit(self) -> float:
return sum(b.profit for b in self.bets)
@property
def yield_pct(self) -> float:
if self.total_wagered == 0:
return 0.0
return (self.total_profit / self.total_wagered) * 100
@property
def win_rate(self) -> float:
decided = [b for b in self.bets if b.result != "push"]
if not decided:
return 0.0
wins = sum(1 for b in decided if b.result == "win")
return wins / len(decided)
@property
def avg_edge(self) -> float:
if not self.bets:
return 0.0
return np.mean([b.edge for b in self.bets])
@property
def avg_clv(self) -> Optional[float]:
clvs = [b.clv for b in self.bets if b.clv is not None]
if not clvs:
return None
return np.mean(clvs)
def expected_profit(self) -> float:
return sum(b.stake * b.edge for b in self.bets)
def summary(self) -> str:
lines = [
f"=== Betting Performance Summary ===",
f" Total bets: {self.n_bets}",
f" Total wagered: ${self.total_wagered:,.2f}",
f" Total profit: ${self.total_profit:+,.2f}",
f" Yield: {self.yield_pct:+.2f}%",
f" Win rate: {self.win_rate:.1%}",
f" Average edge: {self.avg_edge:.2%}",
f" Expected profit: ${self.expected_profit():+,.2f}",
]
if self.avg_clv is not None:
lines.append(f" Average CLV: {self.avg_clv:+.2%}")
# Significance test
decided = [b for b in self.bets if b.result != "push"]
if len(decided) >= 30:
profits = np.array([b.profit for b in decided])
mean_profit = np.mean(profits)
se = np.std(profits, ddof=1) / np.sqrt(len(profits))
z = mean_profit / se if se > 0 else 0
lines.append(f" Z-score (skill): {z:.2f}")
if abs(z) >= 1.96:
lines.append(f" Significance: YES (p < 0.05)")
else:
lines.append(f" Significance: NO (need more data)")
return "\n".join(lines)
# --- Demonstration ---
record = BettingRecord()
# Simulate a sample betting record
rng = np.random.default_rng(123)
sample_games = [
("Game A", -110, 0.55, -120),
("Game B", +150, 0.40, +135),
("Game C", -130, 0.60, -140),
("Game D", +200, 0.38, +180),
("Game E", -105, 0.53, -110),
]
for i in range(100):
game_name, odds, prob, closing = sample_games[i % len(sample_games)]
# Simulate result
won = rng.random() < prob
result = "win" if won else "loss"
bet = Bet(
game=f"{game_name}_{i}",
stake=100.0,
american_odds=odds,
estimated_prob=prob,
result=result,
closing_odds=closing,
)
record.add_bet(bet)
print(record.summary())
3.5 When EV Isn't Enough --- Variance and Utility
The Limitation of Expected Value
Expected value is the most important concept in sports betting, but it is not the only concept that matters. Two bets can have the same expected value but very different risk profiles. Consider:
Bet A: 90% chance of winning \$11.11, 10% chance of losing \$100. $$E[X] = 0.90 \times 11.11 + 0.10 \times (-100) = 10 - 10 = \$0$$
Bet B: 10% chance of winning \$900, 90% chance of losing \$100. $$E[X] = 0.10 \times 900 + 0.90 \times (-100) = 90 - 90 = \$0$$
Both bets have zero expected value. But they feel very different. Bet A wins almost all the time but occasionally loses big. Bet B loses almost all the time but occasionally wins big. A purely EV-focused analysis treats them identically, but a real bettor with a real bankroll should not.
Variance and Standard Deviation
Variance measures the spread of possible outcomes around the expected value. For a bet with profit $X$:
$$\text{Var}(X) = E[(X - E[X])^2] = \sum_{i} p_i (x_i - E[X])^2$$
For a standard sports bet with stake $S$, decimal odds $d$, and win probability $p$:
$$\text{Var}(X) = S^2 \cdot d^2 \cdot p \cdot (1 - p)$$
The standard deviation is $\sigma = \sqrt{\text{Var}(X)}$, which gives you a measure of the typical deviation from the expected value in the same units as your profit.
Variance Over Multiple Bets
If you place $n$ independent bets, each with the same stake, odds, and probability, the variance of your total profit is:
$$\text{Var}(\text{Total}) = n \cdot \text{Var}(X_{\text{single}})$$
$$\sigma_{\text{Total}} = \sigma_{\text{single}} \cdot \sqrt{n}$$
And the expected total profit grows linearly:
$$E[\text{Total}] = n \cdot E[X_{\text{single}}]$$
This is the fundamental tension in sports betting: expected profit grows linearly with $n$, but the standard deviation grows only with $\sqrt{n}$. Over time, the signal (expected profit) grows faster than the noise (standard deviation), which is exactly what the Law of Large Numbers predicts. But in the short run, the noise can dominate.
Confidence Intervals for Profit
After $n$ bets, your total profit is approximately normally distributed (by the Central Limit Theorem). A 95% confidence interval for your total profit is:
$$E[\text{Total}] \pm 1.96 \cdot \sigma_{\text{Total}}$$
Worked example. Suppose you make 500 bets at \$100 each on -110 lines with a 54% true win rate.
- Edge per bet: $0.54 \times 1.909 - 1 = 0.031$
- Expected profit per bet: $\$100 \times 0.031 = \$3.13$
- Expected total profit: $500 \times 3.13 = \$1{,}563$
- Win profit: $\$100 \times 0.909 = \$90.91$
- Loss amount: $\$100$
Variance per bet: $$\text{Var} = (0.54)(90.91 - 3.13)^2 + (0.46)(-100 - 3.13)^2$$ $$= (0.54)(7{,}711.7) + (0.46)(10{,}627.8)$$ $$= 4{,}164.3 + 4{,}888.8 = 9{,}053.1$$
$$\sigma_{\text{single}} = \sqrt{9{,}053.1} = \$95.15$$
$$\sigma_{\text{Total}} = 95.15 \times \sqrt{500} = \$2{,}127$$
95% confidence interval:
$$\$1{,}563 \pm 1.96 \times \$2{,}127 = \$1{,}563 \pm \$4{,}169$$
$$[-\$2{,}606, \quad +\$5{,}732]$$
Even with a genuine 3.1% edge over 500 bets, there is a meaningful probability of being down money. The lower bound of the confidence interval is -\$2,606. This is the variance reality that every serious bettor must accept and plan for.
Warning: Plan for the Downside
Even with a genuine edge, you should expect to experience extended losing periods. A 95% confidence interval that includes negative values means there is a non-trivial chance (greater than 2.5%) of being in the red after that many bets. Proper bankroll management (Chapter 4) is essential for surviving these inevitable downswings.
Utility Theory: Why -EV Bets Are Not Always Irrational
Classical expected value analysis assumes that you should always maximize expected monetary value. But this ignores an important reality: the value of money is not constant across wealth levels.
Utility theory, developed by Daniel Bernoulli in 1738 and formalized by von Neumann and Morgenstern in 1944, holds that people do not value outcomes in raw dollars. Instead, they assign a subjective utility to each outcome, and they maximize expected utility rather than expected monetary value.
The utility function $U(W)$ maps wealth $W$ to subjective value. For most people, this function is concave, meaning:
$$U''(W) < 0$$
This concavity implies diminishing marginal utility: the 100th dollar is worth more to you than the 10,000th dollar. As a consequence, the pain of losing \$100** exceeds the **joy of gaining \$100 for most people.
Definition: Risk Aversion
An individual is risk-averse if they prefer a certain outcome to a risky gamble with the same expected value. Mathematically, a person with utility function $U$ is risk-averse if and only if $U$ is concave, i.e., $U(E[X]) > E[U(X)]$ for any non-degenerate random variable $X$.
The Certainty Equivalent
The certainty equivalent of a gamble is the guaranteed amount that gives you the same utility as the gamble. For a risk-averse person, the certainty equivalent of a fair gamble is less than the expected value.
Example. Consider a bet that pays +\$1,000 or -\$1,000 with equal probability. The expected value is \$0. But most people would pay some amount---say \$50---to avoid this gamble. Their certainty equivalent is -\$50, meaning they treat this zero-EV bet as if it were worth -\$50 to them.
This is why recreational bettors who bet for entertainment are not necessarily acting irrationally by placing -EV bets. If the entertainment value of watching a game with money on the line exceeds the expected loss from the vig, the bet has positive expected utility even though it has negative expected monetary value. The key is to be honest about what you are paying for.
Key Insight: Entertainment Value Is Legitimate
If you bet \$20 on a football game at -110 and lose, you have paid approximately \$0.91 in expected cost (the vig). If the entertainment value of having a stake in the game exceeds \$0.91 to you, then the bet was utility-maximizing even though it was -EV in monetary terms. The problem arises only when bettors mistake entertainment for investment, or when the stakes exceed what they can comfortably afford to lose.
Expected Utility vs. Expected Value Maximization
For someone pursuing sports betting as a profit-seeking activity, the tension between expected value maximization and expected utility maximization manifests primarily in bet sizing decisions. A pure EV maximizer would bet their entire bankroll on any +EV opportunity, since doing so maximizes expected profit. But this strategy has a catastrophic flaw: a single loss wipes out the entire bankroll.
Expected utility maximization, by contrast, accounts for the non-linear relationship between wealth and utility. It naturally produces more conservative bet sizes that protect against ruin while still exploiting positive expected value.
This leads directly to the Kelly Criterion, which we will develop in full in Chapter 4. The Kelly Criterion can be derived as the bet size that maximizes the expected logarithmic utility of wealth---that is, it assumes the utility function $U(W) = \ln(W)$. This is a specific and mathematically elegant resolution of the tension between EV and utility.
$$f^* = \frac{p \cdot d - 1}{d - 1}$$
where $f^*$ is the fraction of your bankroll to wager, $p$ is the true probability, and $d$ is the decimal odds.
We introduce this formula here as a preview; Chapter 4 will provide the full derivation, practical modifications (fractional Kelly), and implementation.
The Relationship Between EV, Variance, and Bet Sizing
To tie this section together: expected value tells you whether to bet. Variance (combined with utility considerations) tells you how much to bet. Both questions are essential, and answering only one without the other is incomplete.
A bet with enormous expected value but astronomical variance might warrant only a small stake. A bet with modest expected value but very low variance might warrant a larger stake. The optimal bet size balances the opportunity (EV) against the risk (variance) in a way that maximizes long-run growth while maintaining an acceptable probability of surviving short-run fluctuations.
This is a theme we will develop extensively in Chapter 4. For now, the takeaway is:
Practical Tip: EV Gets You in the Door; Risk Management Keeps You in the Game
Identifying +EV bets is necessary but not sufficient for long-term profitability. You must also manage your bankroll to survive the inevitable variance. The best +EV strategy in the world is worthless if you go broke before the long run arrives.
3.6 Chapter Summary
Key Concepts
This chapter introduced expected value---the most fundamental concept in quantitative sports betting. We established that:
-
Expected value is the probability-weighted average of all possible outcomes. It represents the long-run average profit per bet.
-
The edge formula $\text{Edge} = p \cdot d - 1$ distills the profitability of any bet into a single number. Positive edge means +EV; negative edge means -EV.
-
Identifying +EV bets requires comparing your probability estimate to the market's implied probability. The gap between the two, adjusted for the vig, determines your edge.
-
The Law of Large Numbers guarantees that results converge to expected value over many bets, but convergence requires thousands of bets for statistical confirmation.
-
Closing Line Value is the best single predictor of long-term profitability, because it measures whether you consistently capture value before the market corrects.
-
Variance can overwhelm expected value in the short run. Proper bankroll management and realistic expectations about drawdowns are essential.
-
Utility theory explains why EV maximization alone is insufficient for practical decision-making. Risk aversion and bet sizing must be considered together.
Key Formulas
| Formula | Description |
|---|---|
| $E[X] = \sum p_i \cdot x_i$ | Expected value definition |
| $\text{Edge} = p \cdot d - 1$ | Edge for a single bet |
| $p_{\text{break-even}} = 1/d$ | Break-even probability |
| $\text{Yield} = \text{Profit} / \text{Total Wagered}$ | Performance yield |
| $\text{CLV} = d_{\text{bet}} / d_{\text{close}} - 1$ | Closing line value |
| $\text{Var}(X) = S^2 d^2 p(1-p)$ | Variance of a single bet |
| $\sigma_{\text{Total}} = \sigma_{\text{single}} \sqrt{n}$ | Std dev over $n$ bets |
| $f^* = (pd - 1)/(d - 1)$ | Kelly Criterion (preview) |
Key Code Patterns
This chapter introduced four reusable code patterns:
-
calculate_ev(): Computes edge, EV, break-even probability, and implied probability for any single bet given your estimated probability and the offered odds. -
scan_for_ev(): Processes a slate of games against your probability model and identifies those meeting a minimum edge threshold. -
Monte Carlo simulation: Simulates thousands of betting sequences to visualize convergence behavior and estimate the probability of various outcomes over different time horizons.
-
BettingRecordclass: Tracks actual performance including yield, win rate, CLV, expected profit, and statistical significance testing.
Decision Framework
When evaluating any potential bet, apply this checklist:
- What is my estimated probability? (Requires a model or informed judgment)
- What are the best available odds? (Requires line shopping across books)
- What is my edge? (Apply $p \cdot d - 1$)
- Does the edge exceed my minimum threshold? (Typically 3-5%)
- How confident am I in my probability estimate? (Consider the uncertainty)
- What is the appropriate stake? (Chapter 4 will formalize this)
- Am I tracking this bet for future analysis? (Always yes)
If the answer to question 4 is no, the answer is simple: do not bet. Wait for the next opportunity. The market is always open, and patience is one of the most profitable virtues in sports betting.
What's Next
We now understand whether to bet (when EV is positive) and why the long run favors the disciplined bettor (the Law of Large Numbers). But we have not yet addressed the critical question of how much to bet.
In Chapter 4: Bankroll Management and the Kelly Criterion, we will develop the mathematical framework for optimal bet sizing. We will derive the Kelly Criterion from first principles, understand why it maximizes the long-run growth rate of wealth, explore practical modifications (fractional Kelly) that trade growth for safety, and build a complete bankroll management system. The Kelly Criterion resolves the tension between expected value and variance that we identified in Section 3.5, providing an elegant and practical answer to the question that every bettor must answer before placing a wager: "How much should I risk?"
If this chapter gave you the ability to identify profitable bets, Chapter 4 will give you the discipline to size them correctly---and the mathematics to prove that your sizing strategy is optimal.
Exercises
Conceptual Questions
3.1. A bet has an expected value of +\$5.00. Does this mean you will profit exactly \$5.00 if you place the bet? Explain.
3.2. Explain in your own words why a bettor who wins 55% of their -110 bets is profitable while a bettor who wins 52% is not.
3.3. You place a +EV bet and it loses. Your friend says your analysis was wrong. How do you respond?
3.4. A sportsbook offers both sides of a spread at -110. Calculate the house edge. Why does the house edge exist, and who ultimately pays for it?
Calculation Problems
3.5. (*) A sportsbook offers the Los Angeles Lakers at +180. You estimate their win probability at 40%. Calculate the edge and the expected value of a \$50 bet.
3.6. (*) You have a model that estimates probabilities for five NFL games this week. The games and best available odds are:
| Game | Your Prob | Best Odds |
|---|---|---|
| A | 0.62 | -155 |
| B | 0.44 | +135 |
| C | 0.71 | -210 |
| D | 0.33 | +250 |
| E | 0.55 | -115 |
Identify which bets are +EV and calculate the edge for each.
3.7. (**) After 1,000 bets at \$100 each on -110 lines, a bettor has won 548 and lost 452. Calculate: (a) total profit, (b) yield, (c) the z-score under the null hypothesis of no skill, and (d) whether the result is statistically significant at the 5% level.
3.8. (**) You bet on Team A at +140 (decimal 2.400). The closing line is +120 (decimal 2.200). Calculate your CLV. If you consistently achieve this level of CLV, what does it imply about your long-term profitability?
3.9. (***) Write a Python function that takes a list of bets (each with estimated probability, American odds, stake, and result) and returns: total profit, yield, average edge, a 95% confidence interval for the true yield, and the z-score for the null hypothesis of zero edge. Test it on a simulated dataset of 500 bets.
Critical Thinking
3.10. (**) A friend shows you their betting record: 30 bets, 22 wins, 8 losses, all at approximately -110 odds. They claim to have a "proven system." Using the concepts from this chapter, evaluate this claim quantitatively. What would you need to see before being convinced?
3.11. (***) Consider two betting strategies over a 500-bet sample: Strategy A has a 3% edge on -110 bets. Strategy B has a 10% edge on +500 bets. Which strategy has higher expected profit? Which has higher variance? Which would you prefer, and why? (Use the formulas from Section 3.5 to support your answer.)
Review Quiz
- What is the expected value of a bet with a 45% win probability at decimal odds of 2.300?
- What is the break-even win rate for a bet at American odds of -130?
- If a bettor has a 4% edge, approximately how many -110 bets do they need for 95% confidence that their observed yield is positive?
- What does Closing Line Value measure, and why is it considered the best indicator of betting skill?
- Explain why a bet with positive expected value can still be a bad bet for a particular bettor.
Chapter 3 is complete. Proceed to Chapter 4: Bankroll Management and the Kelly Criterion to learn how to size your bets optimally.