How many SNGs before your ROI means anything?

Every tracker — Tourney Manager then, Holdem Manager or PokerTracker now — will happily print an ROI after your first ten games. The number is real arithmetic and almost meaningless. The question is how many tournaments you need before it tells you something about your play rather than about the deck.

Rather than quote a rule of thumb, I simulated it. The script is short and is published here so you can change the assumptions.

Setup

  • 9-max SNG, $10 + $1, prize pool $90 paid 50 / 30 / 20 ($45 / $27 / $18).
  • A player is defined only by the probability of finishing 1st, 2nd and 3rd; everything else is a non-cash. No ICM, no skill model — just a finish distribution.
  • For each player type, draw 4,000 independent samples of n tournaments and record the ROI measured in each sample.
PlayerP(1st)P(2nd)P(3rd)ITMTrue ROI
Solid winner16%13%12%41%+17.0%
Marginal winner14%12%12%38%+6.4%
Break-even13%12%11%36%+0.6%
Loser11%11%11%33%–10.0%

Results

The table gives the 5th and 95th percentile of measured ROI — the band that 90% of samples fall into — and the share of samples in which a player with a positive true ROI measured a negative one.

Playern5th pct95th pctMeasured < 0
Solid winner (+17.0%)100–8.4%+43.2%13%
300+2.3%+31.7%3%
1,000+8.7%+25.0%0.1%
3,000+12.4%+21.6%0%
Marginal winner (+6.4%)100–18.2%+31.7%35%
300–8.1%+20.5%24%
1,000–1.2%+14.5%9%
3,000+1.8%+10.8%1%
Break-even (+0.6%)100–23.1%+25.2%50%
300–13.3%+14.5%48%
1,000–7.1%+8.3%46%
3,000–3.8%+5.0%42%
Loser (–10.0%)100–32.9%+12.9%77%
300–23.1%+3.4%90%
1,000–17.4%–2.8%99%
3,000–14.1%–5.7%100%
Marginal winner (true ROI +6.4%): 90% band of measured ROI by sample size 0%–20%+20% true ROI +6.4% n = 100 n = 300 n = 1,000 n = 3,000
Each bar spans the 5th–95th percentile of measured ROI. Only at 1,000+ games does the band stop straddling zero.

What to take from it

  • 100 games tell you almost nothing. A genuinely good player (+17%) shows a losing record one time in eight. A marginal winner shows a loss more than a third of the time.
  • 300 games separate good from bad, not good from mediocre. The solid winner's band is clear of zero; the marginal winner's still straddles it.
  • Around 1,000 games a +6% player can be fairly confident he is not a loser — but his measured ROI is still anywhere from –1% to +14%, which is the difference between "stay at this level" and "move up".
  • Break-even players never find out from ROI alone. Even after 3,000 games, 42% of samples are negative. That is why finish distribution matters more than ROI for diagnosis: a 4th-place spike is visible in 300 games; a 0.6% edge is not visible in 3,000.

Two caveats. Real finish distributions are not independent draws — table selection, tilt and time of day all cluster — so real variance is somewhat higher than this. And the rake here is 9%; at 10% the break-even player becomes a loser and the bands shift down by about a point.

Code

Python 3, no dependencies. Change the players dictionary to your own finish distribution. Runs in about a minute.

def roi_true(p1,p2,p3):
    ev = p1*PAY[1]+p2*PAY[2]+p3*PAY[3]
    return (ev-(BUYIN+FEE))/(BUYIN+FEE)

def sample(p1,p2,p3,n):
    tot=0.0
    for _ in range(n):
        x=random.random()
        if x<p1: tot+=PAY[1]
        elif x<p1+p2: tot+=PAY[2]
        elif x<p1+p2+p3: tot+=PAY[3]
        tot-=(BUYIN+FEE)
    return tot/(n*(BUYIN+FEE))

Full script: sng_sim.txt.