Half-Kelly

Overview

Half-Kelly is the practice of betting 50% of the mathematically optimal Kelly fraction. It is the industry standard for sports betting applications because it strikes a balance between growth maximization and risk management. The key insight is that full Kelly has very high volatility and risk of ruin — a full Kelly bettor has a ~33% chance of halving their bankroll before doubling it. Half-Kelly reduces this to ~11%.

The Kelly criterion mathematically maximizes long-term geometric growth, but it assumes perfectly accurate probability estimates. In practice, sports bettors' models are always somewhat wrong, making full Kelly too aggressive. Half-Kelly (and in some cases quarter-Kelly) is used as a safety buffer.

The client's spec explicitly calls for Half-Kelly implementation as the staking strategy.

Why It Matters

Half-Kelly is the practical standard for sports betting because:
1. Volatility reduction: Half-Kelly reduces bankroll variance to ~25% of full Kelly while sacrificing only ~40% of the growth rate.
2. Model error tolerance: Real models have probability estimation errors. Half-Kelly provides a buffer against this uncertainty.
3. Risk of ruin: Full Kelly's ~33% chance of halving before doubling is unacceptable for most bettors. Half-Kelly's ~11% is more manageable.
4. Regulatory alignment: Many betting operations use half-Kelly for risk management reasons.

Mathematical Comparison

For a 60% win probability, even money bet (b=1):

Strategy Kelly Fraction Growth Rate Risk of Halving
Full Kelly 20% 2.0%/bet ~33%
Half Kelly 10% 1.2%/bet ~11%
Quarter Kelly 5% 0.7%/bet ~3%

Growth rate of half-Kelly is ~60% of full Kelly; variance is ~25% — a favorable tradeoff.

Worked Example

Bankroll = $10,000, model says Brazil 60% win, odds = 1.80

Full Kelly: f = 0.167, stake = $1,670
Half Kelly: f = 0.083, stake = $830

Over 100 identical bets:
- Full Kelly expected bankroll: $10,000 × (1.02)^100 ≈ $72,400
- Half Kelly expected bankroll: $10,000 × (1.012)^100 ≈ $33,200

Full Kelly grows faster but with much higher variance.

Code Snippet

def half_kelly_stake(bankroll, model_prob, bookie_odds, fair_odds=None):
    """
    Calculate half-Kelly stake for a value bet.
    """
    b = bookie_odds - 1
    q = 1 - model_prob
    f_full = max((model_prob * b - q) / b, 0)
    f_half = f_full * 0.5
    stake = bankroll * f_half
    ev = model_prob * bookie_odds - 1
    return {
        'full_kelly_fraction': f_full,
        'half_kelly_fraction': f_half,
        'stake': stake,
        'stake_pct': f_half * 100,
        'expected_value': ev,
        'edge': (bookie_odds / fair_odds) - 1 if fair_odds else None
    }

# Example
result = half_kelly_stake(
    bankroll=10000,
    model_prob=0.60,
    fair_odds=1/0.60,
    bookie_odds=1.80
)
print(result)
# {'full_kelly_fraction': 0.167, 'half_kelly_fraction': 0.083,
#  'stake': 833.33, 'stake_pct': 8.3, 'expected_value': 0.08, 'edge': 0.08}

Pitfalls

  • Small sample distortion: With only 64 World Cup matches, actual results will deviate significantly from theoretical growth. Don't overinterpret short-term results.
  • Bankroll changes stakes: After a losing streak, half-Kelly stakes shrink proportionally. This is correct behavior but can feel counterintuitive.
  • Model must be well-calibrated: If the model systematically overestimates win probabilities, half-Kelly will still overbet relative to true edge.
  • Consider a maximum stake cap: Never bet more than 5% of bankroll on a single wager, even if Kelly suggests otherwise.

See Also