← Lab Blog

Does “hot-number” filtering actually beat Tzoker? A fair-null stress test

methodologybacktestingstatisticstzoker

The seductive idea

Here’s a strategy that feels like it should work.

Take every Tzoker draw and sort it: st1 < st2 < st3 < st4 < st5. Now, for each of those five positions, look back through history and keep only the values that show up more often than a fair 5/45 lottery would produce. Call the ratio lift:

Lift = (how often winners land in our kept set) ÷ (how often random combos do)

Apply all five position-filters at once (AND them together) and you get a reduced pool — a smaller slice of the 1,221,759 possible combinations that, supposedly, catches winners at a higher rate than its size would suggest. A lift of 1.20 would mean winners pass 20% more often than random. Tempting, right?

You can dress this up with clever weighting — count recent draws more heavily (“recency”), reward values that are steady over time (“stability”), even chase “overdue” numbers. But underneath all of it sits one number: lift. And lift, it turns out, is a liar unless you interrogate it properly.

(No jackpot promise. No “I cracked the lottery” nonsense — as always here.)

Why in-sample lift is guaranteed to fool you

The first trap is obvious once you see it. If you pick the values that were over-represented, then measure how over-represented your picks are… of course the answer is “very.” You selected for it. In-sample lift above 1 is not evidence of anything — it’s arithmetic. A filter tuned on history will always look brilliant on that same history.

So the honest crowd moves to walk-forward backtesting: train the filter on draws up to some date, then measure lift only on the future draws it never saw. Slide the window forward, repeat, add it all up. If the lift survives out-of-sample, surely that’s real?

On our Tzoker history (3,305 draws) the walk-forward out-of-sample lift comes out to 1.16. Above 1. Persistent across windows. It looks like a genuine edge.

It isn’t. And here’s the test that proves it.

The trap inside the trap: the procedure invents lift from nothing

Here’s the subtle part almost every lottery “system” misses.

The act of selecting the strongest values is itself a source of lift — even on a perfectly fair, perfectly unpredictable lottery. Finite histories wobble around their true probabilities by pure chance. If you always grab the values that happened to wobble upward, and those wobbles are even slightly sticky from one window to the next, your walk-forward lift drifts above 1 — with zero real signal underneath.

So the question isn’t “is the out-of-sample lift above 1?” It’s:

How much lift would this exact procedure produce on a lottery we know is fair and unpredictable?

If a fair lottery run through our machine also spits out 1.16, then 1.16 means nothing.

The fair-null test

So we build the control every predictive claim needs and almost never gets:

  1. Simulate a fair 5/45 lottery — draws generated by an honest random pick, no memory, no pattern, provably unpredictable.
  2. Run the exact same train → select → walk-forward pipeline on it.
  3. Record the out-of-sample lift.
  4. Do this 300 times to build the null distribution — the range of lifts the procedure manufactures from pure chance.
  5. Drop the real Tzoker result into that distribution and see where it lands.

The core loop is just a few lines:

def walk_forward(hist):
    hits = expected = 0.0
    for t in range(TRAIN_START, len(hist), STEP):
        sets = select_sets(hist[:t])        # keep top lift values per position
        test = hist[t:t+STEP]               # unseen future draws
        passed = np.ones(len(test), bool)
        for i in range(5):
            passed &= np.isin(test[:, i], list(sets[i]))
        null = tot_and_coverage(sets)       # what a fair pool would pass
        hits += passed.sum()
        expected += null * len(test)
    return hits / expected                  # out-of-sample lift

real = walk_forward(real_history)
null = [walk_forward(simulate_fair_5_45(len(real_history))) for _ in range(300)]

The result

Out-of-sample lift
Real Tzoker history 1.16
Fair-null average 1.008
Fair-null 95th percentile 1.204
Fair-null spread (5th–95th) 0.83 – 1.20

Where does the real 1.16 land in the fair-lottery null?

  • 89th percentile — a fair, unpredictable lottery beats 1.16 about 1 time in 9 by luck alone.
  • z = +1.36, empirical one-sided p ≈ 0.11.

Verdict: indistinguishable from chance. Not significant even before you account for the dozens of knobs (window sizes, set sizes, weightings, thresholds) that were tried to find this configuration — and correcting for that pushes it further into irrelevance.

Look again at the null row: a provably fair lottery, run through this procedure, produces an average lift of 1.008 and reaches 1.20 a full 5% of the time. So a filter proudly reporting “out-of-sample lift = 1.2!” has produced… exactly what randomness produces. The edge was never in the lottery. It was in the selection.

The tell we should have noticed earlier

There’s a poetic symmetry worth calling out. Methods like this usually reject the “overdue number” idea — correctly! — because a fair draw has no memory, so a number being “due” means nothing. But then the very same methods embrace the mirror image: weighting recent draws more heavily, betting that “hot” numbers stay hot. If the lottery has no memory, both are the gambler’s fallacy. You can’t use independence to kill one and ignore it for the other. The fair-null test is simply that principle made rigorous.

So is any of this useful? Yes — just not for prediction

None of this means the reduced-pool idea is worthless. It means we should be honest about what it actually buys:

  • You cannot predict a fair draw. Full stop. No amount of history tells you tomorrow’s numbers.
  • You can concentrate the structurally-plausible region so a smaller pool covers a proportional share of realistic combinations — useful if you’re going to play anyway and want efficient, non-degenerate coverage rather than random dartboard tickets. That’s a study tool, not a money machine. Lift ≠ profit; Tzoker stays a negative-expectation game no matter how you slice it.
  • The genuinely provable win is a covering guarantee — a fixed set built so that whatever the draw, at least one line shares 4 numbers with it. That’s a mathematical certainty, not a statistical hope, and it doesn’t pretend to predict anything. (We’ve written about the C(N,5,4) covering elsewhere.)

The takeaway

Every lottery filter you’ll ever meet reports a lift above 1. It has to — the selection procedure guarantees it. The only question that separates signal from self-deception is:

Does it beat the same procedure run on a lottery we know is fair?

For this “hot-position” filter on Tzoker, the answer is a clean no. And that’s not a disappointment — it’s the system working. An honest lab reports the mirages as loudly as the discoveries. If we ever do find a filter that clears the fair null with room to spare, you’ll know it survived the harshest test we can throw at it.

Method note: 5/45 space enumerated exactly (1,221,759 combinations); walk-forward with expanding training window from draw 2,500, 50-draw test steps; per-position sets of 13/17/17/17/13 values by lift, minimum 35 historical appearances; 300 simulated fair histories of matched length. The fair-null harness is reproducible and deterministic.