The BTC Draw Bias Project!
-
Hey @everyone
I’ve been doing a ton of work on draw bias recently and want to involve you, because there’s potential for some improvement to the way we calculate and use it in the software and I think many heads will be better than one!
This will be a long but hopefully interesting one. Please definitely read this if you’re currently using draw bias in your strategies, because there will absolutely be some changes that come out of this which will affect your results. If you only read one part, please read the “look-ahead bias” section as it identifies a shortcoming with the way we (and seemingly everyone else) currently use draw bias.
I basically want to come up with an optimal draw bias strategy rule. It may turn out that there isn’t one single answer and we need to make it configurable, in which case your feedback will be equally valuable.
I’m going to explain how we calculate it, what the downfalls are and go into the things I’ve looked at so far. Would love to hear your thoughts.
Draw Bias Formula
The draw bias figure is an impact value, which is a pretty industry-standard thing calculated as follows:
(category_wins / all_wins) / (category_runners / all_runners)
You’re basically dividing 2 strike rates by each other. For draw bias, these would be the definitions of the above:
- Category wins: Number of wins for a particular stall
- All wins: Number of wins in races which featured this stall. This is basically the same as saying “number of races which included this draw position”, since every race will be won by someone
- Category runners: Number of runs for this stall. This is basically the same as “all wins”, because each stall only ever appears once per race
- All runners: Total runners across all races which featured this stall
Some calculations of draw bias don’t include the limitation in bold above; they just total the number of races or runners at a particular course. This is misleading and in my opinion incorrect, because if you’re trying to figure out the draw bias for stall 20 and you’re including a load of races which only had15 runners in that calculation, how can that be accurate? The stall should at least have had a chance to win to be included in the calculation, in my view. If you feel differently, let me know.
So if Redcar stall 1 has 25 wins out of 183 races, with a total number of runners across all races of 1784, its draw bias figure would be:
(25 / 183) / (183 / 1784) = 1.33
Other Restrictions
We don’t just sum the number of races for a particular stall at a particular course. Currently, we also restrict it by race type and distance. So we create an individual draw bias figure for each combination of course, race type, distance (rounded to nearest furlong) and obviously stall number.
This is one area I’m looking for some feedback for, or at least some ideas to test out. Some other possibilities I’ve considered are:
- Going
- Number of runners
- Handicaps / non-handicaps
- Time limit (i.e. how far back do we calculate the figure over?)
Look-Ahead Bias
This is an important part. @Alexander-Vincent recently logged a support ticket as some of his backtesting results had changed and he couldn’t explain why.
When I looked into it, it was obvious what had happened, but I was still surprised it had the effect that it did.
Basically we currently use a fixed figure for the draw bias, so we’re calculating it as described above and updating it every so often, but we’re not calculating a value for every individual race and using that in the backtesting - we’re just applying the currently calculated value to past races.
We’d obviously usually avoid doing this, but the reason we do it (apart from “it’s what everyone else does”) is because the value changes so little over time. Draw bias is supposed to be an objective measure of how much advantage a particular stall has, all other things being equal. If you think about it, unless the course configuration changes in some way, the figure should change very little, given a decent enough sample size.
And indeed it doesn’t change much at all, usually about 0.02 back and forth at most (having tracked it for a while before implementing this), as runs and wins are racked up at a course. The value for each stall will basically slowly decay until the next win happens, at which point it returns to the mean. If there’s an “extra” win, it may increase slightly and then decay back to the mean.
However, unfortunately, this had a bigger effect than expected on the backtesting results, with quite a few runners appearing and disappearing as the figures changed.
I do also think it’s creating a kind of look-ahead bias from basically using a future figure in past results, which could be making past results using the draw bias look rosier than they actually are. It’s similar to when you base your strategy on the BSP in the backtesting, even though you’re betting 10 minutes before the race when that figure wouldn’t be known. Again, you wouldn’t think the effect would be quite as bad with a draw bias figure that hardly changes, but it seems it is there.
Arguably, if such a small difference in draw bias has a dramatic effect on your strategy results, it’s probably an indication that the draw bias isn’t particularly statistically significant in that strategy.
OR maybe we can simply do better when it comes to the way we calculate it in the first place, so that it becomes a more reliable indicator on any given race day.
Either way, the bare minimum we need to do is start capturing a draw bias figure per individual race, which we’ve already started testing. The question is what other modifications to make to improve it, hence the thread.
Rough With The Smooth
One thing I noticed was that the draw bias obviously increases more following a win for a stall with a smaller sample size.
Let’s say there are 3 races for a stall and there’s a win in the final race. The 3 draw bias figures might be:
- 1.33
- 1.32 (no wins for this stall since the last date, but some more races / runners)
- 1.35 (a new win for this stall)
The draw bias hasn’t actually changed really, it’s just the natural decay and reversion process I described earlier at work.
If we’re going to start capturing a value per race, I think we need to “smooth” the results in some way so the figure is more stable over time.
So we’ve created a “2D Draw Bias” version, which first calculates the simple draw bias as described earlier (this is the first dimension), then takes the average of the last 3 simple draw biases, including the latest one, and that gives us our 2D Draw Bias value.
I’m still testing this. I don’t know what the ideal number of races to average over would be. Instinctively I think it should be way more than 3, maybe equivalent to the average number of races per meet per day, so it at least doesn't really change intraday.
The more races, the more stable the figure will be, but the greater the lag would be in detecting a genuine change to the draw bias. Thoughts very welcome.
We Need To Go Deeper
Another smoothing method then came to mind. I’m not claiming to have invented this, I definitely read it somewhere else, but it could be relevant.
Draw biases generally manifest themselves as “lower / higher is better”. So at Chester over certain distances, lower is better, with the bias gradually petering out the higher the stall number. I don’t think you really get a draw bias profile of “Stalls 1, 5 and 13” = Good. Feel free to correct me if you know differently; I haven’t fully tested this yet.
So another potential smoothing method could be to take the average of a particular stall and its 2 neighbours. So stall 2’s draw bias would be an average of the calculated bias figures for stalls 1 and 3. Stall 1’s bias would just be an average of stalls 1 and 2.
If we also apply the previous smoothing method, we would end up with a "3D Draw Bias", averaged over multiple races and neighbouring stalls.
Summary / Questions
That’s basically as far as I’ve got. So if you wonder what I’m up to when I go quiet for a while on the forum, this is the kind of thing buzzing around my head
Feel free to provide input and feedback on absolutely ANY of the above. Just to summarise the specific questions I threw out there over the course of this ramble:
- Are you happy with the base formula in the first section, especially restricting it to “draw races” instead of “all races”?
- Which other factors should we include when calculating? Going? Runners? Handicaps? etc
- How far back should we calculate the draw bias over? Maybe it should be based on a fixed sample size, e.g. “whichever date gives us x wins for that stall”? Also courses do sometimes try to eliminate biases or make changes to layouts. Maybe it should be calculated from the date of the last change for that course?
- Which smoothing methods should we use?
I think the answer will generally be “whatever works best and is most profitable!”, so just feel free to shout ideas and we will then test them and share the results.
Maybe we should come up with a base “strategy” that essentially isolates the draw bias, and then we’ll just run it multiple times, testing each factor to see which is most successful. It’s probable that what works best in one strategy may not in another, though.
Maybe you’d prefer to have some configuration options, or just multiple different draw bias versions so you can choose which one to use yourselves. We could always re-evaluate later and if everyone’s basically using the same version, we just consolidate things.
We could also explore other related figures aside from this impact value one, like adding a Draw A/E ratio, or even a Draw PRB figure. There are many possibilities.
I’m excited for us to come up with something because as far as I know, we’ll be the only place you can truly backtest draw bias. In the meantime, please be careful when using draw bias in your strategies and bear in mind the limitations I’ve highlighted in this post!
-
I'm going to implement a backtestable version based on course, distance and race type for now, smoothed over the last 10 races.
This has produced the best results so far in testing without messing with the key variables (adding runners, going, etc).
We can build on this. I think the next obvious improvement is to limit the timescale to the last time a course was updated (for example Ascot had a massive redevelopment in 2005). We're putting together a list of these now.
We're going to release quite a big update to the horse racing software tomorrow, which I'll announce shortly on the Changelog thread. It will include the new backtest-capable version of the draw bias.
-
My personal opinion, but I think draw bias is to reliant on the form/ratings/stats of the other horses and therefore you will end up with far too many variables to test with any confidence.
-
Update:
I've tested several variants of draw bias stats. So far I've basically just swapped between different versions of the rule in my existing strategies that were using draw bias (4 different strategies).
I'm still planning on creating a more "neutral" test strategy to try and isolate the draw bias; it was just easier to get a measure of how the figures change if I plugged them into strategies I was already familiar with.
Versions I've tested are:
-
Same draw bias calculation but instead of the fixed figure we currently use, calculating it for every historical race based on the results before that date (so basically a backtested version of the formula we already use). This is based on course, race type, distance and obviously stall
-
A 2D version which averages the calculated draw bias over the previous 3 races
-
A 3D version which does as number 2 but also takes an average of this stall and its neighbours
-
An "all stalls" version which doesn't restrict the formula to races which featured the particular stall being calculated, as described in my long post above (i.e. "all races / all runners" instead of "all races / runners that included this stall")
-
A version of the "simple" draw bias described in point 1 but with the going added as a factor
The bad news is that introducing the properly backtested version (point 1) instead of a fixed figure dropped the profit by about half in 3 out of 4 strategies. I guess the look-ahead bias is definitely an issue. However, they were still profitable and the draw bias definitely contributed to that profitability. It may even be that the actual value used in the filter just needs to be adjusted.
The other strategy of the 4 actually turned from a profit to a loss in this test. This strategy had quite a few rules in it, which always concerned me anyway, and I suspect I need to go back to the drawing board on that one and figure out which other rules should actually be included.
The 2D version (point 2) performed better than the "pure" version. I think only averaging over 3 races is too little so will experiment with some longer ranges.
Surprisingly the 3D version (point 3) performed worse in all cases!
Unsurprisingly the "all stalls" version (point 4) also performed worse.
Finally the going version (point 5) also performed worse than the version without it, which also kind of surprised me. The problem is, there are a lot more variations and combinations to test (number of runners, handicaps, time limits, horse age could even potentially be a factor) so the going could come into play again at some point.
This is going to take a while. I'm tempted to replace the live version in the software with the simple backtested version for now while we test the other variations, as I don't want people to be using a version with the look-ahead flaw. I will brace myself for the hatemail due to reduced backtesting profits.
-
-
@Tony-Hastie Yeah pace ratings and speed ratings are different, but you mentioned how quickly the horse leaves the stall, which is basically "pace".
Speed ratings are usually more a measure of the horse's overall performance, based on the time they take to complete a race over a certain distance, certain weight carried, etc etc.
There's a pretty good article on them here. Creating our own is definitely on the list at some point!
-
@Tony-Hastie said in The BTC Draw Bias Project!:
Ive played around with draw bias and came to the conclusion that its just much too complicated for me to use. One thing I remember from my "draw bias" chat gpt sessions is the importance of a speed rating(especially how quickly the horse leaves the stalls). Is that something you could look into? I recall going was also quite important, which I guess impacts the speed the horse leaves the stall at. Thats my paltry offering
This is basically what our pace letters / ratings tell you. There's definitely potential to combine this with draw bias. Often a horse that's quicker off the mark will be able to take better advantage of the draw bias.
-
@Greg-Mitchell said in The BTC Draw Bias Project!:
Lay a certain draw at a certain track/distance with a certain number of runners if the Fav is drawn in a particular stall
So this would be when the fave is in an unfavourable draw?
Yeah I think the trick with draw bias is definitely to combine it with other factors. Most of the biases are quite well known and are over-bet, so you need to eek out some value somehow.
I want to look into negative draw bias strategies as well when we have this a bit more nailed - horses that lost previously, but ran well from a poor draw, which could suggest that they actually ran better than their finishing position suggests. They'll probably be undervalued in their next race.
-
@Andy-Donnelly said in The BTC Draw Bias Project!:
@Adam Thanks Adam, I like the idea of smoothing in sets of threes maybe.
Yeah seems to make sense, I will test it.
Agree maybe use the last time a course changed as the time period if that is possible.
Course layouts don't change that often so it should be possible. Probably be a manual job but not too much work!
I’m not a horse racing expert but think using number of runners in the rating make sense. Personally not sure about adding anything else at this stage. I suppose a question to those that know more than me, using Chester as an example. Does the bias towards particular stalls get significantly affected by the going?
I believe at Chester when the ground is soft, the outside stalls actually have an advantage. This might be because the lower stall draw bias is so well known that everyone wants to race there, but the ground gets all chewed up, leaving whoever's still wide with an advantage!
-
Ive played around with draw bias and came to the conclusion that its just much too complicated for me to use. One thing I remember from my "draw bias" chat gpt sessions is the importance of a speed rating(especially how quickly the horse leaves the stalls). Is that something you could look into? I recall going was also quite important, which I guess impacts the speed the horse leaves the stall at. Thats my paltry offering
-
Hi Adam, I don't currently use Draw bias in any of my BTC software strategies, however similar to what I have done with the Greyhounds, although thats a little easier to figure out given there are only 6 or 8 runners.
But I think (may be wrong) that the Favourites Draw Position and/or Draw Bias is important and I like to include it in the calculation.
So for example, I currently have a number of BFBM bots which are automatic and don't rely on on BTC software integration that do the following:
Lay a certain draw at a certain track/distance with a certain number of runners if the Fav is drawn in a particular stall, by way of example:
Kempton AW between 5f and 8f with between 8 and 12 runners Lay any horse Drawn 1 if the Fav is Drawn 3 or 4.
I have only just started forward testing, so don't have enough results to see if it's working. But in backtesting, although there aren't many selections (around 100 in the last 3 years), the strike rate is 93% with an ROI of 10%
I have similar strategies for Kempton Drawn 2, Lingfield Drawn 1, Wolverhampton Drawn 1 and Brighton Drawn 3, 4 and 7.
-
@Adam Thanks Adam, I like the idea of smoothing in sets of threes maybe.
Agree maybe use the last time a course changed as the time period if that is possible.
I’m not a horse racing expert but think using number of runners in the rating make sense. Personally not sure about adding anything else at this stage. I suppose a question to those that know more than me, using Chester as an example. Does the bias towards particular stalls get significantly affected by the going?