dates <- c("2015-01-30","2015-02-06","2015-02-13","2015-02-20","2015-02-27","2015-03-06","2015-03-13","2015-03-20")
This is the number 8 in a series of forecasts of football match outcomes, following on from my efforts last week and the previous weeks. The method of forecasts is unchanged from previous week.
Bookmaker prices are compared with forecasts, potentially offering opportunities, should you sufficiently believe my forecasts to be better than those of bookmakers. Naturally, I make no such claim, and indeed since the bookmaker prices were collected, they may well have changed.
The dataset used is all English matches recorded on http://www.soccerbase.com, which goes back to 1877 and the very first football matches.  Experimentation will take place in time (i.e., not this week) with adjusting the estimation sample size, since it is not necessarily useful to have all matches back to 1877 when forecasting matches in 2015.  The Elo ranks have been calculated since the very first matches, and hence historical information is retained, to the extent that it is useful in determining a team’s current strength, back throughout footballing history.
A linear regression model is estimated here and reported:
library(knitr)
library(MASS)
date.1 <- tail(dates,1)
forecast.matches <- read.csv(paste("forecasts_",date.1,".csv",sep=""),stringsAsFactors=F)
forecast.matches <- forecast.matches[is.na(forecast.matches$outcome)==F,]
res.eng <- read.csv(paste("historical_",date.1,".csv",sep=""))
model <- lm(outcome ~ E.1 + pts1 + pts.D + pts.D.2 + pld1 + pld.D + pld.D.2 + gs1 + gs.D + gs.D.2
+ gd1 + gd.D + gd.D.2
+ pos1 + pos.D + pos.D.2 + form1 + form.D + form.D.2 + tier1 + tier.D + tier.D.2 + season.d,
data=res.eng)
summary(model)
##
## Call:
## lm(formula = outcome ~ E.1 + pts1 + pts.D + pts.D.2 + pld1 +
## pld.D + pld.D.2 + gs1 + gs.D + gs.D.2 + gd1 + gd.D + gd.D.2 +
## pos1 + pos.D + pos.D.2 + form1 + form.D + form.D.2 + tier1 +
## tier.D + tier.D.2 + season.d, data = res.eng)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.0273 -0.3115 0.1149 0.3370 0.8955
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.311e-01 5.417e-03 61.116 < 2e-16 ***
## E.1 5.449e-01 6.050e-03 90.065 < 2e-16 ***
## pts1 9.878e-04 4.237e-04 2.331 0.01974 *
## pts.D -2.381e-03 3.076e-04 -7.738 1.01e-14 ***
## pts.D.2 -1.374e-05 6.467e-06 -2.125 0.03360 *
## pld1 -1.660e-03 6.092e-04 -2.724 0.00644 **
## pld.D 2.273e-03 7.110e-04 3.197 0.00139 **
## pld.D.2 -4.053e-05 3.083e-05 -1.314 0.18870
## gs1 4.755e-04 1.709e-04 2.782 0.00541 **
## gs.D -2.457e-04 1.525e-04 -1.611 0.10725
## gs.D.2 -5.899e-07 4.687e-06 -0.126 0.89984
## gd1 -6.014e-04 2.406e-04 -2.499 0.01245 *
## gd.D 2.456e-03 1.759e-04 13.964 < 2e-16 ***
## gd.D.2 -5.564e-06 2.342e-06 -2.376 0.01751 *
## pos1 7.665e-04 3.005e-04 2.551 0.01075 *
## pos.D -1.841e-03 2.514e-04 -7.324 2.42e-13 ***
## pos.D.2 3.743e-05 1.170e-05 3.198 0.00138 **
## form1 6.187e-04 3.518e-04 1.759 0.07858 .
## form.D 1.355e-03 2.959e-04 4.579 4.67e-06 ***
## form.D.2 -7.278e-05 2.995e-05 -2.430 0.01509 *
## tier1 1.894e-03 7.650e-04 2.476 0.01328 *
## tier.D -3.171e-02 2.862e-03 -11.081 < 2e-16 ***
## tier.D.2 -5.244e-03 1.258e-03 -4.170 3.05e-05 ***
## season.d -1.084e-03 3.080e-05 -35.183 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3948 on 216186 degrees of freedom
## (38368 observations deleted due to missingness)
## Multiple R-squared: 0.0852, Adjusted R-squared: 0.0851
## F-statistic: 875.4 on 23 and 216186 DF, p-value: < 2.2e-16
An ordered logistic regression model is:
model.ord <- polr(as.factor(outcome) ~ E.1 + pts1 + pts.D + pts.D.2 + pld1 + pld.D + pld.D.2 +
gs1 + gs.D + gs.D.2 + gd1 + gd.D + gd.D.2 + pos1 + pos.D + pos.D.2 +
form1 + form.D + form.D.2 + tier1 + tier.D + tier.D.2 + season.d,
data=res.eng, method = "logistic")
summary(model.ord)
##
## Re-fitting to get Hessian
## Call:
## polr(formula = as.factor(outcome) ~ E.1 + pts1 + pts.D + pts.D.2 +
## pld1 + pld.D + pld.D.2 + gs1 + gs.D + gs.D.2 + gd1 + gd.D +
## gd.D.2 + pos1 + pos.D + pos.D.2 + form1 + form.D + form.D.2 +
## tier1 + tier.D + tier.D.2 + season.d, data = res.eng, method = "logistic")
##
## Coefficients:
## Value Std. Error t value
## E.1 2.636e+00 3.017e-02 87.37266
## pts1 4.240e-03 2.083e-03 2.03574
## pts.D -1.226e-02 1.521e-03 -8.06218
## pts.D.2 -7.683e-05 3.608e-05 -2.12950
## pld1 -9.243e-03 2.996e-03 -3.08461
## pld.D 1.289e-02 3.567e-03 3.61445
## pld.D.2 -2.331e-04 1.637e-04 -1.42353
## gs1 3.426e-03 8.509e-04 4.02692
## gs.D -1.565e-03 7.579e-04 -2.06455
## gs.D.2 -4.351e-07 2.555e-05 -0.01703
## gd1 -3.355e-03 1.193e-03 -2.81213
## gd.D 1.333e-02 8.793e-04 15.16266
## gd.D.2 7.987e-06 1.637e-05 0.48789
## pos1 3.054e-03 1.466e-03 2.08409
## pos.D -7.976e-03 1.240e-03 -6.43396
## pos.D.2 2.025e-04 5.944e-05 3.40642
## form1 2.817e-03 1.719e-03 1.63933
## form.D 7.045e-03 1.456e-03 4.83698
## form.D.2 -2.289e-04 1.494e-04 -1.53202
## tier1 9.204e-03 3.726e-03 2.47018
## tier.D -1.746e-01 1.505e-02 -11.59582
## tier.D.2 -6.568e-03 6.882e-03 -0.95439
## season.d -5.416e-03 1.526e-04 -35.49424
##
## Intercepts:
## Value Std. Error t value
## 0|0.5 0.2396 0.0264 9.0811
## 0.5|1 1.4285 0.0266 53.7811
##
## Residual Deviance: 428424.66
## AIC: 428474.66
## (38368 observations deleted due to missingness)
simpleplot <- function(div) {
matches <- forecast.matches[forecast.matches$division==div,]
matches <- matches[order(matches$date),]
matches$id <- 1:NROW(matches)
par(mar=c(9,4,4,5)+.1)
plot(matches$id,matches$outcome,xaxt="n",xlab="",ylim=range(0,1),
main=paste("Forecasts of Weekend ",div," Matches",sep=""),
ylab="Probability of Outcome")
lines(matches$id,matches$Ph,col=2,pch=15,type="p")
lines(matches$id,matches$Pd,col=3,pch=16,type="p")
lines(matches$id,matches$Pa,col=4,pch=17,type="p")
legend("topleft",ncol=4,pch=c(1,15,16,17),col=c(1:4),
legend=c("OLS","OL (home)","OL (draw)","OL (away)"),bty="n")
abline(h=0.5,lty=2)
abline(h=0.6,lty=3)
abline(h=0.7,lty=2)
axis(1,at=matches$id,labels=paste(matches$team1,matches$team2,sep=" v "),las=2,cex.axis=0.65)
for(i in 2:NROW(matches)){
if(matches$date[i]!=matches$date[i-1]) {
lines(rep(c(i-0.5),2),c(0,1),lty=2)
}
}
}
bkplot <- function(div,div.short) {
matches <- forecast.matches[forecast.matches$division==div,]
matches <- matches[order(matches$date),]
matches$id <- 1:NROW(matches)
bk <- data.frame()
loc <- paste("/home/readejj/Dropbox/Research/Data for Ideas/Betting/football/",Sys.Date(),"/",div.short,sep="")
bk.matches <- dir(loc,pattern="*.csv")
for(i in bk.matches) {
temp <- read.csv(paste(loc,i,sep="/"),stringsAsFactors=F)
temp <- clean.data(temp)
temp$event <- gsub("[.]csv","",i)
bk <- rbind(bk,temp)
}
bk <- bk[order(bk$event,bk$Date.Time),]
bk$mean <- rowMeans(bk[colnames(bk)[nchar(colnames(bk))==2]],na.rm=T)
bk$event <- gsub("sheffield-wednesday","sheff wed",bk$event)
bk$event <- gsub("nottingham-forest","nottm forest",bk$event)
bk$event <- gsub("middlesbrough","middlesbro",bk$event)
bk$event <- gsub("man-utd","man utd",bk$event)
bk$event <- gsub("man-city","man city",bk$event)
bk$event <- gsub("aston-villa","aston villa",bk$event)
bk$event <- gsub("west-brom","west brom",bk$event)
bk$event <- gsub("west-ham","west ham",bk$event)
bk$event <- gsub("crystal-palace","c palace",bk$event)
bk$team1 <- gsub("^(.*?)-v-(.*?)-(.*?)$","\\1",bk$event)
bk$team2 <- gsub("^(.*?)-v-(.*?)-(.*?)$","\\2",bk$event)
bk$event <- gsub("^(.*?)-v-(.*?)-(.*?)$","\\3",bk$event)
bk$event.1 <- c(bk$event[-1],NA)
bk.h <- bk[(bk$event!=bk$event.1 | is.na(bk$event.1)==T) & bk$event==bk$team1,]
bk.d <- bk[bk$event!=bk$event.1 & regexpr("draw",bk$event)>-1,]
bk.a <- bk[bk$event!=bk$event.1 & bk$event==bk$team2,]
matches$team1 <- tolower(matches$team1)
matches$team2 <- tolower(matches$team2)
matches <- merge(matches,bk.h[c(colnames(bk.h[nchar(colnames(bk.h))==2]),"team1","team2")],by=c("team1","team2"),all.x=T)
colnames(matches)[colnames(matches) %in% colnames(bk.h) & regexpr("team",colnames(matches))==-1] <- paste(colnames(matches)[colnames(matches) %in% colnames(bk.h) & regexpr("team",colnames(matches))==-1],".h",sep="")
matches <- merge(matches,bk.d[c(colnames(bk.d[nchar(colnames(bk.d))==2]),"team1","team2")],by=c("team1","team2"),all.x=T)
colnames(matches)[colnames(matches) %in% colnames(bk.d) & regexpr("team",colnames(matches))==-1] <- paste(colnames(matches)[colnames(matches) %in% colnames(bk.d) & regexpr("team",colnames(matches))==-1],".d",sep="")
matches <- merge(matches,bk.a[c(colnames(bk.a[nchar(colnames(bk.a))==2]),"team1","team2")],by=c("team1","team2"),all.x=T)
colnames(matches)[colnames(matches) %in% colnames(bk.a) & regexpr("team",colnames(matches))==-1] <- paste(colnames(matches)[colnames(matches) %in% colnames(bk.a) & regexpr("team",colnames(matches))==-1],".a",sep="")
par(mar=c(9,4,4,5)+.1)
plot(matches$id,matches$Ph,xaxt="n",xlab="",ylim=range(0,1),col=2,pch=15,type="p",cex=1.5,
main=paste("Forecasts of Weekend ",div," Matches",sep=""),
ylab="Probability of Outcome")
for(i in colnames(matches)[grep("[.]h",colnames(matches))]) {
for(j in matches$id) {
lines(j,1/matches[matches$id==j,i],col="darkred",pch=0,type="p",cex=0.5)
}
}
lines(matches$id,matches$Pd,col=3,pch=16,type="p",cex=1.5)
for(i in colnames(matches)[grep("[.]d",colnames(matches))]) {
for(j in matches$id) {
lines(j,1/matches[matches$id==j,i],col="darkgreen",pch=0,type="p",cex=0.5)
}
}
lines(matches$id,matches$Pa,col=4,pch=17,type="p",cex=1.5)
for(i in colnames(matches)[grep("[.]a",colnames(matches))]) {
for(j in matches$id) {
lines(j,1/matches[matches$id==j,i],col="darkblue",pch=0,type="p",cex=0.5)
}
}
legend("topleft",ncol=3,pch=c(15,16,17),col=c(2:4),
legend=c("OL (home)","OL (draw)","OL (away)"),bty="n")
abline(h=0.5,lty=2)
abline(h=0.6,lty=3)
abline(h=0.7,lty=2)
abline(h=0.4,lty=3)
axis(1,at=matches$id,labels=paste(matches$team1,matches$team2,sep=" v "),las=2,cex.axis=0.65)
}
clean.data <- function(data) {
require(zoo)
colnames(data)[1] <- "Date.Time"
colnames(data)[-1] <- gsub("^.*?\\d+_(\\w+)[.]href.*?$","\\1",colnames(data)[-1])
data <- data[,-NCOL(data)]
data$Date.Time <- as.Date(substring(data$Date.Time,2),"%Y-%m-%d")
data <- data[is.na(data$Date.Time)==F,]
data <- data[order(data$Date.Time),]
for(i in colnames(data)[nchar(colnames(data))==2]) {
data[,i] <- gsub("<div class=.*?>(.*?)</div>","\\1",data[,i])
data[,i] <- gsub("<div class=.*?>(.*?)\\s+$","\\1",data[,i])
data[,i] <- gsub(">","",data[,i])
data[,i] <- gsub("^\\s+|\\s+$","",data[,i])
#need to turn fractional odds into decimal odds
numerator <- gsub("(\\d+)/(\\d+)$","\\1",data[,i])
denominator <- gsub("(\\d+)/(\\d+)$","\\2",data[,i])
data[,i] <- as.numeric(numerator)+1
data[numerator!=denominator,i] <- as.numeric(numerator[numerator!=denominator])/as.numeric(denominator[numerator!=denominator])+1
data[,i] <- na.locf(data[,i],na.rm=F)
}
return(data)
}
simpleplot("English Premier")
The coloured dots are forecasts from the ordered logistic regression model; the black circles are the forecasts from a simple OLS linear probability model. Â Hence the black circles are essentially a probability of a home win occurring (given the ordinal variable defined to capture all three outcomes), whereas the red squares are the probability of a home win, the green solid circles are the probability of a draw, and the blue triangles the probability of an away win. Â The home bias in football is notable in that the majority of red squares lie above blue triangles.
bkplot("English Premier","premier-league")
## Loading required package: zoo
##
## Attaching package: 'zoo'
##
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
The darker coloured and smaller symbols are the range of bookmaker implied probabilities for outcomes. Unlike in previous weeks where I’ve simply plotted the mean bookmaker implied probability, here all bookmaker prices (usually 20) are plotted. By and large, they are not particularly widely spread, but then this is only a small sample of the total bookmakers pricing these matches.
The only really notable difference is in the Man City West Brom match: my model fancies Man City much less than the bookmakers do. A West Brom win seems highly unlikely, but City have already had a pretty awful week.
In terms of making stronger picks than simply stating probabilities, as requested by some, here goes (nothing spectacular here):
Next, our Championship forecasts:
simpleplot("English Championship")
This week I’m adding in Championship bookmaker prices:
bkplot("English Championship","championship")
The big divergences here are:
Next, our League One forecasts:
simpleplot("English League One")
Next, our League Two forecasts:
simpleplot("English League Two")
Next, our Football Conference forecasts:
simpleplot("Football Conference")
For transparency, all forecasts are also listed as a table:
kable(forecast.matches[order(forecast.matches$date,forecast.matches$division),
c("date","division","team1","outcome","team2","Ph","Pd","Pa")])
| date | division | team1 | outcome | team2 | Ph | Pd | Pa | |
|---|---|---|---|---|---|---|---|---|
| 1 | 2015-03-20 | English Championship | Wolves | 0.6683253 | Derby | 0.5426365 | 0.2530953 | 0.2042683 |
| 2 | 2015-03-20 | Football Conference | Bristol R | 0.7654480 | Aldershot | 0.6591852 | 0.2047695 | 0.1360453 |
| 62 | 2015-03-21 | Conference North | Tamworth | 0.6436249 | Hednesford | 0.5138240 | 0.2624663 | 0.2237097 |
| 69 | 2015-03-21 | Conference North | Boston Utd | 0.7728899 | Gainsborough | 0.6648599 | 0.2020484 | 0.1330917 |
| 61 | 2015-03-21 | Conference South | Farnborough | 0.4457166 | Bath City | 0.2865024 | 0.2821696 | 0.4313281 |
| 10 | 2015-03-21 | English Championship | Bournemouth | 0.6726339 | Middlesbro | 0.5517542 | 0.2498941 | 0.1983518 |
| 11 | 2015-03-21 | English Championship | Huddersfield | 0.5062176 | Fulham | 0.3522602 | 0.2887492 | 0.3589906 |
| 12 | 2015-03-21 | English Championship | Rotherham | 0.4903325 | Sheff Wed | 0.3325754 | 0.2880744 | 0.3793502 |
| 13 | 2015-03-21 | English Championship | Blackburn | 0.7432269 | Brighton | 0.6276684 | 0.2193098 | 0.1530219 |
| 14 | 2015-03-21 | English Championship | Charlton | 0.7096900 | Reading | 0.5960485 | 0.2328576 | 0.1710939 |
| 15 | 2015-03-21 | English Championship | Watford | 0.8121298 | Ipswich | 0.7130300 | 0.1777772 | 0.1091928 |
| 16 | 2015-03-21 | English Championship | Cardiff | 0.5540088 | Birmingham | 0.4070745 | 0.2856302 | 0.3072953 |
| 17 | 2015-03-21 | English Championship | Wigan | 0.6063754 | Bolton | 0.4682199 | 0.2747715 | 0.2570086 |
| 18 | 2015-03-21 | English Championship | Norwich | 0.6272093 | Nottm Forest | 0.5017616 | 0.2660354 | 0.2322030 |
| 19 | 2015-03-21 | English Championship | Brentford | 0.7936501 | Millwall | 0.7039875 | 0.1824871 | 0.1135254 |
| 20 | 2015-03-21 | English Championship | Blackpool | 0.2772274 | Leeds | 0.1581541 | 0.2233521 | 0.6184938 |
| 21 | 2015-03-21 | English League One | Barnsley | 0.4835494 | Preston | 0.3286547 | 0.2878151 | 0.3835302 |
| 22 | 2015-03-21 | English League One | Sheff Utd | 0.6336539 | Port Vale | 0.5027016 | 0.2657651 | 0.2315333 |
| 23 | 2015-03-21 | English League One | Crawley | 0.5117721 | Leyton Orient | 0.3545966 | 0.2887622 | 0.3566412 |
| 24 | 2015-03-21 | English League One | Gillingham | 0.7781465 | Colchester | 0.6708656 | 0.1991356 | 0.1299988 |
| 25 | 2015-03-21 | English League One | Bradford | 0.6184173 | Fleetwood | 0.4836325 | 0.2709814 | 0.2453860 |
| 26 | 2015-03-21 | English League One | Crewe | 0.5805303 | Oldham | 0.4357724 | 0.2814103 | 0.2828173 |
| 27 | 2015-03-21 | English League One | Peterborough | 0.6494798 | Chesterfield | 0.5181546 | 0.2611326 | 0.2207128 |
| 28 | 2015-03-21 | English League One | Coventry | 0.5039417 | Doncaster | 0.3496906 | 0.2887189 | 0.3615905 |
| 29 | 2015-03-21 | English League One | Rochdale | 0.6700638 | Scunthorpe | 0.5554547 | 0.2485638 | 0.1959815 |
| 30 | 2015-03-21 | English League One | MK Dons | 0.4405967 | Notts Co | 0.3024233 | 0.2849415 | 0.4126352 |
| 31 | 2015-03-21 | English League Two | Plymouth | 0.5288782 | Newport Co | 0.3791693 | 0.2880847 | 0.3327459 |
| 32 | 2015-03-21 | English League Two | AFC W’bledon | 0.4807830 | Portsmouth | 0.3222693 | 0.2873006 | 0.3904302 |
| 33 | 2015-03-21 | English League Two | Shrewsbury | 0.7374737 | Oxford | 0.6302573 | 0.2181531 | 0.1515896 |
| 34 | 2015-03-21 | English League Two | Tranmere | 0.3497458 | Burton | 0.2085670 | 0.2553165 | 0.5361165 |
| 35 | 2015-03-21 | English League Two | Hartlepool | 0.4465967 | Mansfield | 0.2869138 | 0.2822515 | 0.4308347 |
| 36 | 2015-03-21 | English League Two | Cheltenham | 0.4776438 | Exeter | 0.3214544 | 0.2872266 | 0.3913190 |
| 37 | 2015-03-21 | English League Two | Southend | 0.6899824 | Cambridge U | 0.5638601 | 0.2454773 | 0.1906627 |
| 38 | 2015-03-21 | English League Two | Carlisle | 0.6508966 | Morecambe | 0.5210340 | 0.2602309 | 0.2187351 |
| 39 | 2015-03-21 | English League Two | Bury | 0.6675887 | Northampton | 0.5383542 | 0.2545606 | 0.2070851 |
| 40 | 2015-03-21 | English League Two | Accrington | 0.4867336 | York | 0.3254142 | 0.2875684 | 0.3870174 |
| 41 | 2015-03-21 | English League Two | Stevenage | 0.6744996 | Dag & Red | 0.5518389 | 0.2498638 | 0.1982973 |
| 3 | 2015-03-21 | English Premier | Stoke | 0.6190870 | C Palace | 0.4816349 | 0.2714946 | 0.2468704 |
| 4 | 2015-03-21 | English Premier | Newcastle | 0.3005543 | Arsenal | 0.1726128 | 0.2339110 | 0.5934762 |
| 5 | 2015-03-21 | English Premier | Southampton | 0.7787170 | Burnley | 0.6850935 | 0.1921031 | 0.1228034 |
| 6 | 2015-03-21 | English Premier | Tottenham | 0.7821516 | Leicester | 0.6787133 | 0.1952794 | 0.1260073 |
| 7 | 2015-03-21 | English Premier | Man City | 0.6889980 | West Brom | 0.5866152 | 0.2366833 | 0.1767015 |
| 8 | 2015-03-21 | English Premier | Aston Villa | 0.5778841 | Swansea | 0.4336757 | 0.2817732 | 0.2845512 |
| 9 | 2015-03-21 | English Premier | West Ham | 0.6466131 | Sunderland | 0.5242069 | 0.2592235 | 0.2165696 |
| 42 | 2015-03-21 | Football Conference | Wrexham | 0.7011045 | Lincoln | 0.5837898 | 0.2378091 | 0.1784012 |
| 43 | 2015-03-21 | Football Conference | Torquay | 0.5958380 | Kidderminster | 0.4581215 | 0.2770380 | 0.2648405 |
| 44 | 2015-03-21 | Football Conference | Barnet | 0.8488533 | Welling | 0.7620009 | 0.1511356 | 0.0868635 |
| 45 | 2015-03-21 | Football Conference | Macclesfield | 0.7374843 | Nuneaton | 0.6427770 | 0.2124630 | 0.1447601 |
| 46 | 2015-03-21 | Football Conference | Alfreton | 0.5874616 | Chester | 0.4473761 | 0.2792534 | 0.2733704 |
| 47 | 2015-03-21 | Football Conference | Dover | 0.5408086 | Gateshead | 0.3928702 | 0.2870932 | 0.3200366 |
| 48 | 2015-03-21 | Football Conference | Grimsby | 0.6346850 | Eastleigh | 0.5028478 | 0.2657229 | 0.2314293 |
| 49 | 2015-03-21 | Football Conference | Woking | 0.5494215 | Forest Green | 0.4016516 | 0.2862396 | 0.3121088 |
| 50 | 2015-03-21 | Football Conference | Southport | 0.6849996 | Dartford | 0.5621175 | 0.2461245 | 0.1917580 |
| 51 | 2015-03-21 | Football Conference | Altrincham | 0.5151278 | Halifax | 0.3626124 | 0.2887024 | 0.3486852 |
| 106 | 2015-03-22 | English Premier | QPR | 0.4635192 | Everton | 0.3072164 | 0.2856196 | 0.4071640 |
| 107 | 2015-03-22 | English Premier | Hull | 0.2736013 | Chelsea | 0.1561006 | 0.2217537 | 0.6221458 |
| 108 | 2015-03-22 | English Premier | Liverpool | 0.6046988 | Man Utd | 0.4640892 | 0.2757198 | 0.2601910 |
| 109 | 2015-03-22 | JP Trophy | Bristol C | 0.8279363 | Walsall | 0.7368224 | 0.1650660 | 0.0981117 |
| 112 | 2015-03-24 | English League One | Oldham | 0.4423522 | Rochdale | 0.2853290 | 0.2819327 | 0.4327383 |
| 133 | 2015-03-24 | English League One | Sheff Utd | 0.6008226 | Scunthorpe | 0.4628322 | 0.2760026 | 0.2611652 |
| 113 | 2015-03-24 | English League Two | Luton | 0.4458798 | Wycombe | 0.2872629 | 0.2823206 | 0.4304164 |
| 114 | 2015-03-24 | Football Conference | Braintree | 0.7518244 | Telford | 0.6524652 | 0.2079521 | 0.1395827 |
| 115 | 2015-03-24 | Football Conference | Alfreton | 0.6881130 | Dartford | 0.5657038 | 0.2447883 | 0.1895079 |
| 116 | 2015-03-24 | Football Conference | Dover | 0.4362090 | Grimsby | 0.2798994 | 0.2807767 | 0.4393239 |
| 117 | 2015-03-24 | Football Conference | Woking | 0.7674044 | Torquay | 0.6620147 | 0.2034165 | 0.1345688 |
| 118 | 2015-03-24 | Football Conference | Nuneaton | 0.4497043 | Wrexham | 0.2938011 | 0.2835413 | 0.4226576 |
| 134 | 2015-03-24 | Football Conference | Halifax | 0.5234314 | Gateshead | 0.3704449 | 0.2884916 | 0.3410636 |