Introduction

This is number 10 in a series of forecasts of football match outcomes, following on from my efforts a couple of weeks back 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 (12 noon, Friday 10 April), 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

A linear regression model is estimated here and reported:

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-04-24",]

res.eng <- read.csv(paste("historical_",date.1,".csv",sep=""))

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")
options(scipen=13)
#summary(model.ord)
kable(summary(model.ord)$coef, digits=3)
## 
## Re-fitting to get Hessian
Value Std. Error t value
E.1 1.905 0.009 201.103
pts1 0.004 0.002 2.059
pts.D -0.014 0.001 -9.400
pts.D.2 0.000 0.000 -2.364
pld1 -0.009 0.003 -3.165
pld.D 0.018 0.004 5.230
pld.D.2 0.000 0.000 -1.570
gs1 0.004 0.001 4.324
gs.D -0.001 0.001 -0.712
gs.D.2 0.000 0.000 -0.079
gd1 -0.004 0.001 -3.171
gd.D 0.018 0.001 20.387
gd.D.2 0.000 0.000 0.529
pos1 0.003 0.001 2.150
pos.D -0.001 0.001 -0.907
pos.D.2 0.000 0.000 3.371
form1 0.004 0.002 2.102
form.D -0.010 0.001 -7.027
form.D.2 0.000 0.000 -1.931
tier1 0.009 0.004 2.474
tier.D -0.283 0.014 -19.828
tier.D.2 -0.008 0.007 -1.187
season.d -0.005 0.000 -35.891
0|0.5 -0.102 0.017 -5.998
0.5|1 1.058 0.017 62.426

The Forecasts

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. Unlike in previous weeks where I’ve simply plotted the mean bookmaker implied probability, here all bookmaker prices (usually 24) are plotted.

The only real differences are:

  • My model backs Man City much less than bookmakers do against West Ham.
  • My model backs Everton and Leicester slightly less than bookmakers against Burnley and Swansea respectively.

Championship

Next, our Championship forecasts:

simpleplot("English Championship")

This week I’m adding in Championship bookmaker prices:

bkplot("2015-04-14","English Championship","championship")

The differences here are:

  • My model backs Norwich slightly more than the bookmakers tonight against Middlesbrough.
  • My model backs Brentford slightly less than the bookmakers against Bolton.

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:

  • My model backs Barnsley more than bookmakers against Peterborough.

League Two

Next, our League Two forecasts:

simpleplot("English League Two")

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

At League Two level:

  • My model backs Newport much less strongly than the bookmakers against Dagenham and Redbridge.

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
1 2015-04-17 English Championship Norwich 0.6503113 Middlesbro 0.5223221 0.2548933 0.2227845
2 2015-04-17 English League One Port Vale 0.3669473 Preston 0.2282784 0.2572523 0.5144692
67 2015-04-18 Conference North Barrow 0.6295036 Tamworth 0.4933653 0.2631418 0.2434929
72 2015-04-18 Conference North Hednesford 0.6000167 Stalybridge 0.4630639 0.2703769 0.2665592
55 2015-04-18 Conference South Eastbourne 0.7341107 Farnborough 0.6259922 0.2162791 0.1577287
57 2015-04-18 Conference South Bath City 0.5740009 Sutton Utd 0.4343350 0.2757874 0.2898776
61 2015-04-18 Conference South St Albans 0.5814298 Ebbsfleet 0.4436056 0.2742042 0.2821903
9 2015-04-18 English Championship Charlton 0.6135732 Leeds 0.4777281 0.2670624 0.2552095
10 2015-04-18 English Championship Blackpool 0.4597965 Fulham 0.3103735 0.2791004 0.4105261
11 2015-04-18 English Championship Blackburn 0.6222081 Nottm Forest 0.4870318 0.2647765 0.2481916
12 2015-04-18 English Championship Bournemouth 0.7599453 Sheff Wed 0.6764613 0.1931721 0.1303666
13 2015-04-18 English Championship Watford 0.7465984 Birmingham 0.6594594 0.2012327 0.1393078
14 2015-04-18 English Championship Cardiff 0.6789602 Millwall 0.5605944 0.2421822 0.1972234
15 2015-04-18 English Championship Wigan 0.5058445 Brighton 0.3512167 0.2820993 0.3666840
16 2015-04-18 English Championship Brentford 0.6417140 Bolton 0.5159067 0.2568272 0.2272662
17 2015-04-18 English Championship Wolves 0.5899699 Ipswich 0.4466270 0.2736540 0.2797189
18 2015-04-18 English Championship Huddersfield 0.4283775 Derby 0.2843677 0.2746722 0.4409601
108 2015-04-18 English FA Cup Reading 0.2569179 Arsenal 0.1535822 0.2130685 0.6333494
19 2015-04-18 English League One Bristol C 0.7619707 Coventry 0.6784063 0.1922329 0.1293608
20 2015-04-18 English League One Crawley 0.5797644 Notts Co 0.4334112 0.2759364 0.2906524
21 2015-04-18 English League One Doncaster 0.6032265 Fleetwood 0.4634759 0.2702887 0.2662354
22 2015-04-18 English League One Swindon 0.7708908 Yeovil 0.6867173 0.1881811 0.1251016
23 2015-04-18 English League One Barnsley 0.6294183 Peterborough 0.4947331 0.2627806 0.2424863
24 2015-04-18 English League One Gillingham 0.5902142 Rochdale 0.4498060 0.2730575 0.2771365
25 2015-04-18 English League One Crewe 0.4720862 Walsall 0.3165854 0.2798552 0.4035594
26 2015-04-18 English League One MK Dons 0.7261643 Leyton Orient 0.6320124 0.2136561 0.1543315
27 2015-04-18 English League One Oldham 0.4684171 Chesterfield 0.3168103 0.2798804 0.4033093
28 2015-04-18 English League One Sheff Utd 0.6348572 Bradford 0.5047276 0.2600539 0.2352184
29 2015-04-18 English League One Colchester 0.5591681 Scunthorpe 0.4144840 0.2786273 0.3068887
30 2015-04-18 English League Two Accrington 0.4852240 Stevenage 0.3340391 0.2813900 0.3845708
31 2015-04-18 English League Two Tranmere 0.4975637 Oxford 0.3446925 0.2819203 0.3733872
32 2015-04-18 English League Two Northampton 0.7007993 Cheltenham 0.5905844 0.2309161 0.1784996
33 2015-04-18 English League Two Exeter 0.5160163 Southend 0.3632448 0.2821498 0.3546054
34 2015-04-18 English League Two Portsmouth 0.4827945 Bury 0.3297286 0.2810894 0.3891820
35 2015-04-18 English League Two Morecambe 0.4747044 Burton 0.3209325 0.2803172 0.3987503
36 2015-04-18 English League Two Cambridge U 0.6423727 Mansfield 0.5176398 0.2563106 0.2260497
37 2015-04-18 English League Two Newport Co 0.5646266 Dag & Red 0.4143417 0.2786449 0.3070134
38 2015-04-18 English League Two Carlisle 0.4871373 Plymouth 0.3375320 0.2815969 0.3808710
39 2015-04-18 English League Two Shrewsbury 0.6899292 York 0.5746101 0.2370526 0.1883373
40 2015-04-18 English League Two Luton 0.6287489 Hartlepool 0.5060918 0.2596701 0.2342381
41 2015-04-18 English League Two AFC W’bledon 0.4963394 Wycombe 0.3449433 0.2819292 0.3731275
3 2015-04-18 English Premier C Palace 0.6948529 West Brom 0.5796547 0.2351475 0.1851978
4 2015-04-18 English Premier Chelsea 0.6282130 Man Utd 0.4944081 0.2628667 0.2427252
5 2015-04-18 English Premier Leicester 0.5191237 Swansea 0.3718251 0.2819714 0.3462034
6 2015-04-18 English Premier Hull 0.4082008 Liverpool 0.2613315 0.2689078 0.4697607
7 2015-04-18 English Premier Everton 0.6596947 Burnley 0.5402428 0.2491858 0.2105714
8 2015-04-18 English Premier Stoke 0.4782444 Southampton 0.3237597 0.2805889 0.3956514
42 2015-04-18 Football Conference Dover 0.5158785 Bristol R 0.3645982 0.2821333 0.3532685
43 2015-04-18 Football Conference Southport 0.3589340 Grimsby 0.2263249 0.2564280 0.5172471
44 2015-04-18 Football Conference Wrexham 0.6266084 Braintree 0.4878780 0.2645618 0.2475602
45 2015-04-18 Football Conference Macclesfield 0.6956616 Dartford 0.5833369 0.2337376 0.1829254
46 2015-04-18 Football Conference Gateshead 0.5191021 Forest Green 0.3686363 0.2820581 0.3493056
47 2015-04-18 Football Conference Nuneaton 0.3475840 Woking 0.2189663 0.2531786 0.5278551
48 2015-04-18 Football Conference Halifax 0.6300852 Torquay 0.4946704 0.2627972 0.2425324
49 2015-04-18 Football Conference Aldershot 0.6350973 Chester 0.5067198 0.2594924 0.2337878
50 2015-04-18 Football Conference Lincoln 0.4373573 Eastleigh 0.2886544 0.2755483 0.4357973
51 2015-04-18 Football Conference Kidderminster 0.3449374 Barnet 0.2148905 0.2512788 0.5338308
52 2015-04-18 Football Conference Altrincham 0.5987483 Telford 0.4568410 0.2716733 0.2714857
53 2015-04-18 Football Conference Alfreton 0.5598381 Welling 0.4123892 0.2788816 0.3087291
109 2015-04-19 English Premier Man City 0.6962470 West Ham 0.5868879 0.2323628 0.1807493
110 2015-04-19 English Premier Newcastle 0.4703613 Tottenham 0.3197626 0.2801982 0.4000393
122 2015-04-21 Conference North Stalybridge 0.6173125 Bradford PA 0.4941996 0.2629218 0.2428786
113 2015-04-21 English Championship Blackburn 0.7301420 Millwall 0.6248220 0.2167846 0.1583934
114 2015-04-21 English League One Scunthorpe 0.5727936 Bradford 0.4302091 0.2764404 0.2933505
115 2015-04-21 English League One Rochdale 0.6306548 Leyton Orient 0.5008940 0.2611177 0.2379883
116 2015-04-21 English League One Notts Co 0.3562956 Preston 0.2197076 0.2535164 0.5267760
117 2015-04-21 English League One MK Dons 0.7171912 Doncaster 0.6249728 0.2167196 0.1583077
118 2015-04-21 English League One Swindon 0.6597563 Walsall 0.5337916 0.2512914 0.2149170
119 2015-04-21 English League Two Bury 0.6009244 Southend 0.4601495 0.2709924 0.2688581
120 2015-04-21 Football Conference Aldershot 0.5641385 Wrexham 0.4182461 0.2781484 0.3036055
128 2015-04-22 English Championship Reading 0.5422718 Birmingham 0.3928130 0.2808197 0.3263673