Half-Kelly

Summary

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 rate, 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.

Key Concepts

  • Full Kelly risk: A Kelly bettor has 1/3 chance of halving a bankroll before doubling it
  • Half Kelly risk: A half-Kelly bettor has only 1/9 chance of halving before doubling — dramatically safer
  • Growth tradeoff: Half-Kelly grows wealth more slowly but with much lower variance and drawdown risk
  • Quarter-Kelly: Some practitioners go even further (25%) for additional safety when model uncertainty is high
  • ** Kelly fraction selection**: The fraction chosen should reflect confidence in the probability estimates — more uncertain models should use smaller fractions
  • Fixed Kelly vs. dynamic: Some systems use a fixed fraction (e.g., always half-Kelly); others adjust the fraction based on model confidence or market conditions

Mathematical Comparison

Growth rate comparison (from Albion Research):

For a 60% win probability, even money bet (b=1):
- Full Kelly: f = 0.20, growth rate = 2.0% per bet
- Half Kelly: f
= 0.10, growth rate = 1.2% per bet
- Quarter Kelly: f* = 0.05, growth rate = 0.7% per bet

The growth rate of half-Kelly is about 60% of full Kelly, while variance is about 25% of full Kelly — a favorable tradeoff for most bettors.

Risk of ruin comparison:
- Full Kelly: 33% chance of halving before doubling
- Half Kelly: 11% chance of halving before doubling
- Quarter Kelly: ~3% chance of halving before doubling

Implementation Notes

The key practical consideration for Half-Kelly in the World Cup model:
1. Model probabilities must be well-calibrated — if the model systematically overestimates win probabilities, half-Kelly will still overbet
2. The Kelly stake = 0.5 × f × bankroll, where f comes from the full Kelly formula
3. With a small number of bets (64 World Cup matches), actual results will deviate significantly from theoretical — don't overinterpret short-term results
4. The bankroll should be large enough relative to individual stake sizes that Kelly doesn't produce absurdly large bets (e.g., a $10,000 bankroll with a 20% Kelly bet = $2,000 per match — reasonable for World Cup but might be too large for most bankrolls)

Python Implementation

def half_kelly_stake(bankroll, model_prob, fair_odds, bookie_odds):
    """
    Calculate half-Kelly stake for a value bet.

    Args:
        bankroll: Total betting bankroll
        model_prob: Model's estimated win probability
        fair_odds: De-vigged fair odds (1/model_prob if using model as truth)
        bookie_odds: Bookmaker offered odds

    Returns:
        Dictionary with stake size and EV information
    """
    b = bookie_odds - 1  # net odds received

    # Full Kelly
    q = 1 - model_prob
    f_full = max((model_prob * b - q) / b, 0)

    # Half Kelly
    f_half = f_full * 0.5

    # Stake
    stake = bankroll * f_half

    # EV of the bet
    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: Brazil 60% win prob, odds 1.80, $10,000 bankroll
result = half_kelly_stake(
    bankroll=10000,
    model_prob=0.60,
    fair_odds=1/0.60,  # 1.667
    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}

Notes

  • The client explicitly requires Half-Kelly — this is the standard approach for sports betting models
  • Kelly stakes are proportional to bankroll, so bankroll management is important: the model should track bankroll over time and adjust stake sizes
  • For World Cup: 64 matches over ~2 weeks, with potentially multiple bets per match day — Kelly can produce very aggressive stakes early in a tournament when bankroll is largest relative to remaining matches
  • Consider implementing a maximum stake cap (e.g., never more than 5% of bankroll on a single bet) to prevent overconcentration