The Kelly Criterion

Also called Fortune’s Formula …

It is the one thing every good poker player should know by heart. And, maybe even more important, act by it. How often did it happen that a great poker player got broken by a single hand, just because he thought he had an edge and therefore invested more in that hand than he could afford to? Plenty of times.

The idea of the Kelly Criterion is that you should only wager a certain percentage of your entire bankroll (= all the money you can afford to bet in a poker game in the foreseeable future). You could employ some fancy mathematics to calculate what that percentage should be. But these days it is probably easier to write a small computer program and simulate what happens to your bankroll over time.

There are three basic parameters that are important to know:

  1. How good a poker player are you?
  2. How quickly do you want to get rich?
  3. How high a risk are you willing to take to go broke?

Here is the setup for our computer experiment: Assume you have a certain bankroll R. Also assume, that you must have at least $4 to participate in a poker game. A single round of our experiment consists in you sitting down at the poker table with f*R dollars, where f is the fraction of your bankroll you are willing to risk in a single round. You play until you lost these f*R dollars, or until you doubled up, i.e. you stop the game as soon as you have at least 2*f*R dollars in front of you. You repeat these rounds until you lost your entire bankroll (i.e. until your bankroll is less than the minimum buy-in of $4), or until you have played 100 rounds. We furthermore assume that you are a great poker player. In particular, we assume that the chances of you doubling up in a round are 60%:40%. We repeat the experiment 1000000 times with a starting bankroll of R=$100. This leads to the following numbers:

f 1% 5% 10% 15% 20% 25% 30% 40% 50% 77%
chances of going broke 0.01% 0.01% 0.06% 0.49% 2.22% 6.8% 13.24% 37.86% 67.96% 100%
average bankroll if not broke $180 $255 $696 $1876 $5K $13K $38K $343K $3116K

According to these numbers, if you are risk averse, you probably should not invest more than 15% of your entire bankroll. If you are VERY risk averse, you invest only 5% of your entire bankroll. If you want to get rich quickly or otherwise die young, you may even choose to invest as much as 40% of your bankroll. All of this is better than investing your entire bankroll! Investing 77% of your bankroll will lead soon to bankruptcy.

Another factor we have not accounted for is that you might lose some of that 60%:40% edge the more money is at risk in a game (because the more money is in a game, the better the players usually are). So you might want to rerun these simulations with an 55%:45% edge etc. Here is the Java code for running the simulation:

package kelly;

public class Main {

    public static double kellytrace(double capital, double oddsOfWinning,
            double f, int rounds)
      for (int i=0; i<rounds; i++) {
        double betsize = Math.floor(capital * f);
        if (betsize < 4) betsize = 4;
        if (capital < betsize) return 0.0;
        double cashoutsize = betsize;
        double r = Math.random();
        if (r <= oddsOfWinning)
          capital = capital + cashoutsize;
          capital = capital - betsize;
        if (capital < 4.0) return 0.0;
      return capital;
    public static void kelly(double capital, double oddsOfWinning, 
            double f, int rounds, int numExperiments)
      int won = 0;
      int lost = 0;
      double won_capital = 0.0;
      for (int i=0; i<numExperiments; i++) {
        double result = kellytrace(capital, oddsOfWinning, f, rounds);
        if (result == 0.0) lost++; else won++;
        won_capital += result;
      System.out.println("Lost: "+lost);
      System.out.println("Won: "+won);
      double p = Math.ceil(10000.0*(((double) lost)/((double)won+lost)))/100.0;
      System.out.println("probability of going broke => "+p+"%");
      System.out.println("final capital on average: "+((won_capital)/won));

    public static void main(String[] args) {
      kelly (100, 0.6, 0.1, 100, 1000000);

See you at the tables!


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )


Connecting to %s

%d bloggers like this: