Math Meteor

Math Meteor

Reference math for the FIVB pipeline: how player Elo is updated, and how the matchup predictor blends career ratings with recent form and empirical score distributions.

How ELO Is Calculated

We use an Elo-style rating that updates after every match. Each player starts at 1500, and your rating goes up when you beat expectations and down when you underperform.

Team strength

Each beach team’s pre-match strength is the average of its two players’ ratings.

$$\text{team\_elo}_1 = \frac{\text{elo}_{1A} + \text{elo}_{1B}}{2}$$ $$\text{team\_elo}_2 = \frac{\text{elo}_{2A} + \text{elo}_{2B}}{2}$$
Expected win

Expected win chance comes from the rating gap between the two teams.

$$\begin{aligned} E_1 &= \frac{1}{1 + 10^{d/400}} \\ d &= \text{team\_elo}_2 - \text{team\_elo}_1 \end{aligned}$$
Team rating update

After the result, shift the team rating by surprise (actual minus expected). K is typically 32.

$$\Delta\text{Team}_1 = K \times (S_1 - E_1)$$ $$S_1 = \begin{cases} 1 & \text{if Team 1 wins} \\ 0 & \text{otherwise} \end{cases}$$
Player update

Split the team rating shift evenly across both teammates.

$$\text{new\_elo}_{1A} = \text{old\_elo}_{1A} + 0.5\,\Delta\text{Team}_1$$ $$\text{new\_elo}_{1B} = \text{old\_elo}_{1B} + 0.5\,\Delta\text{Team}_1$$
Clutchness weight

In clutchness Elo, multiply K by a round factor (deeper bracket rounds count more) and by tournament strength: FIVB points awarded for winning the event, normalized to a reference tier so majors count more than smaller stops.

$$\begin{aligned} \Delta\text{Team}_1 = {}&K \times \text{round\_w} \times \text{tournament\_w} \\ &\quad \times (S_1 - E_1) \end{aligned}$$
round_w
  • Final — 2.0
  • Semi — 1.5
  • Quarter — 1.25
  • Round of 16 — 1.1
  • Pool — 0.75
  • Default — 1.0
tournament_w

First-place points ÷ 200. If VIS omits points, use 20 as the numerator (so weight = 20 ÷ 200).

How Matchup Prediction Works

The Matchup Predictor loads each player’s match history, derives a recent-form signal, combines it with career Elo, then estimates win probability and a distribution over final scores.

Recent form

Win rate and average set differential use up to 12 recent matches with a score line; elo_trend is defined separately from flat Elo on the ordered match list.

$$\begin{aligned} \text{recent\_form} = (\,&\text{win\_rate},\,\text{avg\_set\_diff}, \\ &\text{elo\_trend}) \end{aligned}$$

elo_trend = flat Elo after the newest match that has a rating, minus flat Elo at the snapshot up to 12 rating entries earlier on that same list (0 if fewer than two ratings).

Form points

Combine those signals into one number per player (same weighting as the live tool).

$$\begin{aligned} \text{form\_points} = {}&110(\text{win\_rate} - 0.5) + 38\cdot\text{avg\_set\_diff} \\ &\quad + 0.2\cdot\text{elo\_trend} \end{aligned}$$
Team aggregates

Average career Elo and form points across the two players on each team, then add them for the rating used in the match.

$$\text{team\_career\_elo} = \frac{\text{elo}_1 + \text{elo}_2}{2}$$ $$\text{team\_form\_pts} = \frac{\text{form\_pts}_1 + \text{form\_pts}_2}{2}$$ $$\text{team\_rating} = \text{team\_career\_elo} + \text{team\_form\_pts}$$
Match win probability

Same logistic as Elo: compare the two team ratings.

$$\begin{aligned} P(A) &= \frac{1}{1 + 10^{g/400}} \\ g &= \text{rating}_B - \text{rating}_A \end{aligned}$$

Score lines

After team win probability P(A), the predictor still has to pick plausible set scores. Here is the pipeline in plain language.

  1. Match → sets

    Map overall match win probability to an implied per-set win rate under a best-of-three structure, so each set can be simulated with consistent odds.

  2. Calibration tables

    Sample set scores using matchup_calibration in the database: empirical distributions of loser points for 21- and 15-point sets, split into regular wins and overtime paths.

  3. Bundles & closeness

    Set outcomes roll up into match bundles (2-0, 2-1, 1-2, 0-2). A closeness control nudges whether sets look tight or lopsided on the scoreboard.

Note. This is not a Monte Carlo simulation driven by fine-grained skills or rich per-player stats. The machinery stays relatively generic: match win probability, shared calibration tables, and a few simple controls — not a heavily customized, stat-by-stat model.