In one sentence
A graph neural network (GNN) improves each item's rating by passing information along its connections, so a team is judged partly by the company it has kept.
How it works
Collateral form is an old idea: if A beat B and B beat C, A probably beats C. A graph stores this as nodes (teams, players) joined by edges (played each other, played together, passed the ball to).
A GNN runs a few rounds of message passing. In each round every node collects a summary of its neighbours, blends it with its own current features, and updates itself. After two or three rounds, each node carries information from teams it never met directly.
The learned part is how much weight to give neighbours versus yourself, and how to transform the messages. It is clever, but most of the collateral-form value can be captured with far simpler tools like Massey ratings or Elo.
The maths
- h with subscript i and superscript k is node i's feature summary after k rounds.
- N(i) is the set of neighbours of node i; the fraction is the average of their summaries.
- W self and W nb are learned weights for your own features and your neighbours'.
- σ is a switch function (such as ReLU) that allows non-linear patterns.
In words: each round, update every node to a learned blend of itself and the average of its neighbours.
Worked betting example
A simplified single round with fixed weights 0.6 for self and 0.4 for neighbours, and no switch function, using illustrative team ratings.
Team A is rated 80 and has played teams rated 90, 70 and 85.
- Neighbour average = (90 + 70 + 85) ÷ 3 ≈ 81.7.
- Updated A = 0.6 × 80 + 0.4 × 81.7 ≈ 80.7.
Team B, from a smaller league, is rated 62 but its only cross-league games were cup ties against two strong sides, rated 90 and 85, losing narrowly to both.
- Neighbour average = 87.5.
- Updated B = 0.6 × 62 + 0.4 × 87.5 = 72.2.
The graph lifts B by 10 points because of the company it kept. That might be real hidden ability, or B might simply have been outclassed in two big games. A trained GNN would include edge features, such as the score margin, to tell the difference; this toy version cannot.
If B's lifted rating translated into a 30% chance of winning its next match and B was 4.0 in Match Odds, a £10 back would have EV of 0.30 × £30 − 0.70 × £10 = +£2.00 before commission, or +£1.82 after 2% commission. That rests entirely on the graph being right.
Where it's good
- Cross-competition football ratings, linking leagues through European ties, cup games or transfers.
- Team sports where line-up combinations matter: modelling passing networks or player partnerships.
- Racing and other sports with sparse, overlapping fields, where collateral form matters.
- Combining with other features, since node outputs can feed a standard model.
Limitations and pitfalls
- Heavy engineering for modest gain. Massey, Elo and mixed models already exploit shared opponents.
- Leakage through the graph: if edges include matches after your prediction date, information about future results flows into today's ratings. Build the graph as it stood at each bet time.
- Over-smoothing: too many rounds and every node ends up looking like the average.
- Sparse graphs (newly promoted sides, leagues with few European ties) give little to pass on, which is exactly where you want help.
- Small sample per node means noisy outputs. Test out of sample with walk-forward validation.
- Rarely the missing piece. If your ratings do not already beat the market, a GNN on top is unlikely to fix that.
How to build it
- Python: PyTorch Geometric or DGL; networkx for building and inspecting the graph.
- Data: an edge list of who met whom and when, with outcome features (score margin, xG difference) on each edge.
- Tip: benchmark against a Massey or Elo rating on the same data before spending weeks on graph code.
Related methods
- Massey and Colley ratings solve collateral form with simple linear algebra.
- Elo updates ratings along each match edge one game at a time.
- Neural networks provide the learned transformations.
- Mixed and hierarchical models share strength across groups in a simpler way.
- Walk-forward validation guards against graph leakage.