Articles /

Backtest on 60 Race Files: How Accurate Is the Engine

2026-09-01 · Lo U Ian

AeroPacer's finish-time prediction runs on a physics engine, not a statistical regression. The upside of a physics engine is that it can compute a new course on day one. The downside is that you have to prove it computes correctly. This article lays out how I validated it.

How I tested

The method is called replay: take the power record the athlete actually produced on race day, feed it to the engine segment by segment, add that day's hourly wind direction and speed plus the course's cornering slowdowns, and compute how long the engine thinks that ride "should" have taken. Then compare that with the actual time recorded on the head unit.

The most important detail is CdA (drag area). If you back out CdA from a race's own file and then use it to predict that same race, that is cheating. So for every race, the CdA comes only from that athlete's other races: the estimates are weighted by recency and the median is taken. The race's own data is left out.

Sample

  • Nine athletes, 2019 to 2026, 74 race files, on courses in more than 16 countries.
  • All body weights are measured values. Bikes are grouped by type (tri bikes and road bikes get separate CdA baselines).
  • Files with documented problems were excluded: two with no power, four with a faulty barometer, one duplicate upload, three with GPS distortion in tunnel sections. Their CdA estimates stay in the baseline pool; only their overall times are kept out of the statistics.

That left 64 races that could be evaluated. Four extreme outliers were then removed, giving a final sample of 60.

Results

Metric Value
Median absolute error 2.2%
Within ±5% 92%
Within ±3% 73%
Median for 70.3 (113 km) 1.7%
Median for full distance (226 km) 2.3%
Signed median +0.7% (slightly conservative)

The website says "median error about 2%, nine out of ten races within ±5%". Both numbers are rounded in the conservative direction.

How the error is distributed

-81-71-61-5-47-36-211-17+03+110+26+34+42+51+6+7Error % (positive = prediction slower than actual, negative = prediction faster) · teal band = ±5%
Error histogram for the 60 races. Each bar is the number of races in that 1% bin; 73% within ±3%, 92% within ±5%. A positive value means the engine predicted slightly slower than the actual time.

Predicted vs actual

2:002:003:003:004:004:005:005:006:006:007:007:00x = actual bike leg time, y = engine prediction (h:mm) · teal = 226 (full distance), gold = 113 (70.3) · teal band = ±5%
Each point is one race: actual bike leg time on the x-axis, engine prediction on the y-axis. The closer a point sits to the diagonal, the better the prediction; the teal band is ±5%. The 113 and 226 points scatter in much the same way, which means the error does not grow with distance.

Where the error comes from

  1. Body weight. With assumed weights the median was actually lower, because when the weight is wrong, the CdA estimate compensates in the other direction and hides the error. Once measured weights went in, the mismatches in equipment and era were exposed. This is also why the Console asks for your real weight.
  2. Equipment changes. One athlete's implied CdA dropped from 0.22 to between 0.16 and 0.18 starting in 2024. A big equipment upgrade, but the median over the full history cannot keep up. This is the unavoidable cost of estimating CdA from other races.
  3. Distance to the weather station. There is no weather station near Port Macquarie and the wind was strong; two athletes in the same race came out at −7.4% and −4.1%.
  4. Barometers overstating elevation gain on long flat courses. This one affects course building, not the engine; the course library handles it with official routes and cross-checks against multiple sources.

Races used for validation

The final 60 races come from 45 race-years, listed below. Multiple files for the same race are different athletes. Error is each file's prediction relative to actual (positive = predicted slower). The three "training rides" are my own training rides at race-course length, added to fill out the 2026 sample.

Year Race Bike leg Files Error per file
2026 Tielifang · Guangde 113 113 · 88 km 1 +3.3%
2026 Training ride (not a race) 116 km 3 -1.5% -0.5% +1.1%
2026 IRONMAN Vietnam · Da Nang 226 · 180 km 1 +4.1%
2026 IRONMAN Taiwan · Penghu 226 · 178 km 1 +2.2%
2026 IRONMAN Hamburg 226 · 177 km 2 -0.7% +3.7%
2026 IRONMAN 70.3 Shanghai Chongming 113 · 90 km 3 +1.0% +3.5% +4.5%
2026 Challenge Taiwan 226 226 · 180 km 1 +6.3%
2025 Tielifang · Guangde 113 113 · 89 km 1 +0.1%
2025 Beauty of Taitung 113 113 · 89 km 1 +3.8%
2025 IRONMAN World Championship · Nice 226 · 178 km 1 -1.5%
2025 IRONMAN World Championship · Kona 226 · 181 km 1 +2.7%
2025 IRONMAN Taiwan · Penghu 226 · 184 km 1 +5.2%
2025 IRONMAN Malaysia · Langkawi 226 · 179 km 1 -0.9%
2025 IRONMAN Gurye 226 · 176 km 3 -1.5% +0.9% +1.1%
2025 IRONMAN Frankfurt 226 · 175 km 2 +0.9% +2.4%
2025 IRONMAN California · Sacramento 226 · 180 km 1 +2.3%
2025 IRONMAN 70.3 Kenting 113 · 90 km 1 -0.9%
2025 IRONMAN 70.3 Shanghai Chongming 113 · 90 km 4 -0.1% +1.3% +2.7% +2.7%
2025 IRONMAN 70.3 Puerto Princesa 113 · 90 km 2 -1.7% -1.7%
2024 Tielifang · Guangde 113 113 · 89 km 1 -2.7%
2024 IRONMAN World Championship · Kona (partial file) 73 km (partial) 1 +3.5%
2024 IRONMAN World Championship · Kona 226 · 180 km 1 +2.2%
2024 IRONMAN Texas 226 · 178 km 1 +4.1%
2024 IRONMAN Cairns 226 · 179 km 1 -0.9%
2024 IRONMAN 70.3 World Championship · Taupō 113 · 90 km 2 -2.4% -0.7%
2024 IRONMAN 70.3 Subic Bay 113 · 91 km 1 +2.3%
2024 IRONMAN 70.3 Desaru Coast 113 · 89 km 1 -2.7%
2024 IRONMAN 70.3 Bangsaen 113 · 90 km 1 +2.7%
2024 IRONMAN 70.3 Bahrain 113 · 90 km 2 +0.5% +0.9%
2024 Challenge Xiamen 113 113 · 89 km 1 +3.9%
2024 Challenge Taiwan 226 226 · 179 km 1 +4.2%
2024 Challenge Roth 226 · 178 km 1 +2.3%
2023 Tielifang · Guangde 113 113 · 86 km 2 -7.0% +0.6%
2023 Puyuma Triathlon 226 226 · 178 km 1 -2.0%
2023 IRONMAN France · Nice 226 · 179 km 1 -5.9%
2023 IRONMAN Austria · Klagenfurt 226 · 179 km 1 -2.4%
2023 IRONMAN Australia · Port Macquarie 226 · 180 km 1 -4.1%
2023 IRONMAN 70.3 Kenting 113 · 90 km 1 -2.3%
2023 IRONMAN 70.3 Puerto Princesa 113 · 90 km 1 -0.8%
2022 IRONMAN Taiwan · Penghu 226 · 179 km 1 -1.9%
2022 IRONMAN 70.3 Taitung 113 · 88 km 1 -0.3%
2019 IRONMAN World Championship · Kona 226 · 180 km 1 +5.5%
2019 IRONMAN 70.3 Xi'an 113 · 90 km 1 -0.8%
2019 IRONMAN 70.3 Liuzhou 113 · 90 km 1 -2.1%
2019 IRONMAN 70.3 Xiamen 113 · 90 km 1 -0.3%

What this means

For an age-group athlete, here is what the number means: ride to the plan and your finish time will land within about ±5% of the prediction. Upload your ride file after race day for the comparison, and your own CdA converges tighter with each race, so the error on your next one shrinks again.

A note on credibility

  • Every number in this article is computed directly from the backtest results table, and the charts are drawn from the same data. No races were picked out separately.
  • The excluded files and the reasons are all listed above. Exclusions were decided on data quality before seeing the results, not on the size of the error.
  • The sample comes from nine real athletes plus myself as coach, and covers courses in Asia, Europe, North America and Oceania. Not a single race used its own file to estimate its own CdA.
  • The backtest script and results table are kept in the project and re-run with every engine upgrade. If the numbers change, they will be updated here along with the reason.

The engine will keep being backtested against new ride files.

← All articles