Repository navigation
Home
The Performance Factor (PF) project provides an online database of elapsed times and Time Corrected Factors (TCFs) for Australian keelboat racing, with statistical analysis and graphical presentation. Fundamentally, this project is about presenting the ultimate source of truth - Elapsed Times, in a form that can better inform a club handicappers' decisions about handicap allocation. The Performance Factor(PF), Reference Factor(RF), and Performance Profile(PP) are just alternate (experimental) ways of presenting the relationships between the elapsed times of various boats and designs.
A PF is a back-calculated Time Correction Factor (TCF) a boat would have needed, averaged across all its recorded racing history, to have been near equal corrected time with a hypothetical 1.000 reference boat. An RF is a similar TCF for boat designs. The PP is a totally new way of presenting a boat's historical performance. The algorithms use weighted factors to propagate quality and probability through the calculations.
Watch this video for an introduction and this video for some detail about the implementation.
The project is currently hosted at sailing.mortbay.org and developed at github.
The PF is not PHS handicaps. Whilst a PHS handicap can also be a time correction factor (TCF), there are significant differences including:
- PFs are calculated for the full Australian fleet. Races that a boat does not participate in may affect the PFs allocated.
- The PF is influenced by all the races a boat participates in, not just a single series or season.
- The PF is non-deterministic. It results from an optimisation process that may produce different solutions for the same data, which are not guaranteed to converge to a single solution.
- The algorithms work on bulk data and cannot be applied week by week as a season progresses.
- There is no punitive element, which some handicap systems have. I.E. a boat can win multiple races in a row.
- The PF is skewed towards the best performances that a boat can achieve, rather than to the average or median. Boats which occasionally perform better than their average are assumed to be sailing slower than they can achieve.
- No attempt has been made to normalise the values with PHS handicaps allocated by clubs. The values are roughly normalised with IRC values.
- It is experimental, probably wrong and subject to change.
The PF could be used as a handicap system, but not as a replacement for traditional PHS club handicaps. It can be used to inform initial PHS handicap allocation.
The PF calculation uses any known measurement handicaps (ORC, AMS, IRC) to establish Reference Factors (RFs) for most boats and designs. Boats are assigned an RF based on either their own measurement handicaps or their historic median performance against boats already assigned an RF. A design's RF is the weighted aggregation of all initial RFs assigned to boats of that design. A boat's final RF is a weighted combination with the design RF.
Boat RFs are then used to calculate a reference time (RT) for every race for a hypothetical 1.000 reference boat. An optimisation process then allocates and refines PFs for each boat by minimizing their corrected time differences with the RT of all races they finished in.
The result is each boat is assigned a single number time correction factor for spinnaker, non-spinnaker and 2-handed. There are no separate factors for inshore, offshore, windward-leeward, strong/medium/soft conditions etc.
Note that TCFs are ALWAYS WRONG, because if they were correct then every race would end in a tie. At best, they are an approximate model of a possible reality — a poor substitute for One Design racing.
Measurement handicap for ORC and AMS data is taken from the corresponding official websites. IRC handicap values are taken from public entry pages of IRC races. Elapsed times are also taken from the public results pages of clubs. There are data importers for BWPS, TopYacht and Sailsys results formats. No personal details (owners, skippers etc.) are loaded, nor are any PHS allocated handicaps loaded or considered.
Note that by request of SailSystem the fetching of race data from their system has been disabled.
Rating yacht performance from elapsed times sounds straightforward, but the data is deeply ambiguous. For any single race result, we do not know:
- Race length — the distance sailed varies with course set, tidal current, and the actual wind shifts encountered. Two races on the "same course" can differ significantly in effective length.
- Weather conditions — wind strength and direction, sea state, and tidal set affect different designs very differently. A light-air race favours some boats; a rough beat with strong tide favours others. The same boat can look fast or slow depending purely on conditions.
- Course type — a windward-leeward course tests upwind and downwind performance; a harbour race tests tacking angles in chop; a coastal race is dominated by navigation and current management. No single factor applies equally to all.
- Extraordinary events — a boat that breaks a halyard, fouls a mooring, or is becalmed in a localised hole looks poor against its history. Weather and tide gates can split a fleet so that half the boats experience entirely different conditions from the other half.
- Crew and configuration — a boat racing short-handed, with a pickup crew, with the sails from the wrong season, or with an owner learning the boat will look different from the same hull sailed by a skilled regular crew. We cannot distinguish boat speed from crew speed from elapsed times alone.
- Luck — starting position, tactical choices, and plain fortune introduce noise that no amount of statistical sophistication can fully remove.
- Poor data quality — competitors enter much of the data, so that there are many typos, abbreviations, sponsors names, punctuation differences, duplicate entries, etc. This makes it difficult to identify what is actually the same boat, or just a similar boat with a similar name (only so many names starting with J or X). There are also some extraordinarily wrong times entered.
Even if every one of those factors were stable, sample sizes are tiny. Most boats in a club fleet do perhaps 20–50 races per year, often split across multiple series with changing competition. A typical boat in this database may have 50–200 recorded finishes spanning several years. In the context of statistical inference, where each observation is contaminated by all the unknowns above, this is a very thin basis for a reliable estimate of anything. The PF for a boat with fewer than about 20 finishes should be treated as highly tentative.
The optimiser mitigates these problems — outlier down-weighting suppresses individual bad results; the asymmetry principle discounts apparently extraordinary fast finishes; the weighted median reference time reduces the influence of large-fleet outliers — but it cannot eliminate the underlying uncertainty. The confidence weights and per-race residual charts are the honest acknowledgement of this: a low-weight PF and a wide residual scatter mean we genuinely do not know what this boat should be handicapped at from its history alone.
Measurement certificates help, but not primarily by providing accurate individual factors. Their main value is as a common reference: IRC, ORC, and AMS are all widely used, and a boat's certificate value in any of those systems gives us a plausible starting point that is roughly comparable across the fleet, across clubs, and across years. By anchoring the PF optimisation to certificate-derived Reference Factors, we ensure that the resulting factors are at least expressed in a scale similar to other systems — so an PF of 0.950 means roughly what IRC 0.950 means, which is something other clubs and handicappers can interpret. Without that anchor, PF values would be identified only up to an arbitrary global scale factor and would be meaningless outside the specific fleet used to compute them.
- Project Description — data sources, standard candles, optimisation.
- Processing Pipeline — the pipeline from data ingestion to PF
- Factor Design — detailed design of the PF optimisation algorithm
- Performance Rank — How to rate a boats performance
- Presentation Layer - How the web UI is implemented
- Data Sources and Formats and Object Model - How the database is implemented.
- Error Bars - How the error bars displayed are (poorly) calculated.
- ID Strategy - The strategy for creating unique IDs for boats, designs and clubs
- Source code: Apache License 2.0
- Derived data (PF values etc.): CC BY-SA 4.0
- Raw race results: No claim — public record
This project is in early development and almost certainly contains errors, omissions and accidental inclusions in both the data loaded and the analysis performed. Feedback, comments, requests, and contributions are welcome via GitHub.
Moreover, requests to merge/exclude boats/designs are most welcome and can be made
The source code for this project is available on GitHub. Please use the Issue system there for questions, comments, or suggestions.