Skip to content

TwoMore Rating System — Complete Summary

Superseded (2026-07): folded into Rating System v2 — Specification. Kept for reference.

Status: Superseded Date: 2026-04-04 Source files: rating-system-v2.md · elo-tier-mapping.md · korean-tennis-divisions


Design Principles

  1. Evidence-based — Every formula traces to published research (Glicko-2, Kovalchik 2020, FIDE/USCF)
  2. Amateur-first — Designed for 동호인: mismatched pairings, draws, incomplete sets, RPS
  3. Gender-aware — One global ELO, but tier display adjusts by gender percentile
  4. Global, not per-club — One rating across all clubs. Rank is contextual per club.
  5. Non-punitive — Inactivity grows uncertainty (RD), doesn't decay rating
  6. Dynamic — Unlike Korean 신인부/오픈부 (one-way ratchet), our rating goes up AND down

1. Rating Pools

2 pools, both global and gender-neutral:

PoolWhat CountsWhy Separate
Singles ELOAny 1v1 matchIndividual skill, no partner variable
Doubles ELOAny 2v2 matchPartner coordination is a separate skill

Each player has: singlesElo, singlesRd, doublesElo, doublesRd


2. The Formula

Singles

delta = K × (actual - expected) × scoreFactor × outcomeWeight

Doubles

effective_team = avg(r1, r2) - 0.08 × |r1 - r2|   ← team variance penalty
expected = 1 / (1 + 10^(-(eff_A - eff_B) / 400))
delta = K × (actual - expected) × scoreFactor × outcomeWeight

Both teammates receive the full delta (not halved). Source: UTR.

Team Variance Penalty Examples

Team CompositionAvgPenaltyEffective
1400 + 1400140001400
1600 + 12001400-321368
1800 + 10001400-641336

3. Match Outcomes

OutcomeactualoutcomeWeightRating change?
decisive (win)1.01.0Yes
decisive (loss)0.01.0Yes
draw (4-4, 5-5 etc.)0.51.0Yes — draws ARE informative
incomplete (leader)0.60.5Yes — partial signal
incomplete (tied)0.50.3Yes — minimal signal
abandoned0No
non_competitive (RPS)0No
walkover0No

4. Score Factor (Margin of Victory)

Winner's Game %FactorLabel
≥ 75% (e.g., 6-1)1.5Dominant
≥ 60% (e.g., 6-3)1.2Clear
< 60% (e.g., 7-5)1.0Close

Draws, incomplete, non-competitive: always 1.0


5. Adaptive K-Factor

ConditionKSource
First 20 matches (provisional)40USCF
Established (20+ matches)32Standard ELO
Diamond+ rating (2100+)24FIDE 2400+ rule
Miscalibrated seed (strike system)48Accelerated convergence

Upset bonus: When underdog wins, K × 1.5


6. Rating Deviation (RD) — Glicko-2 Inspired

RD represents confidence in the rating. High RD = uncertain.

EventRD Change
Match playednew_RD = max(30, old_RD × 0.92) — shrinks ~8%
Month inactivenew_RD = min(350, √(old_RD² + 15²)) — grows

No rating decay. Rating number stays constant during inactivity. Only uncertainty grows.


7. Safety Mechanisms

Rating Floor

floor = peak_rating × 0.80
new_rating = max(floor, computed_rating)

Prevents catastrophic loss from bad streaks.

Inflation Monitor

Quarterly pool mean check. If drift > 50 from 1000, global correction applied.

Strike System (Dishonesty Detection)

After 5+ matches: if |current_elo - seed_elo| > 150, K accelerated to 48 for faster convergence.


8. Tier System

7 Tiers × 3 Sub-tiers = 21 Levels

TierELO RangeSub-tiersColor
Bronze400–799III (400) · II (534) · I (667)🟤
Silver800–1199III (800) · II (934) · I (1067)
Gold1200–1699III (1200) · II (1367) · I (1534)🟡
Platinum1700–2099III (1700) · II (1834) · I (1967)🔵
Diamond2100–2399III (2100) · II (2200) · I (2300)💎
Master2400–2799III (2400) · II (2534) · I (2667)🟣
Grand Master2800+III (2800) · II (2934) · I (3067)🔴

Gold is the widest tier (500 ELO) because 70-80% of Korean 동호인 cluster in NTRP 3.0-3.5.


9. Cross-Rating Conversion Chart

ELO → NTRP → UTR → Korean Division → Women's Division

TierSubELONTRPUTRKorean (남성)Korean (여성)% KR Players
BronzeIII400-5332.01-2테린이테린이<1%
BronzeII534-6662.0-2.52-3.5테린이테린이2%
BronzeI667-7992.0-2.52-3.5테린이 / 입문테린이5%
SilverIII800-9332.5-3.03.5-4.5신인부 하위개나리��� 하위8%
SilverII934-10662.5-3.03.5-4.5신인부개나리부 하위12%
SilverI1067-11993.03.5-4.5신인부 상위개나리부 하위15%
GoldIII1200-13663.0-3.54.5-6신인부 ~ 오픈부개나리부14%
GoldII1367-15333.0-3.54.5-6오픈부 하위개나리부10%
GoldI1534-16993.54.5-6오픈부개나리부 상위 ~ 국화부8%
PlatinumIII1700-18333.5-4.06-7.5��픈부 상위개나리부 상위 ~ 국화부5%
PlatinumII1834-19664.06-7.5오픈부 최상위국화부3%
PlatinumI1967-20994.0-4.56-7.5오픈부 최상위국화부2%
DiamondIII2100-21994.57.5-10선수급슈퍼국화1.5%
DiamondII2200-22994.5-5.07.5-10선수급슈퍼국화1%
DiamondI2300-23995.07.5-10선수급슈퍼국화<0.5%
Master2400-27995.0-6.510-15프로급~0% KR rec
Grand Master2800+6.5+15+프로급Theoretical

Korean Division Terminology Notes

  • 신인부 = 챌린저부 (KATA vs KATO naming — same tier)
  • 오픈부 = 마스터즈부 (KATA vs KATO naming — same tier)
  • 동배부/은배부/금배부 = regional (시도) equivalent system
  • 개나리부/국화부 = women's flower-named divisions (KATA/KATO official)
  • We use 신인부/오픈부 as the universal standard

10. New Player Seeding

Onboarding OptionKorean LabelSeedStarting TierNTRP
Complete Beginner테린이500Bronze III1.5-2.0
Beginner입문700Bronze I2.0-2.5
Newcomer신인부 수준950Silver II2.5-3.0
Open신인부 ~ 오픈부1200Gold III3.0-3.5
Advanced오픈부1550Gold I3.5-4.0
Competitive오픈부 상위 · 선수출신2100Diamond III4.5+

Provisional K=40 for first 20 matches ensures fast convergence regardless of seed accuracy.


11. Gender-Adjusted Tier Display

Superseded (2026-07): the owner chose a pure-skill (gender-neutral) tier; gender-awareness moved to the leaderboards (consolidated + per-gender views), not the tier badge. Canonical model: rating-system-v2 §0. The gender-adjusted-display approach below is retained for historical reference only.

One global ELO (gender-neutral) for matchmaking. Tier display adjusts by gender so that the same percentile = same tier.

How It Works

z_in_gender = (player_elo - gender_mean) / gender_σ
adjusted_elo = combined_mean + z_in_gender × combined_σ
display_tier = getTier(adjusted_elo)

Example (after pool data accumulates)

StatMenWomenCombined
Mean11509801100
σ180160200
ScenarioRaw ELOPercentileAdjusted ELODisplay Tier
Man at male mean115050th1100Silver I
Woman at female mean98050th1100Silver I
Man 1σ above133084th1300Gold III
Woman 1σ above114084th1300Gold III

Leaderboard

Filter chips: 전체 (default) / 남성 / 여성

Non-binary/undisclosed: fall back to combined pool thresholds.

At launch (< 50 players per gender): identical thresholds for all.


12. Closed Pool Calibration

Rating Confidence (0.0–1.0)

ActionChange
Self-assessment seed0.0
Intra-club match+0.02 (max contribution: 0.3)
Cross-club match+0.05
Match vs confident player (≥0.7)+0.03 bonus

Bridge Player Offset

When a player joins a second club (10+ matches in each), they become a calibration link. Weighted median of bridge player offsets corrects pool-level bias.

Strike System

After 5+ matches: if |current - seed| > 150, K accelerated to 48. If |current - seed| > 350 after 15 matches, admin alert for potential sandbagging.


13. Complete Calculation Example

Doubles: Team A (1600 + 1200) beats Team B (1400 + 1400), score 6-3.

1. Effective team ratings
   Team A: avg(1600, 1200) - 0.08 × |400| = 1400 - 32 = 1368
   Team B: avg(1400, 1400) - 0.08 × |0| = 1400

2. Expected score for Team A
   1 / (1 + 10^(-(1368-1400)/400)) = 0.481

3. Score factor
   6 / (6+3) = 66.7% → 1.2 (clear win)

4. K-factor = 32 (established), but this is an upset (1368 < 1400)
   → K = round(32 × 1.5) = 48 for Team A

5. Delta (Team A)
   48 × (1.0 - 0.481) × 1.2 × 1.0 = 29.9 → 30

6. Apply
   Team A player 1 (1600): → 1630
   Team A player 2 (1200): → 1230
   Team B player 1 (1400): → 1380  (K=32, no upset bonus)
   Team B player 2 (1400): → 1380

7. Check floors — no player below 80% of peak ✓

Same teams, draw (4-4):

actual = 0.5, weight = 1.0, scoreFactor = 1.0
delta = 32 × (0.5 - 0.481) × 1.0 × 1.0 = 0.6 → 1
// Tiny delta — draw between near-equal teams is expected.

Same teams, decided by RPS:

outcome = 'non_competitive' → delta = 0. No rating change.

14. Data Model

profiles

singles_elo, singles_rd, singles_peak, singles_matches_played
doubles_elo, doubles_rd, doubles_peak
rating_confidence, seed_singles_elo, seed_doubles_elo

matches

outcome: 'decisive' | 'draw' | 'incomplete' | 'abandoned' | 'non_competitive' | 'walkover'
is_cross_pool: boolean

elo_history

rating_pool: 'singles' | 'doubles'
rd_before, rd_after

15. References

  • Kovalchik (2020) — Margin-of-victory ELO. International Journal of Forecasting.
  • Glickman (2001) — Glicko-2 rating system. Boston University.
  • UTR Algorithm — universaltennis.com
  • FIDE Handbook — K-factor rules
  • USCF Rating System — uschess.org
  • KATA (한국동호인테니스협회) — Division/ranking system
  • KATO (한국테니스발전협의회) — Division/pair scoring system
  • KTA 생활체육 — Recreational grading

Markdown remains the source of truth. Run yarn docs:check before handoff.