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 | α1 | Determine the shape of the adjustment factors used as the season progresses |
| Alpha_P2 | α2 | |
| Alpha_P3 | α3 | |
| Alpha_Finals | αfinals | Fixed learning rate for finals games |
| Adjustment_Factor | αadj | Weight 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_Average | Gref / 100 | Reference game count for VPV sample-size weight |
| Days_To_Average_for_VPV | δVPV | VPV rolling window (in units of ~10 years) |
| Days_To_Average_for_Score | δscore | Score standardisation rolling window |
| Out_Of_Region_Default_VPV | VPVdefault | Default VPV for away-region venues |
| Total_Multiplier_HA | φHA | Total score scalar for regular season |
| Total_Multiplier_Final | φfinal | Total score scalar for finals |
| Final_VPV_Fraction_Same_State | ffinal,same | VPV scaling for finals (home region) |
| Final_VPV_Fraction_Diff_State | ffinal,diff | VPV scaling for finals (away region) |
| Grand_Final_VPV_Fraction_Same_State | fGF,same | VPV scaling for the Grand Final (home region) |
| Grand_Final_VPV_Fraction_Diff_State | fGF,diff | VPV 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.
