Methodology

This page documents every step of my Lottery Truths model: what I measure, how I calculate it, where the data comes from, how I validated the results, and what alternative approaches I tested and rejected.

What I Measure and Why

Every analysis on this site uses a single metric: estimated return per dollar. For a given lottery draw, this number tells you how much of each dollar spent on a ticket you would mathematically expect to get back, on average, if you could play that exact draw thousands of times.

Per-dollar normalization is critical. Powerball tickets cost $2. Mega Millions tickets cost $5 (as of April 2025). Comparing jackpot sizes or raw odds without adjusting for what you actually pay is meaningless. A $500M Mega Millions jackpot at $5 per ticket can be a worse deal than a $300M Powerball jackpot at $2 per ticket. The only honest comparison divides everything by the ticket price so both games are on the same scale.

Most lottery comparison sites skip this step entirely. They present a static odds table, declare a winner, and move on. That approach ignores ticket price, ignores that the answer changes every draw, and ignores jackpot splitting. I do all three.


The Core Formula

For every historical draw, I compute estimated return per dollar using two methods, depending on whether actual ticket sales data is available.

When Ticket Sales Are Known (Poisson Splitting Model)

When I have actual sales data for a draw, I use a Poisson model to account for jackpot splitting. The logic: when a jackpot grows, ticket sales surge, and more tickets sold means a higher probability that multiple people match the winning numbers. Sharing the prize cuts its value per ticket. Ignoring this effect produces estimates that are systematically too optimistic at high jackpot levels.

The calculation works as follows. Let J be the jackpot value, N the number of tickets sold, p the probability of any single ticket hitting the jackpot, t the ticket price, and L the expected return from lower-tier prizes.

First, compute the expected number of jackpot winners:

λ = N × p

Then, the expected jackpot return per ticket, adjusted for splitting:

Jackpot EV per ticket = (J / N) × (1 − e−λ)

Finally, the per-dollar return:

Estimated return per dollar = (Jackpot EV + L − t) / t

A result of −$0.70 means you lose an estimated 70 cents of every dollar played. A result above $0.00 means the ticket is theoretically worth more than its price on paper (though your overwhelmingly likely outcome is still losing the full ticket cost).

When Ticket Sales Are Unknown (Fallback)

For draws where sales data is unavailable (some older historical records), I fall back to a naive formula:

Jackpot EV per ticket = p × J

This assumes you would be the sole winner, which overstates the jackpot's value at high sales volumes. It is a reasonable approximation for smaller jackpots (where few tickets are sold and splitting risk is negligible) but can overestimate return by $1.50 or more per dollar at billion-dollar jackpot levels.

Why Poisson?

The Poisson distribution models the number of independent events (jackpot winners) occurring in a fixed interval (one draw) when each event has a small but known probability. With hundreds of millions of tickets sold and odds around 1-in-300 million, the expected number of winners is typically between 0.3 and 1.5. The Poisson model handles this range well and is standard in the actuarial and probability literature for lottery analysis.

How large is the splitting effect in practice? During the $1.8B Powerball run in September 2025, the naive formula estimated a return of $3.60 per dollar. The splitting-adjusted estimate was $2.10, a difference of $1.50 per dollar. Across 116 Powerball draws in my test set, the naive formula overestimated return by an average of $0.08 per dollar. The gap is small for typical jackpots and enormous for headline jackpots.


Data Sources

Every number on this site traces back to a specific, verifiable source.

Historical Sales and Jackpots

Draw-by-draw sales and jackpot data was sourced from Lotto Report, which has tracked lottery sales data across multiple states for decades. I scraped multiple pages per game (covering different year ranges), parsed the HTML tables, deduplicated by draw date, and cross-referenced against officially published results. The resulting dataset covers 6,000+ draws going back to 1997.

Live Jackpot Data

Current jackpot information is fetched from the Multi-State Lottery Association (MUSL) API, which provides the official annuity and cash values for both Powerball and Mega Millions. This data is queried on a schedule and used to compute the estimated return for upcoming draws.

Official Odds and Rules

Jackpot probabilities and prize structures for each era were taken from the official published matrices on Powerball.com and MegaMillions.com.

Cash-Option Estimation

Historical sources did not record the actual cash value for most draws before April 2026. For those draws, I apply an estimated annuity-to-cash ratio of 58%, which is consistent with the historical average across varying interest-rate environments. From April 2026 onward, the MUSL API provides the actual advertised cash value, and I use that directly.


How I Handle Rule Changes

Both Powerball and Mega Millions have undergone major rule changes over the past three decades: different number matrices, different ticket prices, different prize structures. Treating all draws as if the same rules applied would produce meaningless results.

I define seven distinct eras across both games, each with its own ticket price, jackpot win probability, and lower-tier expected return:

Powerball Eras

Mega Millions Eras

Every per-draw calculation uses the era that was active on that draw date. A $1-era Powerball draw is never mixed with a $2-era draw in the same calculation. The per-dollar normalization ensures that results across eras are directly comparable on the same chart.


Predicting Ticket Sales for Upcoming Draws

For completed draws, I use actual reported sales from Lotto Report. For upcoming draws (where ticket sales are unknown), I predict the number of tickets that will be sold based on the current jackpot size.

The relationship between jackpot size and ticket sales is strong but nonlinear: sales rise slowly at low jackpots and exponentially at high jackpots. I model this with polynomial regression, fitting ticket sales as a function of jackpot size (in millions).

Model Selection Process

I did not simply pick a polynomial degree and call it done. I ran a systematic model selection process that tested 1-path, 2-path, and 3-path piecewise polynomial models with grid-searched thresholds across multiple polynomial degrees (linear, quadratic, cubic).

For multi-regime models (where different polynomials apply below and above a jackpot threshold), I searched over percentile-based thresholds in 5-percentage-point increments and tested every combination of polynomial degrees for each segment.

The key constraint: a multi-regime model was only adopted if it improved R-squared by at least 0.01 over the single-model baseline. This conservative gate prevents overfitting to noise in the training data.

Results


What I Tried That Did Not Work

A model is only as credible as the alternatives it was tested against. I spent considerable time evaluating approaches that ultimately did not improve on the polynomial baseline. Documenting them here is part of showing my work.

Google Trends as a Ticket-Sales Predictor

The hypothesis was intuitive: search interest in "Powerball" or "Mega Millions" should correlate with ticket-buying behavior, and adding Trends data might improve sales predictions beyond what jackpot size alone can provide.

I scraped Google Trends data at daily, weekly, and monthly granularity. I tested multiple feature sets (1-day prior, 3-day average, 7-day average) combined with jackpot size, calendar features (day of week, days since last jackpot reset), and various model architectures: Linear Regression, Polynomial Regression, Random Forest, and Gradient Boosting.

I evaluated every model using walk-forward validation (train on all data before a given date, predict the next period) to measure genuine out-of-sample accuracy rather than relying on in-sample fit, which overstates real-world performance.

The verdict was clear. For Powerball, the best Trends-augmented model (Random Forest with jackpot + Trends) achieved an in-sample R² of 0.98 but produced a negative walk-forward R², meaning it predicted worse than guessing the average. For Mega Millions, Trends added only +0.008 to in-sample R². In both cases, jackpot size alone was essentially sufficient. I dropped Trends from the production model.

Machine Learning Ensembles (Random Forest, Gradient Boosting)

These models achieved in-sample R² values above 0.98 for both games. Impressive, until you look at the walk-forward results: negative R² across the board. The models memorized the training data rather than learning the underlying relationship. The December 2025 Powerball run to $1.7B was an extreme outlier that no model trained on normal draws could have anticipated. The simpler polynomial, which makes fewer assumptions, generalizes far better.

Pooled-Era Dollar-Sales Model for Mega Millions

After the April 2025 ticket price increase from $2 to $5, the Mega Millions training set was small (around 100 draws). I tested whether pooling data from both the $2 and $5 eras (predicting dollar sales rather than ticket count, then dividing by ticket price) would produce a better model by leveraging the larger combined dataset. It did not clear the 0.01 R² improvement gate when evaluated on the current era.

Weighted Regression for Mega Millions

A variation on the pooling approach: give current-era ($5) draws three times the weight of older ($2) draws in the training data. The idea was to bias the model toward recent behavior while still benefiting from the larger dataset. This also failed to beat the current-era-only model at the 0.01 threshold.

Each rejected approach taught me something, but the lesson was consistent: simpler models with fewer assumptions outperform complex ones when the underlying data is noisy and the sample sizes are limited.


Validation Pipeline

Scraping lottery data from HTML tables is error-prone. Strikethrough text, revised figures, missing rows, and inconsistent formatting can silently corrupt a dataset. I run a multi-layered validation pipeline on every data refresh.

Data Integrity Checks

Known-Jackpot Spot Checks

I verify that several well-documented record jackpots appear in the dataset with correct values:

Each must be present and within a tolerance band of the documented value. If any are missing or incorrect, the validation run fails.

Random Spot Samples

Twelve draws per game are randomly selected and printed for manual inspection on each validation run, providing a sanity check beyond the automated rules.

Live Pipeline Quality Control

The automated update system (which runs on a schedule) performs its own independent checks before writing any data:

If any check fails, the system sends an alert and preserves the previous data rather than writing corrupted results.


Limitations and Assumptions

My model is transparent about what it does and does not account for.


Analysis by Colt Ramsey.