SHOP
Ad

The need for speed (data)

17 January 2023 Written by Danny Russell

How can a horse that finishes midfield be considered a good run? How can a galloper that fails to beat home half the field come out and win convincingly next start? The answer is often hidden in the clock.

Not all races are run to break track records. Some fields are slow out, fast home. Some set a hot speed early, and then grind home late. Some are forgettable muddling affairs. And the change-up of speeds all affect a horse’s ability to win.

Until recently, the racing public did not have immediate access to the right tools to unravel the science. But now, thanks to Racing Victoria's (RV) long-term deal with TripleSdata and Champion Data, we have a plethora of information at our fingertips – real-time statistics that allow us to better judge a horse’s ability and performance.

“There is a lot more in-depth analysis of the actual race shapes than there ever has been,” said Flemington trainer Danny O’Brien. “Guys like Vince Accardi and a lot of the form analysts spend a lot of time dissecting the furlong-by-furlong speeds of every race and working out how it was run – where the pressure was put on to it; whether it was early, late, mid sectionals.

“I certainly excuse horses on race patterns or race shapes. When horses – through no fault of their own – end up back in a slowly run race, you can only get home so quickly. It doesn’t matter how good you are, you usually can’t overcome something like that.

“A midfield finish may not be anywhere as bad as what it looks.”

In 2021, TripleSdata (an official distributor of Swiss Timing) and Champion Data began tracking every horse in every race at Flemington as well as runners at the Valley, Caulfield and Sandown.

This data is captured by fitting a small GPS device to a runner’s saddle cloth before a race. These gadgets are about twice the size of those used by Champion Data on AFL players during a game of footy.

The amount of detail then able to be transmitted in real time by Champion Data and TripleSdata is mind boggling – speed, sectionals (every 200m split), stride length (acceleration), what lane each horse is running in (two wide, three wide, etc), what distance they cover in a race and the position of every runner in the field.

This data can then be combined with variations such as track conditions, wind speed and wind directions to rate performances.

By looking at speed across 200m sectionals as well as race pressure and race tempo, form analysts can start to compare – with a certain degree of confidence – the abilities of different horses who run on different days at different tracks.

Flemington trainer Simon Zahra says comprehensive race day data is freely and immediately available on the Racing.com website and his stable downloads it and sends it to owners as part of their post-race reports.

“Sometimes your performance looks below par, but then you go back over the sectionals on that race and on that day and it might have rated better than what you think,” Zahra said.

“So sometimes you get disappointed in a horse’s race and then you actually go over the sectionals and they suggest it was a better run than what you think. So you think, ‘OK, we are on the right track’.” - Simon Zahra

Broadcasters Racing.com, Channel 7 and Channel 10 have embraced the availability of the speed data to provide viewers with live statistics as a race unfolds, while punters are able to comb over a race to pinpoint key information. The stats can reveal whether a horse can maintain a strong gallop from the front, sustain a long run from the back, whether it ran wide during a race, whether it struggles to do any work early, whether it has a withering sprint late, whether it was held up at a crucial stage and even if it is shortening stride and might be in need of a spell.

The increasing availability of data is benefitting trainers, connections, punters and analysts. These figures are enormously helpful in dissecting and interpreting what has unfolded in a race as well as providing valuable information on the relative merit of each individual performance.

Big-scale trainers such as O’Brien also use GPS technology – such as EquinITy or Horsecall – as an essential tool to monitor their horses in work. While track gallops are run at a more tempered, controlled pace to steadily build fitness, the GPS devices still record speed, sectionals, stride length, stride rates and heart rates.

“We use it more for judging how fit the horses are and picking up issues with any horses before they become problems. If they’ve got a delayed recovery and they are a good horse that would normally recover quickly, you know they are not 100 per cent,” O’Brien said.

“As far as judging their ability, there is still nothing like putting them in a trial or, more importantly, putting them in a race. I mean, there’s nothing like the winning post to sort out all opinions.”

O’Brien employs a data analyst who starts poring over the figures from 8am on the day of his track gallops – sometimes for more than 40 horses in a morning. The analyst then sends a more concise and condensed report on every horse to the trainer by 10am.

The stable provided two examples from one winter’s morning gallop: Horse 1. Sectionals: good. Heart rate: 122 beats per minute. Heart rate interval: very good. Acceleration: good (acceleration is looking at the stride pattern, how much they were pushing through). Comment: coped with well. Horse 2. Sectionals: good. Heart rate: 139 beats per minute. Heart rate interval: delay. Acceleration: unbalanced. Comment: need to go over.

“For me it has been a great help. You are not just guessing. A lot of the smoke and mirrors about having a feel for this or a feel for that, you can’t argue with numbers and data in my opinion. It’s there.” - Danny O'Brien

“The recovery is really the one,” O’Brien said. “The horses that have that quick recovery – and some of them don’t have to exert themselves to the same level as well – the better horses recover very quickly.

“If a horse’s recovery is not as good as it can be – and we have a backlog of data on most of our horses – it gives you a real heads up.

“You get that horse scoped as soon as he gets back. Take a blood off it. Trot it up. All the things to make sure if there is an issue, you get ahead of the curve on it.

“For me it has been a great help. You are not just guessing. A lot of the smoke and mirrors about having a feel for this or a feel for that, you can’t argue with numbers and data in my opinion. It’s there.”

Don't miss out on Resimax Group Rapid Racing. Fast, fun racing down the Flemington Straight on a Friday afternoon. 

System.Web.HttpException (0x80004005): Error executing child request for handler 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'. ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at ASP._Page_Views_Partials_googleAd_cshtml.Execute() in C:\home\site\wwwroot\Views\Partials\googleAd.cshtml:line 4
   at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
   at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
   at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
   at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance)
   at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)
   at Umbraco.Web.Mvc.ProfilingView.Render(ViewContext viewContext, TextWriter writer) in D:\a\1\s\src\Umbraco.Web\Mvc\ProfilingView.cs:line 25
   at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass3_6.<BeginInvokeAction>b__4()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass3_1.<BeginInvokeAction>b__1(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult)
   at System.Web.Mvc.Controller.<>c.<BeginExecuteCore>b__152_1(IAsyncResult asyncResult, ExecuteCoreState innerState)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
   at System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult)
   at System.Web.Mvc.Controller.<>c.<BeginExecute>b__151_2(IAsyncResult asyncResult, Controller controller)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
   at System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult)
   at System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult)
   at System.Web.Mvc.MvcHandler.<>c.<BeginProcessRequest>b__20_1(IAsyncResult asyncResult, ProcessRequestState innerState)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
   at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)
   at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
   at System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerAsyncWrapper.<>c__DisplayClass3_0.<EndProcessRequest>b__0()
   at System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerWrapper.<>c__DisplayClass5_0.<Wrap>b__0()
   at System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerWrapper.Wrap[TResult](Func`1 func)
   at System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerWrapper.Wrap(Action action)
   at System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerAsyncWrapper.EndProcessRequest(IAsyncResult result)
   at System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage, VirtualPath path, VirtualPath filePath, String physPath, Exception error, String queryStringOverride)
   at System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage, VirtualPath path, VirtualPath filePath, String physPath, Exception error, String queryStringOverride)
   at System.Web.HttpServerUtility.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage)
   at System.Web.HttpServerUtility.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm)
   at System.Web.HttpServerUtilityWrapper.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm)
   at System.Web.Mvc.Html.ChildActionExtensions.ActionHelper(HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues, TextWriter textWriter)
   at System.Web.Mvc.Html.ChildActionExtensions.Action(HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues)
   at Our.Umbraco.DocTypeGridEditor.Web.Extensions.HtmlHelperExtensions.RenderDocTypeGridEditorItem(HtmlHelper helper, IPublishedElement content, String editorAlias, String viewPath, String previewViewPath, Boolean isPreview)
   at ASP._Page_app_plugins_doctypegrideditor_render_DocTypeGridEditor_cshtml.Execute() in C:\home\site\wwwroot\app_plugins\doctypegrideditor\render\DocTypeGridEditor.cshtml:line 34
   at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
   at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
   at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
   at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance)
   at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)
   at Umbraco.Web.Mvc.ProfilingView.Render(ViewContext viewContext, TextWriter writer) in D:\a\1\s\src\Umbraco.Web\Mvc\ProfilingView.cs:line 25
   at System.Web.Mvc.HtmlHelper.RenderPartialInternal(String partialViewName, ViewDataDictionary viewData, Object model, TextWriter writer, ViewEngineCollection viewEngineCollection)
   at System.Web.Mvc.Html.PartialExtensions.Partial(HtmlHelper htmlHelper, String partialViewName, Object model, ViewDataDictionary viewData)
   at System.Web.Mvc.Html.PartialExtensions.Partial(HtmlHelper htmlHelper, String partialViewName, Object model)
   at ASP._Page_Views_Partials_grid_editors_Base_cshtml.Execute() in C:\home\site\wwwroot\Views\Partials\grid\editors\Base.cshtml:line 20