R at Bet Better
How much do betting prices move before kick-off? Open the new dataset in R
30 September 2026. Base R plus dplyr.
We just published a new open dataset: the average bookmaker price when a market opened and the average price just before the game started, for 6,882 settled markets across 11 sports. One row per outcome, prices averaged across every book we track, no bookmaker identified. Licence: free to use with a link.
1. Load it
u <- "https://zenodo.org/records/23048677/files/betbetter-price-movement-2026.csv?download=1"
mv <- read.csv(u)
str(mv)
# 6,882 rows: sport, game_date, teams, market, selection, line,
# opening_avg_price, closing_avg_price, price_move_pct,
# n_books_open, n_books_close, closing_fair_probability, hours_tracked
2. Which sports move most?
library(dplyr)
mv %>%
group_by(sport) %>%
summarise(markets = n(),
mean_abs_move = mean(abs(price_move_pct)),
biggest = max(abs(price_move_pct)), .groups = "drop") %>%
arrange(desc(mean_abs_move))
The absolute move is the honest measure: prices drift both ways, and a mean of the signed move hides most of the action.
3. Does the close know more than the open?
The classic market question. Convert both prices to probabilities and check which one sat closer to what a fair price would have been at the close:
mv2 <- mv %>%
mutate(p_open = 1 / opening_avg_price,
p_close = 1 / closing_avg_price,
gap_open = abs(p_open - closing_fair_probability),
gap_close = abs(p_close - closing_fair_probability))
mean(mv2$gap_open) # how far the opening price sat from the fair close
mean(mv2$gap_close) # mostly the bookmaker's cut on the close side
For a proper forecasting test, pair this file with settled results from the calibration dataset and score both prices against what actually happened.
4. How long are markets open?
hist(mv$hours_tracked, breaks = 40,
main = "Hours between first sighting and closing snapshot",
xlab = "hours")
Where the data comes from
Collected continuously from live bookmaker odds feeds by Bet Better. The archived copy with a DOI is on Zenodo (10.5281/zenodo.23048677); the codebook in the record defines every column and suggests three classroom exercises. All our open feeds are documented at betbetter.world/api, and this post syndicates on R-bloggers.
18+. Analysis, not advice.