Is This Baccarat Roadmap Data Actually Real? 7 Statistical Tests We Ran On Ourselves

📅 2026-10-27 ⏱️ 13 min read ✍️ BaccAI Team 🏷️ Data Audit
Our previous article on baccarat prediction data rested on "2 million hands of real roadmaps." This one is about what happened next: we re-audited that dataset and found it was programmatically generated.

That's not a story to be embarrassed about - it's the opposite. If a dataset can pass 7 statistical tests, you should know how to catch it. The complete method is published here so you can audit any dataset claiming to be real roadmaps.

Contents

  1. How the dataset gave itself away
  2. Tests 1-3: Structural regularity
  3. Tests 4-5: Autocorrelation and streak frequency
  4. Test 6: The decisive proof - a direct independence violation
  5. Test 7: Position effects and shoe length distribution
  6. A 5-step audit workflow for any dataset
  7. Why this matters as much as picking the right software

1. How the dataset gave itself away

The dataset was evo_data.csv, a simple format: one shoe per row, second column a string of 0s and 1s (0 = Player, 1 = Banker). Its scale:

32,634
shoes
1,822,431
hands
49.30%
Banker share
50.70%
Player share

At first glance this is a very presentable dataset: large enough, with a Banker/Player split close to the theoretical value (about 49.3% Banker given the house edge). Run the most basic sanity check and it passes.

But after 7 more detailed tests, 6 of them pointed the same way: this was generated by code.

Overview of 7 statistical tests, 6 pointing to synthetic data
7 test results: only test 3 (window variance) looks like real data
Correction to the previous article: The "2 million hands, 5 live casinos, 365 days of continuous collection" in the Baccarat Prediction Data Guide does not correspond to this dataset's actual provenance. We've added a note at the top of that article. The specific conclusions drawn from this dataset (streak-following at 47.08% win rate, anti-streak at 52.92%, and so on) don't hold either, because the data was never real hands to begin with. This is our correction, and we wanted it stated clearly up front.

2. Tests 1-3: Structural regularity

Test 1: Geometricity of the run-length distribution

Split each shoe into runs of identical consecutive results. Under independence, run lengths follow a geometric distribution - but real data fluctuates. Length-1 runs at 50% and length-2 at 25% is only the trend; real proportions wobble by several percentage points.

This dataset gave:

Run length LCountShareRatio to previousGeometric theory
1467,24150.4139%-50.0000%
2231,76425.0066%0.496025.0000%
3115,59612.4725%0.498812.5000%
457,0136.1515%0.49326.2500%
528,1113.0331%0.49313.1250%
613,9801.5084%0.49731.5625%

Ratios of 0.4960 / 0.4988 / 0.4932 / 0.4931 / 0.4973 - all six share-to-share ratios land between 0.49 and 0.50. A real sample of 1.8 million hands does not achieve that consistency.

Run length distribution actual vs geometric theory
Actual shares sit almost exactly on the geometric curve, L=1 through L=6

Test 2: Run-length transition matrix

Next, look at the transition matrix: given the previous run had length L, what is the next run's length? Real shoes show all sorts of structure. This dataset showed strict geometric decay in every single row:

L=1 -> [227072, 112618, 56521, 27994, 13581, 6845]
       ratios: 0.496   0.502   0.495   0.485   0.504

L=2 -> [112935, 55759, 27943, 13652, 6717, 3311]
       ratios: 0.494   0.501   0.489   0.492   0.493

L=3 -> [55901, 28145, 13984, 6855, 3370, 1722]
       ratios: 0.504   0.497   0.490   0.492   0.511

Six rows, all the same. That's not a property of card shoes. It's a property of a generator.

Test 3: Cross-shoe variance of window Banker share

This one we deliberately designed to be easy to pass. We measured how much the Banker share in the first 10 and last 10 hands of each shoe varies across all 32,634 shoes, and compared it to what pure randomness would produce.

First 10 hands: cross-shoe standard deviation 15.52%; last 10 hands: 15.99%; pure-random theoretical value: 15.81%.
All three line up -> this test passes. No forced balancing within windows.

Why include a passing test? Because if all 7 failed, you'd reasonably suspect we were reverse-engineering a conclusion. The honest version shows the passing test too - real data should show real randomness, and this one behaved exactly as expected, which validates the framework itself.

3. Tests 4-5: Autocorrelation and streak frequency

Test 4: Positional autocorrelation

Compute P(hand i = hand i+k). In real shoes this sits near 50%, drifting slightly with sampling noise. Across 13 different k values:

Shift kMatch rate95% CIContains 50%?
150.0404%[49.9671%, 50.1136%]Yes
249.5663%[49.4924%, 49.6402%]No
349.6029%[49.5283%, 49.6775%]No
449.7829%[49.7075%, 49.8582%]No
850.7412%[50.6628%, 50.8197%]No
950.3791%[50.2998%, 50.4584%]No
2050.0218%[49.9311%, 50.1124%]Yes

Several confidence intervals exclude 50%, and the direction is systematic (k=2,3,4 low; k=8,9 high). At a sample size of 1.8 million, consistency like this cannot be sampling noise - it reflects a structural bias baked into the data.

Test 5: Streak frequency vs the independent expectation

Under full independence, the expected number of runs of length L has a known value. Actual versus expected:

Run length LActualIndependent expectationRatio
1467,2411,822,4310.256x
2231,764911,0370.254x
3115,596455,5180.254x
457,013227,8040.250x
528,111113,9470.247x
613,98057,0070.245x
712,74428,5260.447x
822114,2770.015x

Ratios sit at 0.25x for L=1 through L=6, then jump to 0.447x at L=7 and collapse to 0.015x at L=8. A tidy tail that suddenly fractures like that is a data-processing artefact, not card shoes.

4. Test 6: The decisive proof - a direct independence violation

If the earlier tests are only "highly suspicious", this one is not defensible.

The logic is simple. If hands are independent, then after N consecutive identical results, the next hand should still be about 50% likely to continue. Seven Bankers in a row doesn't make the eighth more likely to be a Banker - or less likely. Each hand is an independent coin flip.

Measured result:

Run continuation rate exactly 0.0000% for all streak lengths
Continuation after 3+ identical results is exactly 0.0000% - 200,000 chances, zero occurrences
Streak lengthSampleNext hand continuesReal shoes would be
After 3111,5050.0000%~50%
454,9290.0000%~50%
527,0090.0000%~50%
613,4650.0000%~50%
712,4840.0000%~50%
The runs in this dataset were cut artificially.

Pull any three 7-run examples from the sample and it's obvious:
01110111[0000000]1001011
10111011[0000000]10
00111[0000000]1110110

Every 7-run immediately follows a 4-run, and every run boundary flips the colour. That is not a property of card shoes. It's a property of the segmentation code.

Incidentally, this also explains the absurd "anti-streak wins 95% of the time" result we produced earlier. Running a strategy backtest on synthetic data measures how strong the generator's segmentation logic is, not how accurate a strategy is. Treating such output as evidence about the game is treating a data artefact as a market pattern.

5. Test 7: Position effects and shoe length distribution

Position effects within a shoe

If the data came from real shoes, the closer to the shuffle the composition gets more unusual and card counting becomes more valuable. Real data should show strategy performance differing between the start and end of a shoe.

Measured: continuation rate after 5 in a row, across the four quarters of a shoe, was 0.000% / 0.000% / 0.000% / 0.000%. Identical start to finish - consistent with "generated by a fixed rule", inconsistent with "harvested from real shoes".

Shoe length distribution

Shoe lengths run from 50 to 70 hands in a smooth bell shape (2,230 shoes at 50, 1,793 at 60, 5 at 70). Nothing obviously wrong here, but nothing that carries the signature of a real shoe either.

6. A 5-step audit workflow for any dataset

If you do any analysis on historical roadmaps - your own, someone else's, or bundled with a tool - run these in order. Every step is a plain statistical test. No AI, no toolkit, one Python script.

Step 1 - Basic sanity
Is the Banker/Player/tie split near 45.9% / 44.6% / 9.5% (8 decks)? Is the shoe length distribution plausible? Any illegal characters? Most datasets pass this.
Step 2 - Run length distribution
Check whether the share-to-share ratios are constant. Real data wobbles by a few points; constant to three decimals means generated.
Step 3 - Independence test
The continuation rate after the longest run. Real data must sit near 50%. Synthetic data commonly shows exactly 0% or 100%.
Step 4 - Autocorrelation and periodicity
Match rates across several shifts k, with 95% confidence intervals. Real shoes include 50% everywhere; systematic deviation means a baked-in bias.
Step 5 - Position effects
Split each shoe into quarters and compare. Real shoes show a gradient (counting is worth more near the end); identical results mean there's no shoe structure at all.
The single cheapest test: if a dataset's "rate of continuing after the longest streak" is exactly 0% or 100%, no other result matters - that dataset cannot support any statistical conclusion. It takes ten seconds to check and screens out most synthetic data.

7. Why this matters as much as picking the right software

Our previous article covered how to choose baccarat prediction software (6 criteria). This one adds another, more fundamental one: the tool itself may be fine while the data it runs on is fake.

Returning to the previous article's core argument, with a correction to the wording. We said:

"Most 'high win rate strategies' lose 8-15 percentage points when you swap the test window."
"The genuinely valuable work is getting the statistics right, not making the model more complex."

Those claims aren't wrong. But there was one thing we didn't do: verify the data was real in the first place. If the data is synthetic, then "win rates drop 8-15 points" could itself be a generator artefact - you cannot run a robustness test in a fake world.

So the correct order is:

  1. Verify the data - 7 tests, 5 minutes
  2. Then verify the method - does the backtest hold across disjoint windows?
  3. Only then the tool - latency, privacy, free tier come last

Get the order wrong and you end up doing due diligence on a precisely calculated hallucination.

Want to run these 7 tests on your own data?

BaccAI offers a 10-minute free trial, no card required. The audit script and decision criteria are published, so you can run it yourself and decide for yourself.

Start free trial →
Finally: if some tool, course, or community tells you "we have 2 million hands of exclusive real data," run step 3 above. Ten minutes, and you'll have your answer.

Generating synthetic data for demos and teaching is not inherently wrong - plenty of people do it legitimately. The problem is only ever presenting demo data as real data to support profit claims. Distinguishing the two costs almost nothing. Not distinguishing them costs the most.