Blog

NRL 2016 R07 Results

NRL S2016 R07 Results

Summary

Unfortunately this round we had a poor performing staking round with a staking accuracy of 33% (wining 1 of 3 bets). Overall we had a predictive accuracy of 62.5% (5 of 8), however unfortunately 2 of the three games we mis-predicted were games we staked on!! This might seem ‘unlucky’, however it is more appropriate to call this result statistically unlikely given the historic performance of high probability predictions. That aside, ‘statistically unlikely’ events can and do happen!

The two staking losses brought our overall bank to $2,107.54 (-92.46 from an initial bank of $2,200) for a return (to date) of -4.2%. Don’t get dis-heartened though; remember this is a season long strategy and we are bound to get a little volatility.

Predictive Results

Given:

mTP = Models true positives

mFP = Models False positives

mPrec = Models precision (equivalent to accuracy in this case)

bTP = Bookmakers true positives

bFP = Bookmakers False positives

bPrec = Bookmakers precision (equivalent to accuracy in this case)

Table of results

Predictive model vs bookmaker precision by round
round_no season mTP mFP bTP bFP mPrec bPrec
7 2016 5 3 5 2 0.625 0.714
round_no game_no tip_text result
2905 7 1 Manly Sea Eagles to win against Parramatta Eels while Home Incorreclty picked
2907 7 2 North Queensland Cowboys to win against South Sydney Rabbitohs while Home Correctly picked
2910 7 3 St George Illawarra Dragons to win against Gold Coast Titans while Away Correctly picked
2911 7 4 Canterbury Bulldogs to win against New Zealand Warriors while Home Incorreclty picked
2913 7 5 Brisbane Broncos to win against Newcastle Knights while Home Correctly picked
2916 7 6 Cronulla Sharks to win against Canberra Raiders while Away Correctly picked
2918 7 7 Melbourne Storm to win against Wests Tigers while Away Correctly picked
2919 7 8 Sydney Roosters to win against Penrith Panthers while Home Incorreclty picked

Staking results to date

Initial bank = $2,200

Current bank = $2,107.54

Total profit/loss = -92.46

Staking results = 2/4 (50%)

ROI (Total profit / Inital Bank) = -4.2%

For those who have contributed to the initial bank, the break down of your contribution and what you are currently entitled to is below. It’s pretty self explanatory with the main column being ‘entitlement’. This is how much you are entitled given your initial contribution. The gain (in dollars) is the amount of profit/loss you have currently made on your investment

Contributors investment entitlements

ID initial_bank current_bank cont_amount entitlement gain
1 2200 2107.54 1000 957.973 -42.027
2 2200 2107.54 500 478.986 -21.014
3 2200 2107.54 200 191.595 -8.405
4 2200 2107.54 100 95.797 -4.203
5 2200 2107.54 100 95.797 -4.203
6 2200 2107.54 200 191.595 -8.405
7 2200 2107.54 100 95.797 -4.203

Results to date

Predictive model vs bookmaker precision by round
round_no season mTP mFP bTP bFP mPrec bPrec
1 2016 5 3 5 3 0.625 0.625
2 2016 7 1 6 2 0.875 0.750
3 2016 4 3 2 5 0.571 0.286
4 2016 3 5 7 1 0.375 0.875
5 2016 3 5 6 2 0.375 0.750
6 2016 7 1 4 4 0.875 0.500
7 2016 5 3 5 2 0.625 0.714

NB these are results as posted - remodelling of round 4 and 5 considerably improved these results as explained in Results to date

Conclude

Ok, lets hope we can can build on our great start to investing in following rounds!

Simple NRL Betting Simulations

Another post from guest poster Matt Dick. He explores some simple NRL betting strategies and simulates these strategies to determine if they would have (historically) resulted in profit…

So what is the simplest most profitable betting strategy? Find out below!!

 

 

Betting Sims

This article is a quick look at simple betting strategy performance over the 2009-2015 season data. This is where we pick a relatively simple metric for betting eg. (Bet on all home teams, bet on the bookmaker favourite etc.)

To do this, a function in R takes the desired betting rule as a list of TRUE/FALSE and places a bet on that game. If it was a win, the bookmaker odds are paid. The function also has a parameter for a starting bank, and a fixed betting amount.

The simulation settings used were:

Variable Value
Starting Bank $ 1000
Fixed Bet Amount $ 10

Betting Strategies

Onto the betting strategies… To keep it simple, we have looked at 7 betting strategies…

  • Bet on the Home team
  • Bet on the Away team
  • Bet with the Bookmaker
  • Bet against the Bookmaker
  • Bet against the Bookmaker for the Home team
  • Bet against the Bookmaker for the Away team
  • Bet for a specific team (Melbourne Storm in this example)

We can have a look at how many bets this results in:

names bet_count bet_ratio
Home Team 1420 0.5000000
Away Team 1420 0.5000000
Non-favourite playing at home 481 0.1693662
Non-favourite playing away 935 0.3292254
Bookie Favourite 1424 0.5014085
Bookie Non-favourite 1416 0.4985915
Melbourne Storm 183 0.0644366

The Simulations

Lets run these simulated simple betting strategies, and see what it does to our initial bank of $1000.

rule result
Non-favourite playing at home 109.1
Melbourne Storm -6.0
Home Team -179.3
Bookie Favourite -605.2
Bookie Non-favourite -610.8
Non-favourite playing away -719.9
Away Team -1036.7

Plotted results over time, the dashed line represents the initial bank amount of $1000.

Of particular interest is the outcome of betting on the bookmaker favourite, or against the bookmaker ending up within a few dollars of one another.

To put these results in context, I’ve run a coin-toss simulation, where a fair coin was used to determine who to bet on, with a 100 simulations performed over time. The aim is to present a range of possibilities where random chance is driving the betting decisions. This can provide some context for the performance of the other betting models.

This shows that at the end of 2015, had we followed either betting strategy, we would have been not much worse/better off than just letting a coin toss determine who to bet on.

Compare this to the most robust betting strategy of betting on the home team who isn’t backed as the favourite to win by the bookmakers.

It appears that very rarely would our coin-toss strategy result in the same performance. I believe this betting strategy could warrant further investigation, given the simplistic nature of its application, it could be improved with different stakes based on the odds, or other parameters to help prune out unfavourable bets. Stay tuned?

 

NRL S2016 R07 Predictions and staking guide

NRL S2016 R07 predictions and staking guide

Summary

After a stellar round 6 (7/8 predictions correct) and a win on our first bet, its time to take a look at the round 7 tips and staking recommendations.

This week there are four games which disagree with the bookmaker (games 1, 3, 6 and 8); and unlike round 6 which only identified one game to stake on, this round three games have been identified (games 4, 7 & 8)!

Specifically games recommended to stake on are:

  • game 4 - Canterbury Bulldogs to win against New Zealand Warriors while Home with a probability of 70.4% (currently paying $1.92)

  • game 7 - Melbourne Storm to win against Wests Tigers while Away with a probability of 67.4% (currently paying $1.70)

  • game 8 - Sydney Roosters to win against Penrith Panthers with a probability of 69.5% while Home (currently paying $2.20)

Predictions for games 4 and 8 are at long odds and represent the best ‘value’ bets.

The prediction for game 7 agrees with the bookmaker (Melbourne to win) and represents a marginally good bet. At time of writing Bulldogs and New Zealand were at even odds (1.92 each).

Ok, so lets take a detailed look at the predictions for this week and how they compare to the bookmaker predictions:

Predictions

game_no tip_text perceived_prob bookie_prob bookie_odds agree_with_bookie
1 Manly Sea Eagles to win against Parramatta Eels while Home 0.560 0.488 2.05 N
2 North Queensland Cowboys to win against South Sydney Rabbitohs while Home 0.738 0.769 1.30 Y
3 St George Illawarra Dragons to win against Gold Coast Titans while Away 0.511 0.435 2.30 N
4 Canterbury Bulldogs to win against New Zealand Warriors while Home 0.704 0.521 1.92 Y
5 Brisbane Broncos to win against Newcastle Knights while Home 0.860 0.893 1.12 Y
6 Cronulla Sharks to win against Canberra Raiders while Away 0.548 0.465 2.15 N
7 Melbourne Storm to win against Wests Tigers while Away 0.674 0.588 1.70 Y
8 Sydney Roosters to win against Penrith Panthers while Home 0.695 0.455 2.20 N

NB Bookmaker odds (taken from www.Sportsbet.com.au) as at 13-Apr-2016

Prediction observations

We observe four games which disagree with the bookmaker (games 1, 3, 6 and 8). The majority of games which agree with the bookmaker have relatively close probabilities with the exeption of game 4 (Bulldogs vs Warriors)

Games 1,3 and 6 have marginal predictions (<56% chance of team to win)

Games 4 has a very wide difference between the models probability and the bookmakers probability (70.04% vs 52.1% respective). In addition game 8 has a similarly wide difference (69.5% vs 45.5%)

Stake recommendation/s

Recommended bets are those with a perceived probability of > 0.66 and a positive expected return. Also recall that in order to make a long term profit our models precision must be greater than the overall average implied probability. Our best model has a 72% precision to date, while our ‘as posted’ model has an average precision of 61.6%. Taking the conservative 61.6% as the precision of our model, this means we don’t want to be placing bets on odds less than 1.62 (1/0.616). That makes our last bet on the Cowboys (at 1.69) a pretty marginal bet if we assume this precision. Considering these restrictions to optimise our chances of winning, lets review the stake recommendaitons below. I have also included a potential profit (from a $50 bet) assuming you back the prediction. Profit is determined by the formula: stake*odds - stake.

game_no tip_text perceived_prob bookie_odds expected_return recommend_stake potential_profit
1 Manly Sea Eagles to win against Parramatta Eels while Home 0.560 2.05 0.149 N 52.5
2 North Queensland Cowboys to win against South Sydney Rabbitohs while Home 0.738 1.30 -0.041 N 15.0
3 St George Illawarra Dragons to win against Gold Coast Titans while Away 0.511 2.30 0.175 N 65.0
4 Canterbury Bulldogs to win against New Zealand Warriors while Home 0.704 1.92 0.351 Y 46.0
5 Brisbane Broncos to win against Newcastle Knights while Home 0.860 1.12 -0.037 N 6.0
6 Cronulla Sharks to win against Canberra Raiders while Away 0.548 2.15 0.178 N 57.5
7 Melbourne Storm to win against Wests Tigers while Away 0.674 1.70 0.147 Y 35.0
8 Sydney Roosters to win against Penrith Panthers while Home 0.695 2.20 0.529 Y 60.0

Three games (4, 7 & 8) are identified as ‘good value bets’ which satisfy the staking requirments. Each of these games have a percieved probaility of >0.66 and the odds of each game are >1.62. For each game we will bet 5% of the bank. After round 6 the current bank is $2,276 therefore we will place $114 on the first match for a potential profit of $125.40

NB bank and stake amounts are rounded to whole numbers

Conclude

Lets hope we have another good round. Good luck contributors!

NRL S2016 R06 Results

NRL S2016 R06 Results

Summary

We had a great round 6; with seven out of eight predictions correct (87.5% precision). We missed out a clean sweep (8/8) only on the last game where Bulldogs defeated Melbourne. The bookmakers didn’t have as good a round, predicting only 4 of 8 games correctly!

I stated in my last post , I was going to stake $50 (5% of $1,000) on the Cowboys to win against Penrith at odds of 1.61. Not long after my post I had a flood of contributors which increased the starting bank roll to $2,200 and hence the final stake to $110. By the time I placed the bet the odds actually lengthened (which is favorable) to 1.69 and we ended up with a profit of $75.90 ($110*1.69 - $110).

Those that took my advice and had a ‘punt’ on Roosters to beat the Rabbits and Manly to beat the Warriors would have come away with tidy profits as the final odds offered on these games were very decent!

Finally, this was another round where away teams won just as many games as home teams (4 each), further validating my decision to de-weight the importance of this feature in my re-model.

Predictive Results

Given:

mTP = Models true positives

mFP = Models False positives

mPrec = Models precision (equivalent to accuracy in this case)

bTP = Bookmakers true positives

bFP = Bookmakers False positives

bPrec = Bookmakers precision (equivalent to accuracy in this case)

Table of results

Predictive model vs bookmaker precision by round
round_no season mTP mFP bTP bFP mPrec bPrec
6 2016 7 1 4 4 0.875 0.5
round_no game_no tip_text result
2889 6 1 Brisbane Broncos to win against St George Illawarra Dragons while Home Correctly picked
2892 6 2 Sydney Roosters to win against South Sydney Rabbitohs while Away Correctly picked
2893 6 3 Parramatta Eels to win against Canberra Raiders while Home Correctly picked
2896 6 4 Manly Sea Eagles to win against New Zealand Warriors while Away Correctly picked
2898 6 5 North Queensland Cowboys to win against Penrith Panthers while Away Correctly picked
2899 6 6 Cronulla Sharks to win against Gold Coast Titans while Home Correctly picked
2901 6 7 Newcastle Knights to win against Wests Tigers while Home Correctly picked
2903 6 8 Melbourne Storm to win against Canterbury Bulldogs while Home Incorreclty picked

Staking results

Since we have only just started betting rounds graphing is a little boring as we don’t see movement (of profit) until round 6.

In any case our first bet was on the Cowboys to beat the Warriors at odds of 1.69. We ended up placing $110 on this game with a profit of $75.90 ($110*1.69 - $110).

Detail:

Initial bank = $2,200

Stake = 5% of $2,200 ($110)

Profit = $75.90

New bank = $2,275.90

For those who have contributed to the initial bank, the break down of your contribution and what you are currently entitled to is below. It’s pretty self explanatory with the main column being ‘entitlement’. This is how much you are entitled given your initial contribution. The season_profit_loss is the amount of profit your investment has made (3.45% growth from one win).

Contributors investment entitlements

contributerID initial_bank current_bank contribution_amount entitlement season_profit_loss
1 2200 2275.9 1000 1034.50 34.50
2 2200 2275.9 500 517.25 17.25
3 2200 2275.9 200 206.90 6.90
4 2200 2275.9 100 103.45 3.45
5 2200 2275.9 100 103.45 3.45
6 2200 2275.9 200 206.90 6.90
7 2200 2275.9 100 103.45 3.45

Results to date

Predictive model vs bookmaker precision by round
round_no season mTP mFP bTP bFP mPrec bPrec
1 2016 5 3 5 3 0.625 0.625
2 2016 7 1 6 2 0.875 0.750
3 2016 4 3 2 5 0.571 0.286
4 2016 3 5 7 1 0.375 0.875
5 2016 3 5 6 2 0.375 0.750
6 2016 7 1 4 4 0.875 0.500

NB these are results as posted - remodelling of round 4 and 5 considerably improved these results as explained in Results to date

Conclude

Ok, lets hope we can can build on our great start to investing in following rounds!

NRL S2016 R06 predictions and staking guide

NRL S2016 R06 predictions and staking guide

Summary

Hi guys! So this is the first round of actual staking!!

My current bank is $1,000, therefore I will be placing $50 (5% of the rounds initial bank) on each game which satisfies my staking requirements as discussed in the Staking Strategy.

To summarize the staking strategy, we are looking for games where the perceived probability is greater than ~0.66 and where this perceived probability is greater than the implied (bookmakers) probability (i.e has a positive expected return).

The only game which satisfies this is game 5, where the Cowboys are predicted to win against Penrith while away.

There are a number of other games which have positive expected return, however most of these are relatively marginal (model has weak <55% perceived probability). The best bet/s according to expected return are games 2 and 4, both of which are predictions against the bookmaker and represent relatively risky (but higher return) bets.

To further summarize:

  • I am staking $50 one game (Game 5, Cowboys to win against Penrith) this round. The odds on Cowboys to win at time of writing are 1.61 representing a potential profit of $30.50 (1.61*$50 - $50). I consider this a ‘risk adverse bet’ with high chance of winning for relatively low return

  • For those who want to take a ‘punt’, I would place bets on games 2 (Roosters to win against Rabbits while Rabbits are home) and on game 4 (Manly to win against New zealand while New Zealand is home), however these would be pretty big ‘upsets’. These games offer long odds and the model indicates small chance of win/s. Roosters are paying 2.81 (potential profit of $90.5 off a $50 bet) while Manly is paying 3.09 (potential profit of $104.50 off a $50 bet). Bear in mind however that the Roosters have not won a game this year, are bottom of the ladder and lost against the Rabbits in round 1.. so um yeah..

Finally, for those that have the perception that New Zealand is hard to beat at home… a small tidbit for you: Manly has played against New Zealand in Auckland five times since 2009.. and Manly has won four of those five games…In addition to this, New Zealand only has a win rate of 53% at home…but that probably doesn’t mean anything 😉

Ok, so lets take a detailed look at the predictions for this week and how they compare to the bookmaker predictions:

Predictions

game_no tip_text perceived_prob bookie_prob bookie_odds agree_with_bookie
1 Brisbane Broncos to win against St George Illawarra Dragons while Home 0.780 0.877 1.14 Y
2 Sydney Roosters to win against South Sydney Rabbitohs while Away 0.540 0.356 2.81 N
3 Parramatta Eels to win against Canberra Raiders while Home 0.512 0.685 1.46 Y
4 Manly Sea Eagles to win against New Zealand Warriors while Away 0.542 0.324 3.09 N
5 North Queensland Cowboys to win against Penrith Panthers while Away 0.778 0.621 1.61 Y
6 Cronulla Sharks to win against Gold Coast Titans while Home 0.721 0.800 1.25 Y
7 Newcastle Knights to win against Wests Tigers while Home 0.506 0.500 2.00 N
8 Melbourne Storm to win against Canterbury Bulldogs while Home 0.613 0.588 1.70 Y

NB Bookmaker odds represent average of 16 bookmakers (taken from www.OddsPortal.com) as at 6-Apr-2016

Prediction observations

We can see that there are three games where the model prediction dis-agrees with the bookmakers. Specifically games 2, 4 and 7.

We can also see that there are four model predictions (games 2,3 4 and 7) which are relatively marginal (the perceived probabilities are <55%) indicating weak preference for these teams to win.

Stake recommendation/s

Recommended bets are those with a perceived probability of > 0.66 and a positive expected return. I have also included a potential profit (from a $50 bet) assuming you back the prediction.

game_no tip_text perceived_prob bookie_prob expected_return recommend_stake potential_profit
1 Brisbane Broncos to win against St George Illawarra Dragons while Home 0.780 0.877 -0.111 N 7.0
2 Sydney Roosters to win against South Sydney Rabbitohs while Away 0.540 0.356 0.517 N 90.5
3 Parramatta Eels to win against Canberra Raiders while Home 0.512 0.685 -0.252 N 23.0
4 Manly Sea Eagles to win against New Zealand Warriors while Away 0.542 0.324 0.674 N 104.5
5 North Queensland Cowboys to win against Penrith Panthers while Away 0.778 0.621 0.252 Y 30.5
6 Cronulla Sharks to win against Gold Coast Titans while Home 0.721 0.800 -0.099 N 12.5
7 Newcastle Knights to win against Wests Tigers while Home 0.506 0.500 0.013 N 50.0
8 Melbourne Storm to win against Canterbury Bulldogs while Home 0.613 0.588 0.042 N 35.0

As summarized, there is only one game (game 5) which satisfies the staking plan; however there are a number of high expected return games which may be worth betting on for those who are not risk adverse.

Conclude

Ok, now lets the real experiment begin!!

NRL 2016 predictive model results to date (r05)

NRL 2016 predictive model results to date (r05)

Introduction

This post is to summarize the 2016 results to date (round 05) and compare this to the bookmakers predictions. Considering that round 6 is now going to be my first betting round (in lui of round 5 - purely due to the minimal time I have had to work on this), I thought it important to track how we are going to date. I am also going to discuss the results of a model re-run since the results of round 4 and 5 were less than favorable.

Summary of results to date (r05)

We observe from the summary table/s and figures below that:

  • overall model accuracy/precision to date is 56%

  • overall bookmaker accuracy/precision to date is 66%

  • the model had higher accuracy than the bookmakers in rounds 2 and 3

  • the models round 4 and 5 accuracy was below 50%

  • Bookmaker precision was very poor (<30%) in round 3

  • In round 5, there were 6 away team wins vs 2 home team wins

  • In round 4 there were and even number of home and away team wins (4 home and 4 away)

  • In all other rounds the number of home team wins outweighed the number of away team wins

  • poor accuracy in round 4 is largely attributed to predictions being based on round 2 results (without knowing round 3 results) and high away team wins (4)

  • poor accuracy in round’s 5 is largely attributed to high number of away team wins (6)

  • round 3 contained a drawn match which is historically rare (there have only been 8 drawn games since the inception of the golden point rule representing 0.5% of all games to date)

Results to date (r05)

Given:

mTP = Models true positives

mFP = Models False positives

mPrec = Models precision (equivalent to accuracy in this case)

bTP = Bookmakers true positives

bFP = Bookmakers False positives

bPrec = Bookmakers precision (equivalent to accuracy in this case)

Table of results

Predictive model vs bookmaker precision by round
round_no season mTP mFP bTP bFP mPrec bPrec
1 2016 5 3 5 3 0.625 0.625
2 2016 7 1 6 2 0.875 0.750
3 2016 4 3 2 5 0.571 0.286
4 2016 3 5 7 1 0.375 0.875
5 2016 3 5 6 2 0.375 0.750

Models average precision

## [1] 0.564

Bookmakers average precision

## [1] 0.657

Plots of results

Discussion of results

We can see from the results that the model performed particularly poorly through rounds 4 and 5 as compared to the bookmaker. This dramatically affected overall precision which was 56% as compared to the bookmakers 66%. After reviewing the model, I determined that the main reason for poor performance through rounds 4 and 5 is due to the high weight of the importance of feature ‘home_away’ in the model. Because the model (in most circumstances) preferentially picks home teams to win, the model suffered from a dramatic increase in away teams winning through rounds 4-5.

We also observe poor accuracy from the bookmaker in round 3 where there were a number of very close games, and a draw. As the model was likely ignoring additional feature the bookmaker was relying on in round 3 (and using home/away as a highly weighted feature) the model performed well by comparison.

Generally, I would have expected model accuracy to be increasing as rounds progress (based on historic analysis), however the importance of home/away in the model was such that it overwhelmed the importance of other features such as summary of results to date, previous match ups etc. Re-running the model with less weight (less feature importance) on home/away confirms that accuracy would be higher by boosting the importance of other features. We have seen that in 2015, the importance of home away teams was much lower than historic (2009-2014) and 2016 may turn out to be similar in this regard.

Re-modelling

Since I didn’t get an opportunity to use round 3 results for round 4 predictions I firstly wanted to re-model this to determine if round 4 accuracy would have been improved. Secondly, because I am generally not satisfied with the average precision to date, and the degradation in precision (we should actually be improving in precision) I wanted to re-model all rounds with an improved predicative model. Specifically, I am concerned that the original model/s place too much significance on the home/away feature and that (like in 2015) we may see reduced significance of this feature in 2016. Therefore I chose to ‘de-weight’ this feature so that it was not an overwhelming predictive feature in the model/s. As you will see, the new model improved average precision to date, generally improved precision across all rounds as compared to the current model, and had slightly better overall precision than the bookmaker

Re-modeling of round 4 results

As stated; round 4 predictions were based of results to round 2. I re-ran the model to include round 3 results, however predictions were the same. I expected the predictions to be different due to the inclusion of round 3 results, however the weight of the home and away feature at this early stage in the model actually mitigated the weight of previous win/loss results. This largely drove low predictive accuracy in rounds 4 and 5.

Re-modelling of all rounds

Re modelling of all rounds shows an overall increase of precision from 56.4% to 67.5% which is slightly higher than the bookmakers overall precision 65.7%. As stated the re-modelling places less weight on the home/away feature and hence mitigates the dramatic decrease in accuracy across rounds 4 and 5. In fact as show below, the precision of the new model is similar in shape to the bookmakers and actually did slightly better in round 3.

Financial modelling

Finally, I wanted to determine how we would have went using various staking strategies to bet on predictions to date. As stated previously one of the main reasons for choosing to wait until round 5 or 6 to place bets was due to historically poor (50-60%) model performance in rounds 1-5. So it is worth finding out if we would have lost money betting in these rounds this year. I was also interested to know if my preferred staking strategy would have mitigated losses (avoided losing bets). i am going to keep it relatively simple and just compare a fixed staking strategy to my preferred staking strategy.

Fixed staking

First up lets have a look at a simple fixed staking strategy. We will use $10 as a fixed bet, and see what happens if we place $10 on every game which we predicted to win. To do this, we simply use the rule that if mTP = 1 then profit equals bookmakers odds * 10, and if (conversely) mFP = 1 then loss = 10.

If we chart this up we see that the cumulative loss to date would have been $49.40.

We can see in the chart split by round that we would have had a steady increase in profit after game 12 through 18 and then had rapid decline through rounds 4 and 5 (due to the poor predictive accuracy in these rounds)

Fixed staking with proability cut-off

Now lets look at what we would have ended up with if we used the proposed Staking Strategy and only bet on those games in which the models perceived probability is greater than the bookmakers implied probability and on the condition that the perceived probability is greater than the average of the models false positive perceived probability (FPpp). For reference in this case the FPpp threshold was ~0.67.

If we do this, unfortunately, the number of games which satisfied the condition are limited (7 out of 40 games), which means the cumulative profit was static (stayed the same) across many games. This can be observed in the below chart. In addition, we can see that we make steady cumulative profit from the first 3 bets (in round 5, 8 and 15) which is wiped out by a single loss.We see the same pattern from game 23 where we make small profit right up until game 40 (picked bulldogs to win against Canberra) on which we lost, wiping out all profit. In the end this staking strategy lost $0.40 (essentially broke even). It has highlighted a key issue with this strategy which I discussed in Bookmaker Analysis; that is, because we are betting on games which are short odds, our profit from bets is small, and single losses dramatically affect the total profit.

To put it another way, using this strategy we actually won on 5 of 7 bets (71% staking accuracy) but just two losses were enough to reduce the to essentially 0!

Finacial modelling of new model

Finally, knowing that our originally model predictions (as posted) would not have achieved profit using a fixed staking method, and would have only broke even using the proposed staking strategy, lets take a look at how the improved model would have fared..

We can see from the graphs below that the both the fixed staking and the probability cut-off (preferred) staking methods yielded profit with the new model. In fact the preferred staking method did not suffer a single loss (staking accuracy of 100%) and had a return on investment (ROI) of 26%. We can also see that the number of bets was small (again 7 out of 40 available) and through rounds 3 and the 4, a very limited number of bets were recommended (mitigating poor round 3 results in the new model).

Despite this; the fixed stake method yielded higher profit simply because the accuracy of the new model was higher than the bookmaker, and hence benefited from long odds bets.

Conclusion

I have shown that my strategy to wait until round 6 to make a bet was a good choice, as the original model suffered from low overall accuracy (56% to date). Despite this I have also shown that my preferred staking strategy had high accuracy (71%) and was able to mitigate most losses, however would have only broke even in terms of profit. I have also shown that my latest model would have produced much better results through rounds 1-5 (67.5% accuracy) and we would have made a profit no matter which staking strategy used. I am going to utilize the latest model for round 6 predictions and at this stage, I will utilize the risk adverse preferred staking strategy.

Appendix - Summary of all predictions to date

round_no game_no tip_text result
2810 1 1 Brisbane Broncos to win against Parramatta Eels while Away Correctly picked
2811 1 2 Manly Sea Eagles to win against Canterbury Bulldogs while Home Incorreclty picked
2813 1 3 Canberra Raiders to win against Penrith Panthers while Home Correctly picked
2816 1 4 New Zealand Warriors to win against Wests Tigers while Away Incorreclty picked
2817 1 5 North Queensland Cowboys to win against Cronulla Sharks while Home Correctly picked
2820 1 6 South Sydney Rabbitohs to win against Sydney Roosters while Away Correctly picked
2822 1 7 Newcastle Knights to win against Gold Coast Titans while Away Incorreclty picked
2823 1 8 Melbourne Storm to win against St George Illawarra Dragons while Home Correctly picked
2825 2 1 Penrith Panthers to win against Canterbury Bulldogs while Home Incorreclty picked
2827 2 2 Brisbane Broncos to win against New Zealand Warriors while Home Correctly picked
2829 2 3 Canberra Raiders to win against Sydney Roosters while Home Correctly picked
2831 2 4 South Sydney Rabbitohs to win against Newcastle Knights while Home Correctly picked
2833 2 5 Parramatta Eels to win against North Queensland Cowboys while Home Correctly picked
2835 2 6 Cronulla Sharks to win against St George Illawarra Dragons while Home Correctly picked
2837 2 7 Melbourne Storm to win against Gold Coast Titans while Home Correctly picked
2839 2 8 Wests Tigers to win against Manly Sea Eagles while Home Correctly picked
2841 3 1 North Queensland Cowboys to win against Sydney Roosters while Home Correctly picked
2843 3 2 Canterbury Bulldogs to win against Parramatta Eels while Home Incorreclty picked
2845 3 3 Newcastle Knights to win against Canberra Raiders while Home Incorreclty picked
2848 3 4 Brisbane Broncos to win against Penrith Panthers while Away Incorreclty picked
2849 3 5 Gold Coast Titans to win against Wests Tigers while Home Correctly picked
2852 3 6 Melbourne Storm to win against New Zealand Warriors while Away Correctly picked
2854 3 7 South Sydney Rabbitohs to win against St George Illawarra Dragons while Away Incorreclty picked
2855 3 8 Manly Sea Eagles to win against Cronulla Sharks while Home Correctly picked
2857 4 1 South Sydney Rabbitohs to win against Canterbury Bulldogs while Home Incorreclty picked
2859 4 2 Brisbane Broncos to win against North Queensland Cowboys while Home Correctly picked
2861 4 3 Canberra Raiders to win against Gold Coast Titans while Home Incorreclty picked
2863 4 4 Sydney Roosters to win against Manly Sea Eagles while Home Incorreclty picked
2865 4 5 St George Illawarra Dragons to win against Penrith Panthers while Home Correctly picked
2867 4 6 New Zealand Warriors to win against Newcastle Knights while Home Correctly picked
2869 4 7 Wests Tigers to win against Parramatta Eels while Home Incorreclty picked
2872 4 8 Melbourne Storm to win against Cronulla Sharks while Away Incorreclty picked
2873 5 1 Manly Sea Eagles to win against South Sydney Rabbitohs while Home Incorreclty picked
2876 5 2 Brisbane Broncos to win against Gold Coast Titans while Away Correctly picked
2877 5 3 Melbourne Storm to win against Newcastle Knights while Home Correctly picked
2879 5 4 Wests Tigers to win against Cronulla Sharks while Home Incorreclty picked
2881 5 5 North Queensland Cowboys to win against St George Illawarra Dragons while Home Correctly picked
2883 5 6 Sydney Roosters to win against New Zealand Warriors while Home Incorreclty picked
2885 5 7 Parramatta Eels to win against Penrith Panthers while Home Incorreclty picked
2887 5 8 Canterbury Bulldogs to win against Canberra Raiders while Home Incorreclty picked

NRL S2016 R05 predictions

Hi guys, this is a super quick post, I haven’t had any time to properly compile results to date or even look at the bookmakers odds for round 5 games so I have no idea if my predictions are in agreement with bookmakers or not. I will update when I get a chance.

Here are the round 5 predictions:

  • Manly Sea Eagles to win against South Sydney Rabbitohs while Home
  • Brisbane Broncos to win against Gold Coast Titans while Away
  • Melbourne Storm to win against Newcastle Knights while Home
  • Wests Tigers to win against Cronulla Sharks while Home
  • North Queensland Cowboys to win against St George Illawarra Dragons while Home
  • Sydney Roosters to win against New Zealand Warriors while Home
  • Parramatta Eels to win against Penrith Panthers while Home
  • Canterbury Bulldogs to win against Canberra Raiders while Home

 

And quick table of perceived probabilities:

 

game_no team_descr team_against_descr perceived_prob perceived_odds
1 Manly Sea Eagles South Sydney Rabbitohs 0.584 1.713
2 Brisbane Broncos Gold Coast Titans 0.511 1.959
3 Melbourne Storm Newcastle Knights 0.775 1.290
4 Wests Tigers Cronulla Sharks 0.640 1.562
5 North Queensland Cowboys St George Illawarra Dragons 0.600 1.668
6 Sydney Roosters New Zealand Warriors 0.632 1.581
7 Parramatta Eels Penrith Panthers 0.542 1.845
8 Canterbury Bulldogs Canberra Raiders 0.707 1.415

 

Bookmaker Analysis NRL 2009-2015

Forward

This is the first of many R-Rated posts to come! Now before you get excited, when i say R-Rated I mean that I will be providing R (programming language) code snippets throughout the post for those interested in re-creating some of the work I have done, and/or doing your own analysis. For those not interested in the R-Rated stuff, avert your precious eyes!!

Introduction

Its time to take a look at bookmakers historic odds data (and in fact this should be one of the very first things you look at). Also (and for me this is actually in retrospect), the bookmakers predictions should actually be the benchmark for any predictive modelling you do yourself. You will see this a bit later on, but trust me, the bookmakers are actually very good at predicting the outcomes of matches. In fact I would wager that the best predictive model or system you come up with, will only be on about par with the long term bookmakers precision!

But all is not lost, just because the bookmakers are as good as, or maybe even better than you at predicting game outcomes, there are still ways to at least identify what constitutes a safe bet and what constitutes a poor and or risky bet by analysing the bookmakers information.

The following takes a look at how good the bookmakers are a predicting games, and takes a look at opportunities for potential profit making staking strategies using statistical analysis of the bookmakers odds for winning and losing predictions

The data set

Of course what you need first and foremost is a decent data set of bookmaker odds. Luckily I have a sample up on my website which can be downloaded for such analysis. Some of the data manipulation is already done for you such as normalising the odds, calculating the implied probability, vig and overround, labeling true positive, false positive events etc. A couple of quick notes on the data set:

  • There is only one odds column (bookie_back_odds) and this represents the average of multiple bookmaker odds close to closing of bets.

  • Odds are the decimal odds of a team wining

  • The probability is simply calculated using 1/Odds

  • Normalised odds/probabilities are just weight averaged to 100%

The key variables of interest will be:

  • win_lose (binary indicator if the team won (1) or lost (0))

  • bookie_back_prob_norm (bookies probability that a team will win normalised to 100%)

  • bookie_label (binary indicator of the bookies prediction if the team will win or lose)

  • TP (True positive results (where predicted win and actual result was a win))

  • FP (False positive results (where bookie predicted a win and result was a loss))

OK, lets get started!!

Load and inspect data

Fist lets load the historic data from the maxwellAI website and call it b.

b <- read.csv ("http://maxwellai.com/wp-content/uploads/2016/03/nrl_2009_2015_bookmaker_odds.csv", header = TRUE)

Now Lets take a quick look at the list of features in the file

colnames(b)
##  [1] "match_id"              "match_team_id"        
##  [3] "season"                "round_no"             
##  [5] "game_no"               "team_descr"           
##  [7] "team_against_descr"    "score"                
##  [9] "score_against"         "home_away"            
## [11] "win_margin"            "win_lose"             
## [13] "bookie_back_odds"      "bookie_back_prob"     
## [15] "bookie_back_odds_norm" "bookie_back_prob_norm"
## [17] "overround"             "vig"                  
## [19] "bookie_label"          "TP"                   
## [21] "FP"                    "TN"                   
## [23] "FN"

And quickly take a look at the data (just the top 5 entries)

str(head(b, n=5))
## 'data.frame':    5 obs. of  23 variables:
##  $ match_id             : int  1 1 2 2 3
##  $ match_team_id        : int  1 2 4 3 5
##  $ season               : int  2009 2009 2009 2009 2009
##  $ round_no             : int  1 1 1 1 1
##  $ game_no              : int  1 1 2 2 3
##  $ team_descr           : Factor w/ 16 levels "Brisbane Broncos",..: 1 10 7 14 4
##  $ team_against_descr   : Factor w/ 16 levels "Brisbane Broncos",..: 10 1 14 7 12
##  $ score                : int  19 18 17 16 18
##  $ score_against        : int  18 19 16 17 10
##  $ home_away            : Factor w/ 2 levels "A","H": 2 1 2 1 2
##  $ win_margin           : int  1 0 1 0 8
##  $ win_lose             : int  1 0 1 0 1
##  $ bookie_back_odds     : num  1.69 2.15 1.4 2.93 1.42
##  $ bookie_back_prob     : num  0.592 0.465 0.714 0.341 0.704
##  $ bookie_back_odds_norm: num  1.6 2.03 1.33 2.78 1.35
##  $ bookie_back_prob_norm: num  0.56 0.44 0.677 0.323 0.669
##  $ overround            : num  0.057 0.057 0.056 0.056 0.053
##  $ vig                  : num  0.054 0.054 0.053 0.053 0.05
##  $ bookie_label         : int  1 0 1 0 1
##  $ TP                   : int  1 0 1 0 1
##  $ FP                   : int  0 0 0 0 0
##  $ TN                   : int  0 1 0 1 0
##  $ FN                   : int  0 0 0 0 0

Analyse Bookmakers historic precision

Right! Now lets have a look at how good the (collective) bookmaker actually is at predicting winners!

Subset data and calculate precision

First We need to subset the data so that bookie_label = 1 (we are only interested in the bookies win pick). Then we can calculate the precision of the bookmaker. We will just add the precision column to the data frame for convenience:

bp <- subset(b, b$bookie_label == 1)
#add precision column
bp$precision <- sum(bp$TP)/(sum(bp$FP) + sum(bp$TP))
#report the overall precision
round (max(bp$precision), digits=2)
## [1] 0.65
Observations

We observe that the overall precision is 0.65! This means that historically, across 2009-2015 the bookmaker has predicted 65% of games accurately which is really quite good.

Visualising precision across years

Now, lets have a quick look at what that looks like visually across each year by creating a simple line graph of the average precision by round. Also lets just add a linear trend line and a 0.5 ‘cut-off’ line to see if we can identify any simple trends (note i have omitted the R code to create the plots which is a bit lengthy):

Observations

We can see that:

  • for the majority of seasons, the predictive precision per round increases as the season progress’.The exception to this is 2013 and 2015. 2013 which started off very strong, but bombed in the later rounds after round 24. 2015 was relatively flat.

  • in most years the grand final (last round) was picked correctly.

  • Season 2010 & 2015 appear to have the lowest overall accuracy (tend line is closest to 0.5 cut off line)

  • the majority of the time, the precision is above the 0.5 cut off line, however there are a few very low precision rounds. It is difficult to correlate any specific low precision rounds across the seasons

Bookmakers probability distribution

Now let’s have a look at how the the bookmakers probabilities compare between the false positives (when they picked a team to win and they lost) and the true positives. This is going to tell us how well calibrated the probabilities are and will be useful for determining appropriate staking strategies

Fist let’s take a quick look at the summary statistics for the normalised probabilities for true positive events and false positive events:

For true positive events:

bTP <- subset(bp,bp$TP ==1)
#save third quartile for use later
bpTPq <-quantile(bTP$bookie_back_prob_norm, c(.75)) 

print (summary(bTP$bookie_back_prob_norm))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.5010  0.5870  0.6470  0.6561  0.7070  0.9380

For false positive events:

bFP <- subset(bp,bp$FP ==1)
#save third quartile for use later
bpFPq <-quantile(bFP$bookie_back_prob_norm, c(.75)) 
print (summary(bFP$bookie_back_prob_norm))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.5010  0.5630  0.6180  0.6267  0.6740  0.9120

And lets take a look at that visually in a simple box-plot:

p2 <- ggplot(bp,aes(factor(TP),bookie_back_prob_norm))
p2 <- p2 + geom_boxplot()
plot(p2)

Great! we can see straight way that the probabilities are well calibrated because the mean of the probability of the false positive events is lower than the mean of the probability of the true positives. This means that even though the bookies have mis-predictions (false positives) their implied probability is lower for these events (which is really good! (for them – not so much for the punters)).

We also observe that the third quartile for false positives is 0.67 (equivalent to 1.49 odds) and that there are a large number of true positive >0.67. Now this is important; this means that when the bookmaker gives odds odds on which are >0.67 implied probability (<1.49 odds) then in the overwelwing majority of cases, the bookmaker will accurately pick the winner. We can actually calculate the bookmakers precision in this region Which is 75%!!. This means if you bet on anything with odds <1.49, then you should win ~75% of you bets:

bp75 <- subset(b, b$bookie_back_prob_norm> bpTPq)
#add precision column
bp75$precision <- sum(bp75$TP)/(sum(bp75$FP) + sum(bp75$TP))
#report the overall precision
round (max(bp75$precision), digits=2)
## [1] 0.75

If you want to look at it from an odds perspective, we can create the same box-plot; but just with odds on the y axis instead of the probability. Note that the plot should be reversed because higher (IE longer odds means lower probability). I personally prefer looking at it from a probability point of view but in some scenarios it might be good to look from and odds point of view. Lets see:

p3 <- ggplot(bp,aes(factor(TP),bookie_back_odds_norm))
p3 <- p3 + geom_boxplot()
plot(p3)

Yes the box-plots are reversed but you can make the same inference as above. That if odds on are <1.49 then in the majority of cases the bookie will be correct!

But what does it all mean??

So what does all this mean for us?? Well for one the bookmaker is going to be damn hard to beat! They have well calibrated probabilities a precise predictive model, and on top of this have a little lea-way due to the overround/vig. But like I said in the introduction all is not lost; just in doing this simple exercise we have learnt a great deal about the bookmakers. And we can try use this analysis to help us out in our own ‘informed’ gambling. So lets review what we know and think about how we can use it logically.

Ok, so we know that the bookmaker predicts winners correctly about 75% of the time when odds on are <1.47. This means that if we pick games when the odds are <1.47 then we also have a 75% chance of a return on a bet… but does it mean we will make a profit? We should just be able to place bets on anything less than odds of <1.47 and get a return right?

Lets see. I will quickly make a simulated bet with the logic of staking on everything which is >0.67 in probability (equivalent to <1.47 odds):

#create a new dataframe using bp for simple simulated staking
bss <- bp
#create a 'stake' column and just set it to a fixed staking value
bss$stake <- 10
#find the 3rd quantile of the bookie probability
bssFPq <-quantile(bFP$bookie_back_prob_norm, c(.75)) 
bssTPq <-quantile(bTP$bookie_back_prob_norm, c(.75)) 
#create stake column using logic
bss$stake <- ifelse(bss$bookie_back_prob_norm > bssFPq , bss$stake,0)
#now simulate profit/loss on the stake amount
bss$profit <- ifelse (bss$TP == 1, (bss$stake*bss$bookie_back_odds-bss$stake),-bss$stake)
#create a total profit/loss cloumn
bss$profit_total <- sum(bss$profit)
#now create a cumulative profit for graphing
bss$profit_cum <-  round(cumsum(bss$profit),2)

#print the amount of profit we would make
print(max(bss$profit_total))
## [1] -284.6

Bummer!! that’s -$-284.6, so we actually made a loss. Seems its not so simple after all!! So what went wrong here? Well, there must be enough outliers in the False positive region to offset our small profits.

Lets take a look at how many false positives there are which are > 0.67

sum(ifelse(bss$bookie_back_prob_norm >bssFPq & bss$FP ==1, 1,0))
## [1] 120

So there a 120 of these occurrences. Ok so that means straight up we are going to lose $1,200 ($10 stake * the amount of false positives).

Now lets count the number of occurrences of True positives which are >0.67 probability

sum(ifelse(bss$bookie_back_prob_norm >bssFPq & bss$TP ==1, 1,0))
## [1] 338

Ok, so there are 338 of these. That seems like a lot more, but obviously not enough.. lets see why. The average of the odds for the bookmaker above >0.67 probability is 1.28:

mean(subset(bp$bookie_back_odds,bp$bookie_back_prob_norm >bssFPq))
## [1] 1.276114

So on average our profit on all our bets above >0.67 is (on average) going to be $946:

# (1.34 * stake * number of bets) - stake * number of bets
(1.28 * 10 * 338) - (10 * 338)
## [1] 946.4

So we can see straight away that we are going to make a loss because this value ($946) is smaller than than the value from false negatives at the same threshold ($1,200)

We can use this knowledge to create a simple formula to check if we can profit from any sort of ‘short odds’ betting. We can use:

((TPd*TPb)-TPb) - FPb

where

  • TPd is the average decimal odds of the true positives above/within the threshold
  • FPd is the number of False positive bets above/within the threshold
  • TPb is the number of True positive bets above/within the threshold

So we could reduce our previous staking simulation to: (1.28*338)-338 - 120

((1.28 *338)-371)-131
## [1] -69.36

Which is -69. Since this is negative we aren’t going to make any sort of money staking like this because the number of false postives outwieghs the number of true postives times the odds of the true postives

Right! so is there anything that might work? Well when we looked at the box plot there looked to be as many outliers in the False positive range above 0.67 as there were True positives in this range. So what about if we just use the range between the 3rd quartiles (75th percentiles) of the false positives and true positives?

p2b <- ggplot(bp,aes(factor(TP),bookie_back_prob_norm))
p2b <- p2b + geom_boxplot()
p2b <- p2b + geom_hline(aes(yintercept=bpFPq), col = "coral", linetype = "dashed", size = 0.8)
p2b <- p2b + geom_hline(aes(yintercept=bpTPq), col = "coral", linetype = "dashed", size = 0.8)
plot(p2b)

Sounds like a pretty simple strategy, maybe to good to be true so lets quickly check how it performs. Just using a really simple fixed staking calculation on the data using the logic that we will bet $10 on every game which has an implied probability of between ~0.67 and ~0.71:

#create a 'stake' column and just set it to a fixed staking value
bp$stake <- 10

#save 75 percentile (3rd quartile of true postives and false postives)
bpTPq <-quantile(bTP$bookie_back_prob_norm, c(.75)) 
bpFPq <-quantile(bFP$bookie_back_prob_norm, c(.75)) 
#set up basic staking logic 
  #if the bookie back odds are between 3rd q of the FP and 3rd Q of the TP then we are going to stake $10 otherwise we are not going to stake ($0)
bp$stake <- ifelse(bp$bookie_back_prob_norm > bpFPq & bp$bookie_back_prob_norm < bpTPq, bp$stake,0)
#now simulate profit/loss on the stake amount
bp$profit <- ifelse (bp$TP == 1, (bp$stake*bp$bookie_back_odds-bp$stake),-bp$stake)
#create a total profit/loss cloumn
bp$profit_total <- sum(bp$profit)
#now create a cumulative profit for graphing
bp$profit_cum <-  round(cumsum(bp$profit),2)

#print the amount of profit we would make
print(max(bp$profit_total))
## [1] 42.2

Yay!!!! All that hard work and we got $42.00!! On my way to money town oh yeah!!

Ahem… back to reality. Lets chart that baby up and see what it looks like..

p4 <- ggplot(bp, aes(match_id,profit_cum))
p4 <- p4 + geom_path(aes(col=profit_cum), size = 0.5)
p4 <- p4 + geom_hline(aes(yintercept=0.0), col = "red", linetype = "dashed", size = 0.8)
plot(p4)

Not so pretty… BUT what really stands out is that profit never dropped below 0… now that is interesting…

So it appears that betting in this region is profitable (just). Lets just explore a little bit further. The total amount staked across all seasons was $42:

sum(bp$stake)
## [1] 1500

So if we made $42 then return on investment (ROI) is ~3%:

(sum(bp$profit)/sum(bp$stake))
## [1] 0.02813333

That is we invested $1,500 over the term and ended up with $1,542 (profit $42) for a total return of…. ~3%… amazing.. (I am being sarcastic, BUT making any profit as you will come to know is actually quite a challenge)

So how many bets did we actually make?

sum(ifelse(bp$stake ==10, 1,0))
## [1] 150

184 bets! That’s not many…, how many games did we forgo betting on…

sum(ifelse(bp$stake ==0, 1,0))
## [1] 1242

1,242! Ok so we ended up betting and profiting small on a low number of games, but came out on top. What was our staking accuracy??

Its the number of bets we placed and had profit over the total number of bets we placed:

(sum(ifelse(bp$profit >0, 1,0)))/
  (sum(ifelse(bp$stake >0, 1,0)))
## [1] 0.7466667

74%!! well that’s pretty damn good!

Recap

Ok lets just recap what we have learned.

  • If we use the bookmakers normalized probability to predict the outcome of matches then we would have achieved a 64% precision across seasons 2009-2015

  • If we stake on matches within the noramilsed probability of the 3rd quartile of the true positives and false positive results then we can achieve small (~3% ROI) and hence constitutes a safe bet

  • Using a simple staking threshold to back strong favorites did not achieve profit because the number of false positives outweighed the number of true positives times the odds.

Exploring long odds

So what if we look at the same scenario but for true positive and false negative events in the chance that we can gains some profit from betting on long odds (>2.0)

I’ll just jump straight to the box-plots for these, and quickly plot our preferred betting range as before:

bn <- subset(b, b$bookie_label == 0)
bTN <- subset(bn,bn$TN ==1)
bFN <- subset(bn,bn$FN ==1)
bnTNq <-quantile(bTN$bookie_back_prob_norm, c(.75)) 
bnFNq <-quantile(bFN$bookie_back_prob_norm, c(.75)) 
bn <- subset(b,b$bookie_label ==0)
p5 <- ggplot(bn,aes(factor(TN),bookie_back_prob_norm))
p5 <- p5 + geom_boxplot()
p5 <- p5 + geom_hline(aes(yintercept=bnTNq), col = "coral", linetype = "dashed", size = 0.5)
p5 <- p5 + geom_hline(aes(yintercept=bnFNq), col = "coral", linetype = "dashed", size = 0.5)
plot(p5)

Right, now lets put our opposite hats on. Looking at the box-plots we see that the plots are reversed compared to our previous probability distribution plots which is what we expect for well calibrated probabilities in the true/false negative space. But now what we want to explore is the area where there are a higher number of false negatives than there are true negatives. This is because a false negative means the model has predicted a loss, but the result was a win. So lets see if we can leverage off this because these are long odds so will pay out more.

Using a similar approach as before lets explore placing bets on games which are above the 3rd quartile of the true negative results and below the third quartile of the false negatives (the region between the dashed line/s)

#create a 'stake' column and just set it to a fixed staking value
bn$stake <- 10
#set up basic staking logic 
  #if the bookie back odds are between 0.67 & 0.71 we are going to stake $10 otherwise we are not going to stake ($0)
bn$stake <- ifelse(bn$bookie_back_prob_norm > bnTNq & bn$bookie_back_prob_norm < bnFNq, bn$stake,0)
#now simulate profit/loss on the stake amount
bn$profit <- ifelse (bn$FN == 1, (bn$stake*bn$bookie_back_odds-bn$stake),-bn$stake)
#create a total profit/loss cloumn
bn$profit_total <- sum(bn$profit)
#now create a cumulative profit for graphing
bn$profit_cum <-  round(cumsum(bn$profit),2)

#print the amount of profit we would make
print(max(bn$profit_total))
## [1] -120

Bugger!! looks like backing long odds in the region of higher false negatives doesn’t quite pay -off, we are down $120 which means that this would have wiped our profit from the short odds betting…Back to the drawing board on that one..

Summary

While brief, the above is a simple review of how good the bookmakers are at predicting winners (65% accuracy across 2009-2015) and gives brief in-site into the structure of the bookmakers odds. It shows that the bookmakers probabilities are well calibrated (the mean of the false positives is lower than the mean of the true positives) and additionally shows that there is a theoretical window of short odds betting which can make a very small, long term return on investment (~3%).

Now its time to explore any strategies which might make a higher ROI!! Stay tuned!!

24

NRL S2016 R03-R04 Predictions

NRL S2016 R03-R04 predictions

Summary

Hi guys! Since I will be on hiatus (holiday!!) as of Friday, I am not going to get a chance to post round 4 predictions after the conclusion of round 3. So I am posting round 4 predictions early with the caveat that I cannot update the model with latest results; therefore I would caution the use of round 4 tips. If you want to run with them go for it! If there are a few upsets in round 3 and/or injuries then for round 4, just use the bookmakers odds to determine your pick.

To do this is simple: If the odds for one team are less than the odds for another, then tip that team to win. For example if Broncos are paying 1.57 and the opposing team is paying 2.40 then you would back the Broncos (1.57 < 2.40). Easy!

Quick tips

season round_no tip_text
2016 3 North Queensland Cowboys to win against Sydney Roosters while Home
2016 3 Canterbury Bulldogs to win against Parramatta Eels while Home
2016 3 Newcastle Knights to win against Canberra Raiders while Home
2016 3 Brisbane Broncos to win against Penrith Panthers while Away
2016 3 Gold Coast Titans to win against Wests Tigers while Home
2016 3 Melbourne Storm to win against New Zealand Warriors while Away
2016 3 South Sydney Rabbitohs to win against St George Illawarra Dragons while Away
2016 3 Manly Sea Eagles to win against Cronulla Sharks while Home
2016 4 South Sydney Rabbitohs to win against Canterbury Bulldogs while Home
2016 4 Brisbane Broncos to win against North Queensland Cowboys while Home
2016 4 Canberra Raiders to win against Gold Coast Titans while Home
2016 4 Sydney Roosters to win against Manly Sea Eagles while Home
2016 4 St George Illawarra Dragons to win against Penrith Panthers while Home
2016 4 New Zealand Warriors to win against Newcastle Knights while Home
2016 4 Wests Tigers to win against Parramatta Eels while Home
2016 4 Melbourne Storm to win against Cronulla Sharks while Away

Perceived Probability vs Boomkaker Odds

match_up perceived_prob bookie_prob bookie_odds agree_with_bookie
North Queensland Cowboys vs Sydney Roosters 0.591 0.806 1.24 Y
Canterbury Bulldogs vs Parramatta Eels 0.741 0.637 1.57 Y
Newcastle Knights vs Canberra Raiders 0.578 0.417 2.40 N
Brisbane Broncos vs Penrith Panthers 0.525 0.667 1.50 Y
Gold Coast Titans vs Wests Tigers 0.550 0.465 2.15 N
Melbourne Storm vs New Zealand Warriors 0.603 0.476 2.10 N
South Sydney Rabbitohs vs St George Illawarra Dragons 0.517 0.725 1.38 Y
Manly Sea Eagles vs Cronulla Sharks 0.728 0.546 1.83 Y
South Sydney Rabbitohs vs Canterbury Bulldogs 0.589 0.515 1.94 Y
Brisbane Broncos vs North Queensland Cowboys 0.640 0.637 1.57 Y
Canberra Raiders vs Gold Coast Titans 0.569 0.752 1.33 Y
Sydney Roosters vs Manly Sea Eagles 0.539 0.472 2.12 N
St George Illawarra Dragons vs Penrith Panthers 0.627 0.606 1.65 Y
New Zealand Warriors vs Newcastle Knights 0.594 0.893 1.12 Y
Wests Tigers vs Parramatta Eels 0.660 0.417 2.40 N
Melbourne Storm vs Cronulla Sharks 0.636 0.472 2.12 N

Stake recommendation/s

match_up expected_return full_kelly_fraction recommend_stake
North Queensland Cowboys vs Sydney Roosters -0.267 -1.111 N
Canterbury Bulldogs vs Parramatta Eels 0.164 0.287 Y
Newcastle Knights vs Canberra Raiders 0.388 0.277 N
Brisbane Broncos vs Penrith Panthers -0.213 -0.426 N
Gold Coast Titans vs Wests Tigers 0.182 0.158 N
Melbourne Storm vs New Zealand Warriors 0.265 0.241 N
South Sydney Rabbitohs vs St George Illawarra Dragons -0.287 -0.755 N
Manly Sea Eagles vs Cronulla Sharks 0.332 0.400 Y
South Sydney Rabbitohs vs Canterbury Bulldogs 0.143 0.152 N
Brisbane Broncos vs North Queensland Cowboys 0.005 0.009 N
Canberra Raiders vs Gold Coast Titans -0.243 -0.736 N
Sydney Roosters vs Manly Sea Eagles 0.143 0.127 N
St George Illawarra Dragons vs Penrith Panthers 0.034 0.052 N
New Zealand Warriors vs Newcastle Knights -0.334 -2.787 N
Wests Tigers vs Parramatta Eels 0.583 0.417 Y
Melbourne Storm vs Cronulla Sharks 0.348 0.311 N

Conclude

Ill be back in business for round 5 (the all important first round of live betting)

NRL S2016 R02 Results

Hi guys, sorry this is not going to be a detailed overview, I’m a bit time poor at the moment! So time for a quick wrap of up round 2.

This round we got 5 of 8 correct for an accuracy of 62.5%.

Tips and if they were correct:

  • Penrith Panthers to win against Canterbury Bulldogs while Home
    • (correct? N)
  • Brisbane Broncos to win against New Zealand Warriors while Home
    • (correct? Y)
  • Canberra Raiders to win against Sydney Roosters while Home
    • (correct? Y)
  • South Sydney Rabbitohs to win against Newcastle Knights while Home
    • (correct? Y)
  • North Queensland Cowboys to win against Parramatta Eels while Away
    • (correct? N)
  • Cronulla Sharks to win against St George Illawarra Dragons while Home
    • (correct? Y)
  • Melbourne Storm to win against Gold Coast Titans while Home
    • (correct? Y)
  • Manly Sea Eagles to win against Wests Tigers while Away
    • (correct? N)

To date this gives us a rolling accuracy of 68.8%

In round 2 of 2015,  the model also got an accuracy of 62.5% so we are about in line with historic results.

For those observant I actually input old odds data into the round 2 detailed table and haven’t had a chance to retrospectively updated the post. As indicated before I have been improving the model iteratively and my latest model actually would have achieved a 7/8 result on this round! Unfortunately I couldn’t post before most of you would have put in your tips, but its nice to know the model is getting better (hopefully it will be raring to go for staking rounds!!).

I am working on trying to get a more standardised and automated layout for posting results and tips so please bear with  me until I get this right!