What Fractional Kelly Actually Buys You
Full Kelly maximizes the long-run growth rate of a bankroll, which is a genuinely optimal thing to do and almost nobody does it. The standard advice is to bet some fraction of it, usually a half, and the standard justification is that full Kelly is “too volatile”.
That is true and it is vague. Here is the actual shape of the trade, measured with keeks over 2,000 bets, 60 seeds, a real 10% edge at even money.
The growth curve
For a bet sized at f times the Kelly fraction, long-run growth relative to full Kelly follows
growth(f) / growth(1) = f * (2 - f)
A parabola peaking at f = 1 and hitting zero at f = 2. Simulated against theory:
| multiple of Kelly | measured | f(2 - f) | median drawdown | median final |
|---|---|---|---|---|
| 0.25x | 0.429 | 0.438 | 41% | 73,784 |
| 0.50x | 0.734 | 0.750 | 68% | 1,566,100 |
| 0.75x | 0.915 | 0.938 | 85% | 9,554,231 |
| 1.00x | 0.970 | 1.000 | 94% | 16,659,799 |
| 1.25x | 0.900 | 0.938 | 98% | 8,217,223 |
| 1.50x | 0.702 | 0.750 | 100% | 1,128,970 |
| 1.75x | 0.374 | 0.438 | 100% | 42,324 |
| 2.00x | -0.086 | 0.000 | 100% | 422 |
From a starting bankroll of 1,000.

The measured curve tracks f(2-f) closely, running a little under it because these are medians over finite runs rather than asymptotic growth rates.
Two things fall out of that shape immediately.
Half Kelly costs you a quarter of your growth. Not half. The parabola is flat near its peak, so giving up half your stake gives up only 25% of your growth rate, and the measurement agrees at 0.734.
Double Kelly grows at zero. Not “grows slowly” or “is risky”: the expected log growth of betting twice the Kelly fraction is exactly nothing, and over 2,000 bets with a real, persistent 10% edge the median outcome is 422 dollars from a starting 1,000. You had a genuine edge on every single bet and you lost 58% of the bankroll.
The asymmetry is the whole argument
Look at 0.5x and 1.5x. They are the same distance from optimal, and the growth curve says they cost the same: f(2-f) gives 0.75 for both, and the simulation measures 0.734 and 0.702.
Now look at what each one did to get there.
0.5x Kelly growth 0.734 median drawdown 68% median final 1,566,100
1.5x Kelly growth 0.702 median drawdown 100% median final 1,128,970
Identical growth, and one of them spent the run at a complete drawdown from its high-water mark. That is the case for fractional Kelly stated as sharply as I know how to state it: misjudging your edge downward and misjudging it upward cost the same growth, and wildly different risk.
Which matters because you are always misjudging your edge. Kelly’s fraction is computed from a probability you estimated, and the estimate error is the risk you actually carry. If your true edge is half what you think, betting full Kelly on your estimate is betting double Kelly, and you are at the zero-growth point without ever having chosen to gamble.
Betting half of your estimate means that being wrong by a factor of two lands you on full Kelly rather than on the cliff. You are buying insurance against your own model, and the premium is 25% of a growth rate you were never going to realize anyway.
The layered version
keeks stacks several safeguards, and they are worth separating because they do different jobs:
- Fractional Kelly scales the stake by a constant. Pure growth-for-risk, the curve above.
- A probability gate (
min_probability) refuses to bet at all below some confidence. - A drawdown-adjusted fraction scales the stake by how far you already are from the high-water mark.
- A maximum safe bet clamps the absolute stake regardless of what the formula says.
The important property they share is that none of them changes the sign of the decision. Every one scales a stake the formula already decided was positive, or refuses to bet at all. None of them can flip a bet from one side to the other, and that separation is worth preserving deliberately: the edge decision is a model question, the size decision is a risk question, and mixing them makes both harder to reason about.
from keeks.binary_strategies import FractionalKellyCriterion
strategy = FractionalKellyCriterion(payoff=1.0, loss=1.0,
transaction_cost=0.0, fraction=0.5)
fraction is constrained to (0, 1], which is the library declining to help you find the right-hand side of that parabola. Given that the right-hand side contains a point where a real edge produces no growth at all, that seems like the correct place to put a guard rail.
What I would use
Half Kelly as a default. It costs a quarter of the growth rate, it halves the stake, and it means a factor-of-two error in your edge estimate leaves you at full Kelly rather than at zero growth.
Less than that if the edge is estimated rather than known. Quarter Kelly still captures 43% of the growth and cuts the median drawdown to 41%. That is a defensible trade if your probabilities come from a model you have not validated out of sample.
Never more than full Kelly, on purpose or by accident. The accident is the common one: full Kelly on a doubled edge estimate is double Kelly on the real one.
Running it
from keeks.bankroll import BankRoll
from keeks.binary_strategies import FractionalKellyCriterion
from keeks.simulators.repeated_binary import RepeatedBinarySimulator
bank = BankRoll(initial_funds=1000.0, percent_bettable=1.0, max_draw_down=1.0)
strategy = FractionalKellyCriterion(payoff=1.0, loss=1.0, transaction_cost=0.0, fraction=0.5)
sim = RepeatedBinarySimulator(payoff=1.0, loss=1.0, transaction_costs=0.0,
probability=0.55, trials=2000, seed=0)
sim.evaluate_strategy(strategy, bank)
print(bank.total_funds)
pip install keeks==0.6.0.
Stay in the loop
Get notified when I publish new posts. No spam, unsubscribe anytime.