The Algorithm

Last modified: March 2026 · tennisrank.app

NTRP ratings are calculated by a proprietary algorithm that USTA has never fully published. This page collects everything we've been able to verify about how it works, and explains our own rating system.

USTA NTRP Component TennisRank
Elo-based, modified
confirmed
Core algorithm Elo
??? (not disclosed) K-factor (update rate) K = 0.2 → 0.1 (variable)
??? Expected score formula Linear, clamped 0–1
Game %
inferred
Actual score input Game % (games won / total games)
Not used
inferred
Win / loss impact Not used
??? 3rd set tiebreak as game won Not used
Equal weight
confirmed
Singles vs doubles weight Equal weight
Combined (one rating)
confirmed
Singles / doubles tracking Separate singles, doubles + combined
??? Season start / carry-over min(prior final, published) or published − 0.25
Spring, Tri-Level
confirmed
Seasons included Spring, Tri-Level
Year-end, once yearly
confirmed
When ratings are published Recalculated after every match
Hundredths scale behind the scenes
confirmed
Internal precision 4 decimal places
3 courts
rumored
Minimum matches for a rating 3 courts
~40 years old, rewritten for tech
confirmed
Age / history Built 2025–2026
76%+
self-reported
Predictive accuracy Not yet measured

What We Know About USTA NTRP

It's Elo-Based

Heather Hawkes (USTA, National Campus) stated on the Essential Tennis podcast that the algorithm is Elo-based and that someone familiar with Elo could "reverse guess how some of this algorithm works." She declined to describe the exact formula, calling the doubles calculation "very proprietary" and "not obvious math."

Relative Performance, Not Win/Loss

The system evaluates how you performed relative to the expected outcome given both players' ratings. Winning against a much lower-rated player may not move your rating at all if the system already expected you to win convincingly. Score margin matters — game scores are used, not just the match result.

Hundredths Scale in the Background

Your published NTRP rating (3.0, 3.5, 4.0, etc.) is a rounded label. The algorithm tracks ratings in hundredths internally. A player rated 3.47 and a player rated 3.01 are both "3.5" on paper but are treated differently by the algorithm. Players between 3.01 and 3.50 are all labeled 3.5.

Singles and Doubles Are Combined

Unlike UTR and some other systems, NTRP does not maintain a separate singles rating and a separate doubles rating. All results — singles and doubles — feed into one combined rating. According to Heather Hawkes, the weights are the same for both ("you don't get a different weight on a doubles result than you do on a singles result").

Calculated After Every Match (Dynamically)

Dynamic NTRP ratings are recalculated daily as match scores are entered. The "published" year-end rating is a snapshot taken once per year. In-season, players can see their dynamic rating moving up and down.

Developed ~40 Years Ago

The algorithm was built by a group of tennis professionals who wanted to support the USTA league program. It originally ran across multiple distributed computers and has been rewritten several times as technology changed, though USTA says algorithmic changes themselves are rare and incremental to preserve predictability.

Which Leagues Count

According to the USTA NTRP Ratings FAQ, dynamic ratings are generated from play in the following divisions: 18 & Over, 40 & Over, 55 & Over, 65 & Over, Mixed 18 & Over, Mixed 40 & Over, and Mixed 55 & Over. In some sections, results from USTA Sanctioned NTRP Tournaments and additional leagues (such as Tri-Level) may also be included. Combo, Junior, and other league formats are not part of the dynamic rating calculation.

76%+ Match Prediction Accuracy (Self-Reported)

USTA reports that the algorithm correctly predicts the winner of a match over 76% of the time — a figure they claim is on par with UTR and World Tennis Number.

Sources

How TennisRank Works

TennisRank uses a modified Elo system built specifically for USTA league data. Ratings update after every court result and are always visible — there is no year-end cutoff.

Starting Rating

When a player appears for the first time in a season, their starting Elo is seeded from their USTA-published rating with a small downward offset to account for the ratings range:

init = published rating − 0.25   (first season, no prior data)
init = min(prior season final, published rating)   (returning player)

The 0.25 offset seeds players near the midpoint of their NTRP band (e.g. a published 3.5 starts at 3.25, within the 3.01–3.50 range). The carry-over rule prevents a player from starting a new season higher than their published rating while still rewarding strong finishers by letting them carry forward a lower-than-published starting point.

Expected Score

The expected score is linear rather than the classical sigmoid used in chess Elo. This was chosen because NTRP ratings span a relatively narrow range (2.0–7.0) and the linear model is easier to reason about:

expected = clamp( (p_eff − o_eff + 0.48) / 0.96, 0, 1 )

Even match (0 rating diff) → 0.50
+0.48 advantage → 1.00
−0.48 disadvantage → 0.00

Actual Score

Rather than a binary win/loss (1 or 0), TennisRank uses the game percentage from the court score:

actual = games won / total games

This means a 6–4, 6–4 win and a 6–0, 6–0 win produce different actual scores, rewarding dominant performances and penalizing narrow wins against weaker opponents.

Rating Update (Elo Delta)

delta = K × (actual − expected)

First 3 matches:  K = 0.2   (fast convergence from seed)
After 3 matches:  K = 0.1   (stable, smaller adjustments)

The variable K-factor lets new players converge quickly to their true level, then switches to a lower rate to prevent excessive drift once a baseline is established. Singles and doubles results carry equal weight, matching USTA's approach.

Separate Singles and Doubles Ratings

TennisRank tracks three parallel Elo values per player: combined, singles-only, and doubles-only. The combined rating is the primary rating — it is used for all expected score and match rating calculations. Singles and doubles ratings are tracked separately as informational breakdowns and are not used in the dynamic rating or match rating calculations.

singles court: p_eff = player combined elo, o_eff = opponent combined elo
doubles court: p_eff = avg(player, partner) combined elo
               o_eff = avg(opp1, opp2) combined elo

A player needs at least 3 courts of a given type before a type-specific rating is displayed.

Match Performance Rating

Each court result also produces a "match rating" — the rating at which a player's expected score would exactly equal their actual score. This gives a single-court read on how well someone played relative to their opponent:

match rating = clamp( actual × 0.96 + o_eff − 0.48, 2.0, 7.0 )

Chronological Processing

Courts are processed in strict date order. Each player's Elo state going into a match reflects all prior results that season. This ensures that rating changes compound correctly and that later matches see a player's current Elo, not their starting value.