Bankroll Management with Keeks: Drawdown-Adjusted Kelly
In our previous posts, we explored the Kelly Criterion and Fractional Kelly strategies. Today, we’ll examine a more dynamic approach: Drawdown-Adjusted Kelly, which automatically adjusts bet sizing based on recent performance to limit drawdowns.
What is Drawdown-Adjusted Kelly?
Drawdown-Adjusted Kelly is a modified version of the Kelly Criterion that reduces bet sizes when your bankroll experiences drawdowns (declines from peak value). The core idea is simple: when you’re winning, bet closer to full Kelly; when you’re losing, reduce your bet size to protect your bankroll.
This approach addresses one of the main psychological challenges of Kelly betting: the significant drawdowns that can occur even when following the strategy correctly.
How Drawdown-Adjusted Kelly Works
The formula for Drawdown-Adjusted Kelly builds on the standard Kelly formula by incorporating a drawdown factor:
Adjusted Kelly bet = (1 - d/D) * Kelly bet
Where:
dis the current drawdown (as a percentage)Dis the maximum acceptable drawdown (as a percentage)Kelly betis the standard Kelly bet size
As your drawdown approaches your maximum acceptable level, your bet size approaches zero. This creates an automatic “safety brake” that helps prevent catastrophic losses during losing streaks.

The graph above shows how the bet size decreases as the drawdown increases, providing an automatic risk management mechanism.
Pros of Drawdown-Adjusted Kelly
- Automatic risk management: Naturally reduces exposure during losing streaks
- Psychological comfort: Smaller drawdowns make it easier to stick with the strategy
- Customizable risk tolerance: Can be tuned to your personal drawdown tolerance
- Preserves capital: Better protects your bankroll during extended downturns
- Recovers faster: Smaller drawdowns mean less ground to make up
Cons of Drawdown-Adjusted Kelly
- Suboptimal growth: Reduces long-term growth rate compared to full Kelly
- Slower recovery: May take longer to recover after drawdowns due to smaller bet sizes
- Parameter sensitivity: Results depend heavily on your maximum drawdown parameter
- Complexity: More complex to implement and understand than standard Kelly
Understanding Drawdowns in Kelly Betting
Before implementing Drawdown-Adjusted Kelly, it’s important to understand how drawdowns behave with different Kelly fractions:

As you can see, the average maximum drawdown increases significantly as you increase the Kelly fraction. This is why managing drawdowns is so crucial for sustainable bankroll management.
Implementing Drawdown-Adjusted Kelly with Keeks
The keeks library provides a DrawdownAdjustedKelly strategy that automatically reduces bet sizes during drawdowns. Let’s compare it to standard Kelly approaches:
from keeks.bankroll import BankRoll
from keeks.binary_strategies.kelly import KellyCriterion
from keeks.binary_strategies.fractional_kelly import FractionalKellyCriterion
from keeks.binary_strategies.drawdown_kelly import DrawdownAdjustedKelly
from keeks.simulators.repeated_binary import RepeatedBinarySimulator
# Simulation parameters
PAYOFF = 1.0
LOSS = 1.0
PROBABILITY = 0.55
TRIALS = 1000
# Create strategies to compare
strategies = {
'Full Kelly': KellyCriterion(payoff=PAYOFF, loss=LOSS, transaction_cost=0),
'Half Kelly': FractionalKellyCriterion(payoff=PAYOFF, loss=LOSS, transaction_cost=0, fraction=0.5),
'Drawdown-Adjusted': DrawdownAdjustedKelly(payoff=PAYOFF, loss=LOSS, transaction_cost=0, max_drawdown=0.2),
}
# Create the simulator
simulator = RepeatedBinarySimulator(
payoff=PAYOFF,
loss=LOSS,
transaction_costs=0,
probability=PROBABILITY,
trials=TRIALS
)
# Run and compare each strategy
for name, strategy in strategies.items():
bankroll = BankRoll(initial_funds=1000.0, max_draw_down=0.5)
simulator.evaluate_strategy(strategy, bankroll)
# Calculate max drawdown from history
peak = bankroll.history[0]
max_dd = 0
for value in bankroll.history:
if value > peak:
peak = value
elif peak > 0:
dd = (peak - value) / peak
max_dd = max(max_dd, dd)
print(f"{name}:")
print(f" Final bankroll: ${bankroll.total_funds:.2f}")
print(f" Maximum drawdown: {max_dd:.2%}")

The chart above compares the bankroll growth of Full Kelly, Half Kelly, and Drawdown-Adjusted Kelly strategies. Notice how Drawdown-Adjusted Kelly provides a smoother growth curve with fewer severe drawdowns.

This distribution chart shows the range of maximum drawdowns for each strategy. Drawdown-Adjusted Kelly significantly reduces the severity of drawdowns compared to Full Kelly.
Practical Applications
Drawdown-Adjusted Kelly is particularly useful in several scenarios:
- Professional gambling: Where preserving bankroll during downswings is critical
- Hedge fund management: Where investors may withdraw funds after significant drawdowns
- Personal investing: Where psychological comfort is important for sticking with a strategy
- High-volatility markets: Where drawdowns can be especially severe
Tuning the Maximum Drawdown Parameter
The maximum drawdown parameter (D) is the key to customizing this strategy to your risk tolerance. Here’s how to think about setting it:
- Conservative (D = 10-15%): For risk-averse investors or those with limited bankrolls
- Moderate (D = 15-25%): A balanced approach for most investors
- Aggressive (D = 25-40%): For those with high risk tolerance and large bankrolls
- Very Aggressive (D > 40%): Approaches standard Kelly behavior
Remember that setting D too low will significantly reduce your long-term growth rate, while setting it too high defeats the purpose of drawdown adjustment.
Implementing Drawdown-Adjusted Kelly for Sports Betting
Here’s a practical example for sports betting using keeks:
from keeks.bankroll import BankRoll
from keeks.binary_strategies.kelly import KellyCriterion
from keeks.binary_strategies.drawdown_kelly import DrawdownAdjustedKelly
# Standard -110 odds: risk $110 to win $100
PAYOFF = 100 / 110 # ~0.91
LOSS = 1.0
win_probability = 0.55
# Set up bankroll - currently at $10k, was at $12k peak
bankroll = BankRoll(initial_funds=12000.0, max_draw_down=0.2)
# Simulate the drawdown by updating current funds
bankroll._total_funds = 10000.0
# Compare standard vs drawdown-adjusted Kelly
standard_kelly = KellyCriterion(payoff=PAYOFF, loss=LOSS, transaction_cost=0)
adjusted_kelly = DrawdownAdjustedKelly(payoff=PAYOFF, loss=LOSS, transaction_cost=0, max_drawdown=0.2)
standard_bet = standard_kelly.evaluate(win_probability, bankroll.total_funds)
adjusted_bet = adjusted_kelly.evaluate(win_probability, bankroll.total_funds)
print(f"Current drawdown: {(12000 - 10000) / 12000:.2%}")
print(f"Standard Kelly bet: ${standard_bet:.2f}")
print(f"Drawdown-adjusted Kelly bet: ${adjusted_bet:.2f}")
Conclusion
Drawdown-Adjusted Kelly represents a sophisticated evolution of the Kelly Criterion that addresses one of its biggest practical challenges: managing drawdowns. By automatically reducing bet sizes during losing streaks, it creates a more psychologically sustainable strategy that most people can stick with over the long term.
While it sacrifices some theoretical growth rate, the improved risk management and reduced drawdowns often make it a superior choice for real-world betting and investing.
In our next post, we’ll explore another approach to optimal bankroll management: OptimalF, which focuses on maximizing the geometric growth rate of your bankroll.
Stay in the loop
Get notified when I publish new posts. No spam, unsubscribe anytime.