Introduction

This is number 12 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 weeks.

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 (Friday 7pm each week), they may well have changed.

Loading the Data

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.

Forecast Model

library(knitr)
library(MASS)
source("/home/readejj/Dropbox/Research/Code/R/betting/clean.data.R")

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,]
forecast.matches <- forecast.matches[forecast.matches$date<"2015-05-08",]

loc0 <- "/home/readejj/Documents/Football-Forecasts/"
#res.eng <- read.csv(paste(loc0,"historical_",date.1,".csv",sep=""))

An ordered logistic regression model is run; this has been reported each previous week, for reference purposes.

The Forecasts

Forecasts now, when many clubs have little left to play for, with the clubs still in contention for promotion/relegation being a small subset of all clubs, may well perform worse as a result of such out-of-contention teams playing more experimental sides.

Premier League

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(date.1,"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. Bookmakers are not distinguished, but the range of bookmaker prices as shown on Oddschecker is reported, rather than any summary statistic. A bigger spread of prices might suggest greater uncertainty amongst bookmakers about any particular outcome.

As is becoming customary (although I’m yet to properly evaluate these “tips”), I’ll point out the main differences between my model and bookmaker prices:

  • Model backs West Ham more than the bookies.
  • Model backs Man United, Man City, Arsenal, Liverpool and Chelsea less than the bookmakers.
    • This is a consistent pattern; are bookmakers trying to discourage bets on these teams by providing inferior odds?

Championship

Next, our Championship forecasts:

simpleplot("English Championship")

Bookmaker prices:

bkplot(date.1,"English Championship","championship")

Note that my model gives Brentford a reasonable chance of making the play-offs at Ipswich’s expense, who have a difficult trip to Blackburn. The bookmakers favour Ipswich more strongly than my model does.

League One

Next, our League One forecasts:

simpleplot("English League One")

bkplot(date.1,"English League One","league-1")

Adding in bookmakers at League One level, the main differences are:

  • Substantial disagreement in the Gillingham vs Notts County game, crucial for Notts County at the bottom who need to win to be sure to avoid relegation. Bookmakers believe County have as high as a 40% chance of winning, my model suggests only about a 20% chance.
  • Crawley face Coventry in another relegation shoot-out, where each team could be relegated (although Crawley much more likely than Coventry). Bookmakers appear to back Coventry more than my model, but not by much.
  • Bookmakers price Leyton Orient as highly as 40% to win at Swindon whereas my model suggests the probability is nearer to 20%; again, Orient need a win to have a chance of avoiding relegation.
  • At the top, Preston look most likely to be promoted automatically, facing third bottom Colchester away, and having a probability of winning the match in excess of 50%. Any slip however and it’s hard to imagine MK Dons not beating relegated Yeovil — their probability of winning is around 80%.

League Two

Next, our League Two forecasts:

simpleplot("English League Two")

bkplot(date.1,"English League Two","league-2")

At League Two level:

  • Bookmakers fully expect both Bury and Southend to win, which will result in Southend’s promotion at Bury’s expense. My model suggests Bury (50%) are more likely to win than Southend (40%), affording some hope to Bury. Given that Southend simply dropping points results in Bury’s promotion, then if we were to optimistically assume that the outcomes of the two matches are independent, there’s about a 30% chance that Bury win promotion, meaning there’s a 70% chance Southend will.

Football Conference

Next, our Football Conference forecasts:

simpleplot("Football Conference")

List of all forecasts

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
32 2015-05-02 Conference North AFC Fylde 0.6634839 Guiseley 0.5553671 0.2415930 0.2030399
33 2015-05-02 Conference North Boston Utd 0.6092975 Chorley 0.4777280 0.2641735 0.2580986
34 2015-05-02 Conference South Basingstoke 0.5721981 Whitehawk 0.4347170 0.2726004 0.2926826
35 2015-05-02 Conference South Boreham W 0.6570991 Havant & W 0.5392472 0.2469804 0.2137724
8 2015-05-02 English Championship Nottm Forest 0.6062360 Cardiff 0.4743019 0.2649606 0.2607376
9 2015-05-02 English Championship Wolves 0.7440014 Millwall 0.6436892 0.2065444 0.1497664
10 2015-05-02 English Championship Middlesbro 0.7135786 Brighton 0.6081255 0.2217100 0.1701646
11 2015-05-02 English Championship Blackpool 0.4297965 Huddersfield 0.2848202 0.2710322 0.4441476
12 2015-05-02 English Championship Leeds 0.6403043 Rotherham 0.5091346 0.2560944 0.2347710
13 2015-05-02 English Championship Brentford 0.7004157 Wigan 0.5925311 0.2279279 0.1795410
14 2015-05-02 English Championship Watford 0.7563211 Sheff Wed 0.6676401 0.1956102 0.1367497
15 2015-05-02 English Championship Blackburn 0.5629320 Ipswich 0.4192396 0.2748112 0.3059491
16 2015-05-02 English Championship Charlton 0.3756444 Bournemouth 0.2389965 0.2577117 0.5032918
17 2015-05-02 English Championship Norwich 0.7646745 Fulham 0.6814367 0.1890652 0.1294981
18 2015-05-02 English Championship Derby 0.7600200 Reading 0.6787254 0.1903652 0.1309093
19 2015-05-02 English Championship Bolton 0.5662545 Birmingham 0.4254561 0.2739785 0.3005653
20 2015-05-02 English League Two Shrewsbury 0.6843727 Plymouth 0.5632117 0.2388498 0.1979385
21 2015-05-02 English League Two Exeter 0.5297326 Dag & Red 0.3797731 0.2782531 0.3419738
22 2015-05-02 English League Two Tranmere 0.3997837 Bury 0.2595045 0.2645959 0.4758996
23 2015-05-02 English League Two Morecambe 0.4946067 Southend 0.3437908 0.2783337 0.3778754
24 2015-05-02 English League Two Newport Co 0.5290249 Oxford 0.3761917 0.2783984 0.3454099
25 2015-05-02 English League Two Northampton 0.5327471 Wycombe 0.3867958 0.2778843 0.3353199
26 2015-05-02 English League Two AFC W’bledon 0.6903647 Cheltenham 0.5709230 0.2360780 0.1929990
27 2015-05-02 English League Two Accrington 0.6352705 Mansfield 0.5038525 0.2575587 0.2385888
28 2015-05-02 English League Two Cambridge U 0.4379922 Burton 0.2931077 0.2726796 0.4342127
29 2015-05-02 English League Two Luton 0.5137551 Stevenage 0.3641227 0.2786703 0.3572071
30 2015-05-02 English League Two Carlisle 0.6209609 Hartlepool 0.4915559 0.2608047 0.2476394
31 2015-05-02 English League Two Portsmouth 0.5741930 York 0.4288679 0.2734898 0.2976423
1 2015-05-02 English Premier West Ham 0.6548931 Burnley 0.5337903 0.2487257 0.2174839
2 2015-05-02 English Premier Man Utd 0.7396362 West Brom 0.6391500 0.2085531 0.1522969
3 2015-05-02 English Premier Leicester 0.6663029 Newcastle 0.5484019 0.2439626 0.2076354
4 2015-05-02 English Premier Liverpool 0.7339908 QPR 0.6235339 0.2153027 0.1611634
5 2015-05-02 English Premier Swansea 0.5849855 Stoke 0.4441653 0.2710291 0.2848056
6 2015-05-02 English Premier Aston Villa 0.4868793 Everton 0.3355674 0.2779001 0.3865326
7 2015-05-02 English Premier Sunderland 0.4147405 Southampton 0.2682953 0.2670788 0.4646259
36 2015-05-02 Evo-Stik N Premier Curzon Ashton 0.5956715 Ilkeston 0.4627891 0.2674631 0.2697478
39 2015-05-03 English League One Gillingham 0.6933838 Notts Co 0.5731876 0.2352501 0.1915623
40 2015-05-03 English League One Crawley 0.5247805 Coventry 0.3741553 0.2784681 0.3473766
41 2015-05-03 English League One Oldham 0.5423251 Peterborough 0.3944993 0.2773549 0.3281457
42 2015-05-03 English League One MK Dons 0.8301248 Yeovil 0.7750661 0.1403909 0.0845429
43 2015-05-03 English League One Port Vale 0.5731336 Fleetwood 0.4302379 0.2732873 0.2964748
44 2015-05-03 English League One Sheff Utd 0.5599593 Chesterfield 0.4147464 0.2753658 0.3098878
45 2015-05-03 English League One Swindon 0.6528236 Leyton Orient 0.5314524 0.2494611 0.2190865
46 2015-05-03 English League One Colchester 0.3439100 Preston 0.2169888 0.2484963 0.5345148
47 2015-05-03 English League One Barnsley 0.5577055 Rochdale 0.4122107 0.2756610 0.3121283
48 2015-05-03 English League One Bristol C 0.7391404 Walsall 0.6445061 0.2061807 0.1493132
49 2015-05-03 English League One Crewe 0.4947889 Bradford 0.3428235 0.2782918 0.3788847
50 2015-05-03 English League One Doncaster 0.5709632 Scunthorpe 0.4287272 0.2735104 0.2977624
37 2015-05-03 English Premier Tottenham 0.4894803 Man City 0.3391678 0.2781117 0.3827206
38 2015-05-03 English Premier Chelsea 0.7679369 C Palace 0.6719003 0.1936080 0.1344917
51 2015-05-03 Football Conference Bristol R 0.6501431 Forest Green 0.5242253 0.2516865 0.2240882
52 2015-05-03 Football Conference Grimsby 0.6414014 Eastleigh 0.5134647 0.2548632 0.2316721
53 2015-05-04 English Premier Hull 0.3732218 Arsenal 0.2360564 0.2565938 0.5073499
54 2015-05-04 Evo-Stik S Premier Truro City 0.5750204 St Neots Town 0.4360747 0.2723847 0.2915406