In one sentence
A Poisson process models events that happen at random moments but at a steady average rate, such as goals in a football match or bets hitting a price on the ladder.
How it works
The Poisson distribution tells you how many goals to expect in a whole match. The Poisson process adds time: it says goals arrive at a rate, say 2.7 per 90 minutes, and any slice of time gets its fair share of that rate. Thirty minutes left means an expected 0.9 goals.
This makes it the natural tool for in-play pricing. As the clock runs down, the expected goals left shrink, so the chance of "no more goals" rises and prices for unders shorten steadily. Traders call this time decay.
It also has a neat second face: the time between events follows an exponential distribution. That lets you ask how long until the next goal, or how long until your unmatched bet sees a trade at its price.
The maths
- Nt: the number of events (goals, trades) in a time window of length t.
- λ: the average rate of events per minute.
- t: the length of the time window in minutes.
- k: the number of events you are asking about.
- e: the constant 2.718...
In plain English: the expected count is rate times time, and the chance of nothing happening falls away exponentially as the window gets longer.
Worked betting example
A match was expected to have 2.7 goals. It is 0-0 at 60 minutes, and you assume the scoring rate is unchanged.
Expected goals in the last 30 minutes: 2.7 × 30 ÷ 90 = 0.9.
Chance of no more goals: e to the power −0.9 ≈ 40.7%. Fair odds on 0-0 (Under 0.5 goals) ≈ 2.46. Fair odds on Over 0.5 goals ≈ 1.69.
Fifteen minutes later, still 0-0 at 75 minutes:
Expected goals left: 2.7 × 15 ÷ 90 = 0.45.
Chance of no more goals: e to the power −0.45 ≈ 63.8%. Fair Under 0.5 odds ≈ 1.57, fair Over 0.5 odds ≈ 2.76.
So a trader who backed Under 0.5 at 2.46 and nothing happened could lay at around 1.57. But one goal in those 15 minutes and the Under bet loses outright. The time decay is the reward for carrying that risk, not free money.
Where it's good
- In-play football goal markets: over/under, correct score and next goal.
- Modelling trade arrivals at a price level to estimate how fast queues clear.
- Estimating the chance of at least one event (a wicket, a break of serve) in a window.
- A clean baseline that more detailed models can be compared against.
Limitations and pitfalls
- Goal rates are not constant: they tend to rise late in matches and change after a goal or a red card.
- Teams react to the score, so events are not independent; a trailing team pushes forward.
- Trade arrivals on Betfair are bursty, clustering around team news, kick-off and goals, which a steady rate misses.
- The pre-match expected total is itself an estimate, and errors carry straight through to in-play prices.
- Big-league in-play markets already price time decay closely, and Betfair's in-play delay limits fast reactions.
How to build it
- scipy.stats.poisson and numpy handle all the probabilities; the pre-match rate can come from a Dixon-Coles model or the market's own over/under prices.
- Use minute-by-minute goal data to fit a rate that changes over the match rather than a flat one.
- Tip: back out the market's implied remaining goal rate from live over/under prices and compare it with your own.
Related methods
- Poisson distribution is the count part of the process for a fixed window.
- Gamma, exponential and Weibull describe the waiting times between events.
- Jump-diffusion uses a Poisson process to generate sudden price jumps such as goals.
- Queue position uses Poisson arrivals to estimate fill chances.