Books_20170913

Read up!

As described in previous post I went back to the drawing board and redesigned my models. To get some inspiration and motivation I bough a few books and read them carefully. I did not anticipate to get complete “+110% ROI MEGA DELUXE MODELS” but my hope was to get some inspiration which I could use when creating my own models and strategies. The books I read were by James Butler and Joseph Buchdahl and I can certainly recommend them if you are into the game of betting .

 

“Programming for Betfair” & “Betfair trading techniques” by James Butler, “Squares & Sharps, Suckers & Sharks” by Joseph Buchdahl.

Some of the new things in my models would not have been there without these books, thanks James and Joseph!

 

 

Books_20170913

Update of Results YTD

The last months have been a real roller coaster ride! As mentioned in previous post my ROI started to decline in February/March, but I stayed with my models all the way into July. There I took the decision to accept that my models had lost their edge, and I went back to my analysis tools and after some hard work came up with a new set of models to implement. They were implemented in the middle of August.

It might sound like a trivial thing to determine when your models are without edge, but it is not! Betting volatility is hard to see through, and my models had served me well for a couple of years (with only minor changes during that time). Betting is a long term game, but in retrospective I held on to my models to long. Lesson learned: Update and improve models more frequent!

My new models are in many ways much better than previous – They contain more pricing variables (and hopefully a more accurate odds calculation)  and they are estimated on more recent data. Now I need to wait and follow them for a while before optimizing them.

I have updated some graphs which contains accumulated figures of turnover, profit/loss and yield for 2016 and 2017 YTD.

 

I have exactly the same behavior 2017 as I did in 2016, it starts great and then it  declines from February/March. My yield now 2017 YTD is 0.45%, for 2016 same time (week 36) was 0.65%.

The turnover is much bigger than 2016, the only reason for this is that my bank has grown and therefor also my stakes. I just passed 7.000.000 SEK in 2017, and at the same time in 2016 I had staked around 3.000.000 SEK. Due to the fact that I am using new models I decided to change my requested stake size from 3% to 2%. Therefor I expect the accumulated turnover to grow slower for the rest of the year.

Thanks to the higher turnover I also have a higher PL (31.000 SEK 2017 YTD) compared with 20.000 SEK at the same time in 2016.

In 2016 I had a real good 4th quarter, it will be very exciting to see if my new models will continue to perform for the rest of the year.

Books_20170913

Edge gone to hell, or seasonality?

It’s been some time since the last post, reason is that I had to put some time into my betting models… My problems started in march when my bank started to slowly decrease instead of increase AS SUPPOSED to.

First I kept calm and let the bots run unchanged (AS SUPPOSED),  but the bad trend continued into April and from there into May. In this period there were now quite many bets generated ( 2616 in the period 1.March to 15.May).

As seen in the table above I have been seriously hurt in the Draw and Away models, and the yield is -1.3% which is exactly my long term yield target BUT WITH THE WRONG SIGN.

I am getting older and older and my memory might not be as sharp as earlier (!), but I had a hunch that my models performed real bad in the same period last year. So I dived into my old betting history and took out the performance for the same period in 2016:

OK, my hunch was correct – I had shitty performance in the same period last year (-1.08% yield).

As a final check I plotted the accumulated yield% as a function of week to see if there is some kind similar behavior:

It is now getting quite obvious that I have a repeating pattern between 2016 and 2017. Great performance in January and February, terrible in March, April. If this pattern continues I will see better performance for the rest of the year.

I am still not sure what generates this “problem”, my guess is that its related to the mix of leagues (some starts and stops in March and April), and I don’t take that fact into my current models. So, as a start to address this issue (and hopefully avoid the same pattern in 2018) I have now developed a “League classification rating” which I intend to implement for the third quarter this year.

Some details about my new rating model will be presented in a later post.

 

Books_20170913

Betting results of 2017Q1

Another quarter has passed and it is time to check how the models are performing. The result for the first quarter of 2017:

I am happy to see that it is now my ninth quarter in a row with positive yield! This quarter my bot managed to get matched at least partially in 2316 unique markets. It turned about 2.700.000 SEK (approximately 284.000 EURO or 244.000 GBP) to a yield of 1.20%, bringing a profit of 32.691 SEK (approximately 3420 EURO or 2930 GBP).

My target for 2017 is to turn 10.000.000 SEK to a yield of 1.3%, I can conclude that I am a little ahead of the amount turned but a little behind on the yield. The bad apple of this quarter is the performance of the Away bets with a yield of -2.28%.

I only update my models when the long term performance seems to be falling, some models are updated more frequently than other…  My current models with lifetime and performance:

 

The Home model is the jewel in my portfolio – is has been unchanged for a year (exactly today), during that period it has generated 2118 bets with a yield of 2.33%.  The bad apple is the Away model which now is performing below expectation also when looking at its total lifetime! Unfortunately I haven’t found anything that could improve the model, so I decide to keep it running for a little longer (0.78% is still money in my pocket). When looking at the Draw and O/U models I have found some “low hanging fruits” that can improve the models with only a small reduction in expected number of bets, so even if they are performing above expectation I will launch these changes (or I actually did a couple of days ago). The jewel is unchanged and worshiped for another quarter!

Finally, summing up my total betting career since 2008:

55.523 bets (counting bets and not markets) with a lifetime P/L of 111.302 SEK (approximalety 11.600 EURO or 9980 GBP), most of the profit made in the last 18 months.

Books_20170913

Betfair Premium Charge simulation

As my bot now has a track record of 2 years in profitability I decided to do some research in the topic of Premium Charge on Betfair. As of today I am not paying any kind of additional charges, but I guess that if my bot keeps moving money to my account I will sooner or later reach the PC limit? Is there some strategy that I could use to optimize my model between profit and charges?

This will be a two part post. This first post will focus on the behavior of PC charges in the context of my model, the second post will focus on optimizing the model with charges as one of the factors.

Right now my total commission to gross profit ratio is 37.8%. All those years turning over money for a small loss are finally paying off! But the ratio is declining and if I have understood everything correct the first magic limit is 20%, when hitting that limit I will always need to pay the difference up to 20% in PC charge.

If I should be even more successful (that is my plan) I could eventually hit the Super Premium Charge (I need to have net profit of £250.000, which is far from my current profit…). In that case I could be eligible to pay the difference up to somewhere between 40-60% based on my actual ratio.

It is hard to get a grip of what that would mean to my kind of betting, so to clarify I created a small simulation where I simulate the behavior of my model (same kind of odds and tested it for different gross ROI%) and this is what I came up with:

The above chart shows which kind of commission/profit ratio (from now C/P Ratio) my model would generate for different edges.

A. This is the current expected yield of my model right now (1.3%). At this point I expect my C/P Ratio to be around 28 %.

B. This is the point to where I can adjust my model without reaching the Premium Charge (around 2% yield).

C. If I ever reach the level of Super Premium Charge (£250.000), I will need to hold my model up to max 0.9 % yield to avoid paying that charge.

The above chart show how my model would be effected by Premium Charge (PC) and Super Premium Charge (SPC). As an example I have plotted the line to show the effect of a model returning a gross yield of 3%. The PC would bring it down to 2.7 %, and finally when hitting SPC it would be brought down to 2.1 %.

How to conclude on this?

I now know that I can calibrate my model up to a gross yield of 2 % without paying the PC, and if I reach the SPC limit I must keep the model below 0.9% yield to avoid SPC.

In the next post I will apply these curves to my own models, calibrate them at different yield% and see how many bets are generated at different levels and finally calculate my expected monetary win (yes, I prefer to maximize money and not minimize charges!).

 

 

Books_20170913

Evaluating my bot bets with hit-rate

During the last few weeks I have noticed a drop in turnover and especially in number of bets placed by my bot. Is my edge vanishing? What is the problem?!

To answer these questions I needed to create three KPI’s that describes how my models are performing in terms of generating bets and turnover; Hit-rate%, Try-rate% and Model%. I define them as:

Hit-rate = # Matched markets / # Potential markets
Try-rate = # Amt req markets / # Potential markets
Model-rate = # Potential markets / # Followed markets

The gross number of markets followed by the bot is labeled “Followed markets”, the number of markets that are within my risk appetite (meaning a betting situation can occur) is labeled “Potential markets”, “Amt req markets” are the number of markets where I asked for a bet and finally the “Matched markets” is the number of markets where I at least got a bet partially matched.

Plotting these KPI’s for the last couple of years:

 

From the above chart we can see at least three important things:

a. The difference between my Try-rate and Hit-rate is constant => I still get at least partially matched in 90 % of my bets.
b. There seem to be a lift in hit-rate/try-rate in January 2017, which is contrary to what my intuition says. A rise from around 10 % to 15 %, which can be explained by the new strategies I have added for 2017 (they are only tested with minimum stakes and therefor their presence is only visible here and not in turnover).
c. The Model-rate is also constant at around 85%, meaning that my risk appetite have the same impact in relative terms as previous years.

In the above chart we see the absolute number of markets followed and markets within my risk appetite. We can clearly see two things:

a. The cyclic nature of soccer markets, with many markets played in April and October and less markets in December/January/June.
b. The increase of markets followed by the bot during the last years, explained mainly by improving my code and therefor making it possible to follow more markets simultaneously.

From these two charts I conclude that the low in bets generated is simply a problem with few markets played. When a market is followed I still have the same probability to find a betting opportunity and the same probability to get a bet through. I am also positive surprised that the test strategies lifts my hit-rate from 10 % to 15 %, now I only hope that they also will deliver a ROI of +101%.

Books_20170913

Top10 supported soccer teams – Looking for edges – Part 3 of 3

This is the third post in the following series:

1. If many “play-for-fun” supporters bet on their favorite team, can laying them pre-game be a winning strategy?
2. What if one of these teams take a one goal lead in-play. Should I back or lay?
3. What if their opponent takes the lead by one goal. Should I back or lay?

In this last exercise we examine the situation where the Top10 team suddenly is trailing by one goal. This doesn’t happen often so there is only a small amount of data.


There seem to be value in laying the Top10 team if it is the home team, and the match is a domestic league match. It seems like the market overestimates the comeback potential in those cases!

Now we have mined through some data and found a few angles that could be interesting to exploit, so in the next blog post I intend to create some strategies from these insights for 2017 – and will follow up on them during the year. So check back in a few days!

Books_20170913

Top10 supported soccer teams – Looking for edges – Part 2 of 3

This is the second post in the following series:

1. If many “play-for-fun” supporters bet on their favourite team, can laying them pre-game be a winning strategy?
2. What if one of these teams take a one goal lead in-play. Should I back or lay?
3. What if their opponent takes the lead by one goal. Should I back or lay?

The data is from in-play match-odds from 2013, and the bet is calculated from the first recording after the first goal that also has an over-round of maximum 2 %.

I mined through the data and found something interesting when I separated league matches from other matches (cups, champions league etc). Domestic league are marked as “Y” and others as “N” in the table:

post20161203

Backing the top10 teams in other matches but league-matches has been a good profitable strategy the latest years, and has worked well both when the top10 team is playing home and when playing away.

The league matches show the opposite trend, backing the top10 team would have been something similar to setting fire to your money. On the other hand, laying them would have been profitable (including the negative yield laying away in 2016).

In the next post I will deep into the situation where the opponent to the top10 team takes a one goal lead…

Books_20170913

Top10 supported soccer teams – Looking for edges – I/III

I decided to look into the European soccer teams with the biggest supporter base. Doing a quick google on the subject I found the top10 teams to be:

1. Manchester United
2. Real Madrid
3. FC Barcelona
4. Chelsea
5. Arsenal
6. Liverpool
7. FC Bayern Munich
8. AC Milan
9. Juventus
10. Paris Saint-Germain

I found the list at totalsportek.com, it is their ranking (based on followers on social media, TV-viewership, shirt sales and sponsorship deals), and I decided to go with that. I have three questions I want to explore:

1. If many “play-for-fun” supporters bet on their favourite team, can laying them pre-game be a winning strategy?
2. What if one of these teams take a one goal lead in-play. Should I back or lay?
3. What if their opponent takes the lead by one goal. Should I back or lay?

I will split this subject into three different blog post, starting with the pre-game question. My hypotheses is that when big amounts of supporter money hits the line the odds on the big team will get eaten, therefore there might be an edge laying the big team.

I use my own recorded data on Betfair with the following notes:

1. The pre-game odds that I use is recorded a few minutes before the kick-off.
2. If it’s a match between two top10 teams, then it’s excluded.
3. Data from 2013 until today.
4. Not complete data, some matches have not been recorded and I know nothing about them.

The result I get is seen in the the table below:

post_20161128_1

I am looking for a strategy that have been consistent over time, and where I have some exposure. Both Premier League and Primera Division have a history of positive yield when laying any of the top10 teams. Maybe this could be an interesting pre-game strategy for 2017? It’s big markets and you can probably get large sums matched pre-game.

post_20161018_1

Model of expected overtime in soccer

A couple of years ago I wrote a post (here) regarding the average match length in soccer matches, based on Betfair data. A few days ago I got a replay from David with an explanation on my findings (game length decreases by number of goals). It actually made me curious to pick up this subject once more! In my ordinary data I don’t have the exact additional time (delivered by the fourth referee), so it can actually be of great value to me to predict how long the match will be. So instead of always guessing that there are 2.5 minutes added, I can hopefully differentiate that and get a better guess.

This time I will take it one step further and build a predictive model of the remaining game-time given that we just reached the full ordinary time (90 minutes).

The variables I will try in my model are:

1. Number of total goals (k59)
2. Number of total red cards (k60)
3. Number of total yellow cards (k61)
4. Absolute goal difference (k44_grp)

The short name in parenthesis is the short name that I use in my data, so instead of me renaming my whole database you can look them up in the table above.

First I need to chose a model, I look at the distribution and it seems like a Gamma distribution could be used:

post_20161018_1

I decide to go with a GLM using the underlying Gamma distribution, and I use the ending game-minute as response. I put all the four variables into my model, and estimate. I get:

post_20161018_2

All four variables included are significant, and “number of yellow cards” and “absolute goal difference” are the most explaining ones. The estimation is done and the expected game-length is given by:

E[game-length]= 1/exp(- (4,5281 – ‘total goals’*0,0002 + ‘number of red cards’*0,0014 + ‘number of yellow cards’*0,0012 -‘absolute goal difference’*0,0033))

I do a quick sanity check of the model by plotting expected game-length as a function of ‘absolute goal difference’ (locking the values for red cards = 0 and yellow cards = 4, corresponding to their rounded averages). In the same graph I plot the one-way averages (the “real” average game-length for each ‘absolute goal difference’ with red and yellow cards being what they were).

post_20161018_3

There it is, a reasonable and logical model of game-length – giving me a better tool than assuming 92.5 minutes for all matches!