Model class
Multi-criteria decision analysis, not supervised learning
The fit score is a weighted-sum MCDA model over desirability-transformed features, the same family as clinical scoring systems or quality-by-design formulation scoring. For racquet i with feature xij:
scorei = Σj wj · dj(xij) / Σj wj
where dj is a trapezoid desirability (lo-bad, lo-good, hi-good, hi-bad) for target-band features: head size, strung weight, swingweight, stiffness, and center power. Monotone more-is-better features take a pool percentile rank: twistweight, sweet zone, recoil weight, and two features computed from the measured power maps: periphery retention (mean off-center power ÷ center power on the 21″ row) and tip retention (23–25″ ÷ center).
The scoring model is a weighted sum, not a trained one. But it is no longer unfalsifiable, and the section below is the test it does not pass cleanly. We publish it anyway.
What this model can do, and what it cannot
Tennis Warehouse publishes playtest reviews in which named testers, whose games are described in plain English, score racquets across thirteen categories. That is a real label: this player, this racquet, this verdict. We fed each tester's own words through the same quiz you filled in, ranked the racquets for them, and checked the ranking against what they actually scored. 396 judgements, 19 testers, 89 racquets, joined to the lab data and spec-verified.
| Test | Rank correlation |
|---|---|
| Our fit score against what testers actually scored | 0.19 |
| Simply recommending what every other tester liked | 0.41 |
| Our fit score against their personal deviation from the crowd | 0.02 |
Read the third row first. Zero means guessing. Once you subtract how good a racquet is in general, our profile does not predict who liked what. The honest conclusion is that this model gets you to the right neighbourhood, the right weight class, head size and stiffness for your arm and your swing, and it does that well: given only their playstyle in words, it puts a tour professional's own racquet in their personal top quarter 75% of the time, against 25% by chance.
What it cannot yet do is tell you which of five similar 98 square inch frames you personally will love. Nobody can, from specs alone. That is exactly why this app says demo these three and never buy this one, and now that caution is a measurement rather than a hedge.
The signal is there to be caught. Nine of ten testers show strong, consistent spec preferences: one reliably scores high-swingweight frames above the crowd, another scores them below. Our hand-written rules just do not capture it. Fixing that needs outcomes per player, which is what the journal is for. This number, 0.02, is the one we are trying to move, and it will be on this page whichever way it goes.
Bias check 1
Pool composition: is any brand winning a numbers game?
If a brand simply ships more current SKUs, it buys more lottery tickets for the top-50. The check: top-50 share ÷ pool share (lift). Lift ≈ 1 means representation proportional to catalog size.
| Brand | Pool share | Top-50 share | Lift |
|---|---|---|---|
| Babolat | 13.0% | 22.0% | 1.69 |
| Prince | 14.4% | 22.0% | 1.53 |
| Dunlop | 6.7% | 12.0% | 1.80 |
| Tecnifibre | 4.2% | 12.0% | 2.85 |
| Yonex | 14.4% | 10.0% | 0.70 |
| ProKennex | 4.2% | 8.0% | 1.90 |
| Head | 15.8% | 6.0% | 0.38 |
| Wilson | 17.2% | 4.0% | 0.23 |
| Mizuno | 1.4% | 2.0% | 1.43 |
| Solinco | 3.2% | 2.0% | 0.63 |
| Volkl | 5.3% | 0.0% | 0.00 |
Reading: Wilson (17.2% of the pool → 4% of the top-50, lift 0.23) and
Head (15.8% → 6%, lift 0.38) are the two largest catalogs in the pool and both get
filtered out, the opposite of a pool-size artifact. Prince's lift (1.53) comes from what it
currently builds: O-port frames measure high twistweight, which this profile weights at 2.0.
The over-representation tracks measured spec differences, not catalog counts. It's still a
single-lab dataset; TWU's current flag coverage and model-year freshness vary
by brand, which is why the brand board reports each brand's best frame
rather than letting one brand flood the shortlist.
Bias check 2
Weight sensitivity: does the podium survive my priors?
The weights encode judgment, so the question is how much the ranking depends on them. Monte-Carlo: all 10 weights perturbed independently by ±30% (2000 draws), full pool re-ranked each draw.
| Racquet | Base | Median | 95th pct | P(top 3) | P(top 10) |
|---|---|---|---|---|---|
| Prince O3 Phantom 100X 2025 | #1 | #2 | #3 | 1.00 | 1.00 |
| Prince Ripcord 100 300g 2025 | #2 | #2 | #3 | 1.00 | 1.00 |
| Prince Vortex 300g | #3 | #2 | #3 | 1.00 | 1.00 |
| Prince Hydrogen Random 300g | #4 | #4 | #4 | 0.00 | 1.00 |
| Dunlop FX 500 Tour 2025 | #5 | #6 | #8 | 0.00 | 1.00 |
| Tecnifibre TFight 315S | #6 | #7 | #13 | 0.00 | 0.86 |
| Dunlop FX 500 2025 | #7 | #7 | #14 | 0.00 | 0.75 |
| Yonex VCORE 100D 8th Gen | #8 | #8 | #14 | 0.00 | 0.74 |
| Babolat Pure Aero 98 2023 | #9 | #9 | #14 | 0.00 | 0.69 |
| Prince Vortex 310g | #10 | #11 | #15 | 0.00 | 0.45 |
Reading: the top-3 set is stable: all three stay in the top 3 in 100% of draws. The #1 label is not (P(winner displaced) = 0.55): under weight noise the podium order shuffles freely. That's exactly why the report says "demo shortlist, not a verdict". Ranks 6–10 are fuzzier (P(top 10) as low as 0.45), so anything in the top ~15 is a defensible pick.
Bias check 3
Leave-one-feature-out: does any feature dictate the result?
| Feature dropped | Spearman ρ vs full ranking |
|---|---|
| twistweight | 0.945 |
| swingweight | 0.964 |
| periphery_retention | 0.969 |
| weight | 0.979 |
| recoilweight | 0.982 |
| flex | 0.984 |
| headsize | 0.984 |
| sweet | 0.986 |
| tip_retention | 0.991 |
| acor | 0.999 |
Reading: dropping any single feature leaves the pool ranking correlated at ρ ≥ 0.945 with the full model. No feature single-handedly drives the outcome. Twistweight moves it most, which matches its intent (it carries the largest weight by design).
Strings and tension
Why the tension is solved and not suggested
A frame is three hundred dollars and a restring is fifteen, so the string is the only part of the setup most players can afford to iterate on. It is also the part they are given the least evidence about. Until this version the app pinned every string at 51 lb, because that was the reference tension TWU had the most rows for, and then told the player to ask their shop for "mid-50s". That is not a recommendation. It is a shrug with a number in it.
What a player actually feels is not the tension, it is the stringbed stiffness in lb/in, and tension is only one of the two things that set it. The other is the string. A tension means nothing on its own: 50 lb of a soft poly and 50 lb of a stiff one are different racquets. So the model picks a target stiffness, then solves for the pair that lands there.
TWU measured every string at 40, 51 and 62 lb. Stiffness against tension turns out to be a straight line, fitted per string over those three points: median R² = 0.99 across 266 polyesters, with a typical worst point off by 3 lb/in against a 90 lb/in range. So rather than round a player to one of three test tensions, we invert each string's own measured line and solve for the tension that hits the target. The answer is constrained to the manufacturer's published range for that exact frame, shifted down for polyester. A string that can only reach the target outside that range is dropped, not clamped to the edge and recommended anyway.
Two numbers in the data that mean the opposite of what they look like
Both of these would have pushed every player to string tighter than they should, and both are the same mistake: a ratio compared across different denominators.
- Energy return rises with tension (85% at 40 lb, 93% at 62 lb), which reads like tighter strings hitting harder. They do not. That column is the string's own elastic efficiency, not ball speed. Power comes from a softer bed: it deflects further, so the ball deforms less, and the ball is where nearly all the energy is lost. Energy return is meaningless across tensions and genuinely useful at a fixed stiffness, so that is the only place it is used.
- Tension loss is a percentage, and it falls as you string tighter (56% at 40 lb, 38% at 62 lb) purely because the denominator grows. In pounds the loss barely moves: 22.2, 22.7, 23.6. Strings are ranked on pounds lost, never on the percentage.
What we will not tell you
Tension loss is a lab index that ranks strings against each other on TWU's rig. It is not what your racquet will read on a tension meter next month. Subtracting it gives results like "strung at 47, settles at 28", which is not what happens to a real stringbed and would frighten players off perfectly good strings. So it ranks, and no settled tension is ever printed. Nobody has measured that for your frame.
And the honest gap: the target stiffness band is the one number in the string model with no measurement behind it. Nobody publishes what stringbed stiffness a 3.5 should play, because nobody has run that experiment, and there is no labelled set of (player, frame, string, tension, outcome) anywhere to learn it from. The band is stringers' craft written down so that it can be argued with, rather than a black box. Everything downstream of it is measured.
Known limitations
The caveats that actually matter
- Quantization: TWU reports sweet zone and power potential as integers; the entire top tier shares sweet = 17 in². Score gaps at the top (#1 − #10 = 0.0623, median adjacent gap 0.00203) are far below measurement resolution.
- Manufacturing tolerance: two retail copies of one frame can differ by ±10 swingweight points, more than the score gap across the whole top ten. Demo the actual frame you'd buy.
- Percentile features are pool-relative: re-scoring against a different pool (all-time vs current-only) shifts percentile features and can reorder a tight podium. Both views agree on the same top-3 set here, but the #1 label differs. Reported as-is.
- Single lab, single protocol: every number comes from TWU's rigs. That's the best public data there is, and it is still one lab's protocol.
- Profile inference: the target bands were written from the player's own practice notes: a prior, not a measurement. The journal's drift check is the mechanism for correcting that prior with evidence.