MoSHBODS 2026 - A Detailed Description

MoSHBODS

A Deep Dive into the AFL Offensive & Defensive Rating System

An explanation of the algorithm behind the MoSHBODS ratings model

Introduction

MoSHBODS is a team rating system for Australian Rules Football (AFL) that separately tracks each team's offensive and defensive strengths. Rather than assigning a single Elo-style number to each club, MoSHBODS maintains two distinct ratings per team — one capturing how well a team scores, and one capturing how well it prevents scoring. The name stands for MatterOfStats Scoring SHot Based Offence Defence System.

The model is built on the insight that scoring and conceding are separable, partially independent dimensions of team quality. A team with a great attack and a leaky defence should look very different from a team that grinds out low-scoring wins through defensive excellence — and MoSHBODS is designed to distinguish between them.

This article walks through every component of the algorithm: how raw scores are standardised, how a Venue Performance Value (VPV) captures ground familiarity, how ratings are updated after each game, and how the system is ultimately used to forecast scores and win probabilities.

1. Data Preparation

1.1 The Scoring Currency: Scoring Shots

AFL scorelines have changed substantially since 1897, making naive comparison of raw totals across eras misleading. MoSHBODS addresses this by working in two parallel scoring currencies:

  • Raw Score — the familiar points total (goals × 6 + behinds × 1)
  • Scoring Shots (SS) — a count of all scoring shots (goals + behinds), i.e. the total number of times a team scored in any form

Using both of these currencies allows MoSHBODS to separately estimate two distinct skills: the ability to generate scoring opportunities, and the ability to convert those opportunities into goals.

1.2 The 2020 COVID Season Adjustment

The 2020 season was played under shortened match conditions due to COVID-19 restrictions. To make these scores comparable to standard-length games, all 2020 scoring figures (raw scores, scoring shots, and margins) are scaled by a factor of 1.25 before being entered into the model:

Adjusted Score2020 = Raw Score2020 × 1.25

Adjusted SS2020 = Raw SS2020 × 1.25

This ensures the 2020 season contributes sensibly to rolling historical averages and rating updates without distorting comparisons with full-length games.

1.3 Score Standardisation

Because scoring levels vary across eras (low-scoring football in the early decades, high-scoring in the 1970–80s, and a gradual compression since), MoSHBODS does not update ratings using raw points. Instead, both raw scores and scoring shots are standardised relative to a rolling historical baseline.

For every game, the system computes a rolling mean and standard deviation of all scores in a window of approximately δ × 3650 days before the game date, where δ is a tuned parameter (Days_To_Average_for_Score). Scores are then z-scored:

zscore = (Score − μwindow) / σwindow

zSS = (SS − μSS,window) / σSS,window

For the very first year in the dataset, fixed baseline statistics from that year are used in place of rolling values.

1.4 The Adjusted Score Blend

After standardisation, the model blends the raw score z-score and scoring shot z-score using a tuned mixing parameter αadj (Adjustment_Factor):

ScoreAdj = αadj × zSS + (1 − αadj) × zscore

This blended quantity is the figure that drives all rating updates. Weighting SS more heavily rewards shot generation and reduces sensitivity to goal-kicking accuracy variance, while the retained raw-score component ensures that conversion rate still counts for something.

2. The Venue Performance Value (VPV)

2.1 What Is VPV?

Home ground advantage in AFL is real, but it is not uniform. Some teams have a dominant record at their traditional venue; others are indifferent to location. Also, teams when playing away perform differently at some venues than at others. The Venue Performance Value (VPV) is the model's way of capturing this ground-specific effect for each team.

For a given team at a given venue on a given date, VPV is computed as the mean excess adjusted margin over what the ratings would have predicted, across all previous visits to that venue within a rolling time window of δVPV × 3650 days.

2.2 Excess Performance Definition

The excess performance in a historical game is:

Excessi = (ScoreAdj,i − OppScoreAdj,i) − (Offi + Defi − Offopp,i − Defopp,i)

That is: how much better (or worse) did the team perform at this ground than their ratings at the time predicted? This residual captures the component of performance explained by the venue rather than the teams' relative strengths.

2.3 Regression to the Mean

Raw excess performance figures are scaled by a mean-regression multiplier λ (Mean_Reg) before averaging, which shrinks estimated VPVs toward zero and prevents overreacting to small samples:

Ave_Excess = λ × mean(Excessi over window)

2.4 The VPV Multiplier (Sample Size Weighting)

To reflect uncertainty when few games have been played at a venue, the average excess performance is multiplied by a weight that increases with sample size, capped at a reference value Gref (Games_Before_Average × 100):

w = min(n, Gref) / Gref

where n = number of historical games at venue in window

When n → 0, the weight collapses to zero and the default VPV takes over. When n ≥ Gref, the sample is considered sufficient and the weight plateaus at 1.

2.5 Home Region vs. Away Region

Teams are assigned a home region (e.g. Greater Melbourne, Queensland, West Australia, Adelaide, Sydney). Venues are similarly tagged.

  • If the team's region matches the venue's region: VPV = w × Ave_Excess
  • If they are in different regions (neutral or away venue): VPV = w × Ave_Excess + (1 − w) × VPVdefault

The out-of-region default VPVdefault (Out_Of_Region_Default_VPV) is a negative constant, reflecting the fact that teams unfamiliar with a ground in a foreign region typically underperform their rating.

2.6 Finals Adjustments

VPVs are moderated during finals to reflect the reduced home-ground effect that typically applies in knockout games, where crowd and travel factors are partially equalised. Separate scaling fractions are applied depending on whether the game is a non-Grand Final final or the Grand Final, and whether the team is playing in its home region or not:

VPVfinal = ffinal,same × VPV   (non-GF, same region)

VPVfinal = ffinal,diff × VPV   (non-GF, different region)

VPVGF   = fGF,same × VPV    (Grand Final, same region)

VPVGF   = fGF,diff × VPV    (Grand Final, different region)

The parameters ffinal,same, ffinal,diff, fGF,same, fGF,diff are all tuned during optimisation.

2.7 Net VPV

For each game, both teams have their own VPV calculated independently. The net venue effect used in all game calculations is:

VPVnet = VPVown − VPVopp

3. Rating Mechanics

3.1 Two Ratings, Two Margins

Each team carries two independent ratings: an offensive rating (Off) and a defensive rating (Def). Both start at zero and evolve over time. The expected margin from a team's perspective is computed in two ways:

Expected_MarginOff = (Offown − Defopp) + VPVnet / 2

Expected_MarginDef = (Defown − Offopp) + VPVnet / 2

These two expected margins represent the "offensive" prediction (how well should I score vs. their defence?) and the "defensive" prediction (how well should I defend vs. their attack?). They are used to update the offensive and defensive ratings respectively.

3.2 Actual Margins for Rating Updates

The actual analogues for the rating update use the blended adjusted scores and a notional expected score of zero (since everything is already in standardised space):

Actual_MarginOff = ScoreAdj,own − 0 = ScoreAdj,own

Actual_MarginDef = 0 − ScoreAdj,opp = −ScoreAdj,opp

The offensive rating is updated based on how much the team's own adjusted score exceeded the offensive expectation; the defensive rating is updated based on how much the team suppressed the opponent relative to the defensive expectation.

3.3 The Learning Rate (Alpha)

The speed at which ratings update after each game is governed by α. For regular-season games, α decays exponentially as the season progresses, reflecting the principle that early-season results should carry more updating weight (larger sample uncertainty) than late-season results (where the team's quality is already well-estimated):

αround = α2 + α1 × exp(α3 × r / R)

where r = current round number, R = season's maximum round

The three parameters α1, α2, α3 are all optimised. In practice, α3 is negative, causing α to decrease over the season. For finals, a fixed rate αfinals is used instead.

3.4 The Rating Update Equations

Armed with the expected and actual margins and the learning rate, the new ratings are:

Offnew = Offold + α × (Actual_MarginOff − Expected_MarginOff)

Defnew = Defold + α × (Actual_MarginDef − Expected_MarginDef)

If the team scored better than expected offensively, the offensive rating rises. If the opponent scored less than expected against the team's defence, the defensive rating rises. The two dimensions update independently, so a team can improve its offensive rating without any change to its defensive rating in the same game.

3.5 Season-Start Carryover

At the start of each new season, ratings are not simply carried forward in full. Instead, a carryover fraction γ (Carryover) blends the end-of-previous-season rating with an initial rating of zero:

Offseason start = γ × Offend of last season + (1 − γ) × 0

Defseason start = γ × Defend of last season + (1 − γ) × 0

This shrinks all teams toward zero at the start of each year, acknowledging that rosters change over the off-season and that past form is an imperfect guide to future performance. A brand new team (its very first ever game) always starts at zero.

3.6 Cross-Season Rating Normalisation

To prevent the aggregate of all ratings from drifting away from zero, the system normalises ratings at the start of each season. Before the first game of a new year, it computes the sum of all offensive and defensive ratings across all competing teams and subtracts the average from each team:

Offset = ∑(Offi + Defi) / (2N)

Offi ← Offi − Offset,   Defi ← Defi − Offset

This ensures the rating system remains a zero-sum measure: if one team goes up, another has implicitly gone down, which is the correct interpretation of relative team strength.

4. Converting Ratings to Expected Scores

4.1 Raw Expected Margins in Standardised Space

From the ratings and VPVs, the system computes expected scores for each team in standardised (z-score) space:

E[zown] = Offown − Defopp + (VPVown − VPVopp) / 2

E[zopp] = Offopp − Defown + (VPVopp − VPVown) / 2

The net margin expectation is E[zown] − E[zopp], which equals VPVnet + (Offown − Defopp) − (Offopp − Defown). This is the core prediction of the model expressed in a scale-invariant unit.

4.2 Total Score Multiplier

The expected z-scores are then adjusted by a total score multiplier φ that rescales the combined total up or down. Separate multipliers are used for home-and-away games and for finals:

E[zown]adj = E[zown] + 0.5 × (φ − 1) × E[ztotal]

E[zopp]adj = E[zopp] + 0.5 × (φ − 1) × E[ztotal]

where E[ztotal] = E[zown] + E[zopp]

This operation preserves the expected margin (since both scores are shifted by the same amount) while scaling the expected total. The home-and-away multiplier φHA is tuned to be less than 1 in the current parameterisation, pulling total scores slightly lower than the raw rating sum would suggest.

4.3 Back-Transforming to Real Points

The final expected scores in actual points are recovered by reversing the standardisation:

E[Scoreown] = μwindow + E[zown]adj × σwindow

E[Scoreopp] = μwindow + E[zopp]adj × σwindow

where μwindow and σwindow are the rolling league-wide mean and standard deviation of scores in the look-back window. This produces predicted point totals that are directly comparable to the actual scoreboard.

For 2020 games, the expected scores are divided by 1.25 to convert back to the compressed match-length scale before output.

5. Expected Conversion Rate and Implied Scoring Shots

5.1 Historical Conversion Rate

The expected score in points can be decomposed into scoring shots and a conversion rate (the proportion of scoring shots that become goals). For each upcoming game, the system looks back over a rolling window and computes a league-wide expected conversion rate for home and away teams separately:

Exp_Conv = ∑(Score − SS) / 5 / ∑(SS)   over window

This formula expresses the expected number of goals per scoring shot: each goal contributes 5 extra points above a behind, so dividing the excess points by 5 gives the expected number of goals, and dividing by total SS gives the conversion rate.

5.2 Implied Expected Scoring Shots

Given the expected points total E[S] and the expected conversion rate c, the implied expected scoring shots E[SS] is derived by solving the score equation:

E[Score] = E[SS] × (c × 6 + (1 − c) × 1) = E[SS] × (5c + 1)

⇒ E[SS] = E[Score] / (5c + 1)

This decomposition is used downstream in the score simulation engine.

6. Score Simulation and Win Probability

6.1 The Two-Stage Scoring Model

To estimate win probabilities and score distributions, MoSHBODS uses a Monte Carlo simulation that models each game as a two-stage process:

  • Stage 1: Simulate scoring shots. The home and away scoring shots are drawn from Generalised Poisson distributions with a bivariate correlation structure, reflecting the reality that high-scoring games tend to be high-scoring for both teams.
  • Stage 2: Simulate conversion (goals vs behinds). Given the simulated number of scoring shots, each shot is converted to a goal or behind through a Beta-Binomial draw, capturing the extra-binomial variability in kicking accuracy.

6.2 Generalised Poisson Scoring Shots

For each team, the scoring shots SS is modelled as a Generalised Poisson variable with mean λ (the expected SS from Section 5) and an overdispersion parameter ω. The dispersion is set so that the standard deviation of the distribution matches an empirically estimated value σSS:

ω = 1 − √λ / σSS

The standard deviation σSS is itself a step function of the expected SS level, reflecting how variability in shot generation increases with expected volume.

6.3 Bivariate Correlation via Gaussian Copula

The home and away scoring shot draws are not independent — weather, ground conditions, and game pace affect both teams simultaneously. A Gaussian copula is used to induce the desired bivariate correlation ρ = −0.11 between them:

1. Draw (U1, U2) from a bivariate normal with correlation matrix [[1, ρ], [ρ, 1]]

2. Transform to uniform: (V1, V2) = (Φ(U1), Φ(U2))

3. Apply the inverse CDF of each team's GP distribution to get SS1, SS2

The negative correlation (ρ ≈ −0.11) reflects the slight tendency for games to be more one-sided than models assuming independent scoring would predict: when one team generates many scoring shots, the other tends to generate slightly fewer.

6.4 Beta-Binomial Conversion

Given SS scoring shots, the number of goals G is drawn from a Beta-Binomial distribution:

G | SS ~ BetaBinomial(n = SS, prob = c, θ)

The concentration parameter θ controls the extra-binomial variance in conversion. Separate values are used for home (θhome) and away (θaway) teams, reflecting the greater consistency of home team kicking. The final score is then:

Score = G × 6 + (SS − G) × 1

6.5 Win Probability Estimation

After simulating n = 10,000 game instances, the home team win probability is estimated as:

P(Home Win) = [#{scorehome > scoreaway} + 0.5 × #{scorehome = scoreaway}] / n

The simulation also produces estimates of the standard deviation of the margin and total, which are used for line and total betting analysis.

6.6 Analytic Approximation (Normal Model)

As a cross-check, the model also computes an analytic win probability using a normal approximation to the margin distribution. The margin variance is approximated as:

Var(Margin) ≈ a × E[Sown]b + c × E[Sopp]d + e × E[Sown]b/2 × E[Sopp]d/2

The win probability is then P(Home Win) = Φ( (E[Sown] − E[Sopp]) / √Var(Margin) ). The model also uses an analogous equation to estimate the variance of the total score. This analytic path serves as a computationally cheap sanity check against the full simulation.

7. Parameter Summary

The table below summarises the key parameters of the MoSHBODS system and their roles. Actual values are omitted here; they are determined by optimisation against historical data.

Parameter Symbol Role
Alpha_P1α1Determine the shape of the adjustment factors used as the season progresses
Alpha_P2α2
Alpha_P3α3
Alpha_FinalsαfinalsFixed learning rate for finals games
Adjustment_FactorαadjWeight of SS vs. raw score in blended adjusted score
CarryoverγFraction of end-of-season rating carried to next year
Mean_RegλRegression multiplier for VPV average
Games_Before_AverageGref / 100Reference game count for VPV sample-size weight
Days_To_Average_for_VPVδVPVVPV rolling window (in units of ~10 years)
Days_To_Average_for_ScoreδscoreScore standardisation rolling window
Out_Of_Region_Default_VPVVPVdefaultDefault VPV for away-region venues
Total_Multiplier_HAφHATotal score scalar for regular season
Total_Multiplier_FinalφfinalTotal score scalar for finals
Final_VPV_Fraction_Same_Stateffinal,sameVPV scaling for finals (home region)
Final_VPV_Fraction_Diff_Stateffinal,diffVPV scaling for finals (away region)
Grand_Final_VPV_Fraction_Same_StatefGF,sameVPV scaling for the Grand Final (home region)
Grand_Final_VPV_Fraction_Diff_StatefGF,diffVPV scaling for the Grand Final (away region)

8. Outputs

For each game in the current round, MoSHBODS produces the following outputs:

  • Offensive and defensive ratings for both teams entering the game
  • Net Venue Performance Value (VPVown − VPVopp)
  • Expected score for each team (in actual points)
  • Expected margin and expected total (also in actual points)
  • Home team win probability (simulation-based and analytic)
  • Standard deviation of the margin and total (simulation-based and analytic)

After each completed game, the ratings for both teams are updated and stored. At the end of the season, each team's latest offensive and defensive ratings — and their combined sum — provide a final season snapshot.

Conclusion

MoSHBODS is a layered but coherent system. Its core insight is that offensive and defensive quality are separable, and that tracking them independently produces more nuanced and predictively powerful team ratings than a single composite number.

The system's handling of era-normalisation (through rolling z-scoring), ground effects (through VPV), and intra-season dynamics (through a decaying learning rate) makes it robust across the full 130-year span of VFL/AFL football. The two-stage simulation engine ensures that win probabilities properly reflect the fat-tailed, correlated nature of AFL scoring rather than relying on a simple normal approximation.

The combination of principled structure and empirically tuned parameters gives MoSHBODS both interpretability and accuracy — a rare combination in sports modelling.