The Onions Basketball Index is a probabilistic model for predicting NCAA tournament outcomes. It combines KenPom efficiency ratings with historical upset patterns to generate a complete 63-game bracket prediction, including win probabilities for every matchup.
The name comes from the classic basketball phrase “that guy has onions” — meaning a player has guts, nerve, the willingness to take and make the big shot. The model tries to capture that same energy: which teams actually perform when it matters?
A 3-layer model for March Madness
Methodology
The model has three versions, each building on the last:
- v1Logistic Efficiency Model — Uses KenPom adjusted offensive and defensive efficiency ratings as inputs to a logistic regression. The difference in team efficiencies produces a win probability for each matchup, which is then simulated forward through the bracket.
- v2Efficiency Splits— Breaks efficiency into offensive and defensive components rather than net rating. This captures stylistic mismatches — a great defense vs. a great offense plays out differently than two average teams.
- v3Upset Detection— Adds historical seed-matchup upset rates as a prior. If 12-seeds beat 5-seeds 35% of the time historically, the model incorporates that signal even when pure efficiency says otherwise. This is the version shown in the bracket below.
predict.py
def predict_matchup(team_a, team_b, kenpom):
"""Logistic model: P(A wins) from efficiency gap."""
eff_a = kenpom[team_a]["adj_eff"]
eff_b = kenpom[team_b]["adj_eff"]
diff = eff_a - eff_b
log_odds = 0.1462 * diff # fitted coefficient
prob_a = 1 / (1 + math.exp(-log_odds))
return prob_a
def simulate_bracket(bracket, kenpom, n=10000):
"""Monte Carlo: simulate full tournament n times."""
champion_counts = defaultdict(int)
for _ in range(n):
winners = {}
for round_num in range(6):
matchups = get_matchups(bracket, round_num, winners)
for a, b in matchups:
p = predict_matchup(a, b, kenpom)
winner = a if random.random() < p else b
winners[(round_num, a, b)] = winner
champion_counts[winners["final"]] += 1
return champion_counts
2026 NCAA Tournament. Scroll horizontally within each region on mobile.
v3 Model Predictions
Cyan = Model pickUpset pickCorrectIncorrectNot yet played
East
Round of 64
(1)Duke
(16)Siena
Duke 99.9%✓
(8)Ohio St.
(9)TCU
Ohio St. 65.7%✗
(5)St. John's
(12)Northern Iowa
St. John's 84.7%✓
(4)Kansas
(13)Cal Baptist
Kansas 90.1%✓
(6)Louisville
(11)South Florida
Louisville 84.7%✓
(3)Michigan St.
(14)North Dakota St.
Michigan St. 98.8%✓
(7)UCLA
(10)UCF
UCLA 72.9%✓
(2)Connecticut
(15)Furman
Connecticut 99.3%✓
Round of 32
(1)Duke
(8)Ohio St.
Duke 93.3%✓
(5)St. John's
(4)Kansas
St. John's 55% ⚠️✓
(3)Michigan St.
(6)Louisville
Michigan St. 63.1%✓
(2)Connecticut
(7)UCLA
Connecticut 72.5%✓
Sweet 16
(1)Duke
(5)St. John's
Duke 88.7%✓
(3)Michigan St.
(2)Connecticut
Michigan St. 51.9% ⚠️✗
Elite 8
(1)Duke
(3)Michigan St.
Duke 87.1%✗
West
Elite 8
(1)Arizona
(2)Purdue
Arizona 70.5%✓
Sweet 16
(1)Arizona
(4)Arkansas
Arizona 84.6%✓
(2)Purdue
(3)Gonzaga
Purdue 59.8%✓
Round of 32
(1)Arizona
(9)Utah St.
Arizona 95.4%✓
(4)Arkansas
(5)Wisconsin
Arkansas 58.5%✓
(3)Gonzaga
(11)Texas
Gonzaga 76.9%✗
(2)Purdue
(7)Miami FL
Purdue 81.1%✓
Round of 64
(1)Arizona
(16)LIU
Arizona 99.9%✓
(8)Villanova
(9)Utah St.
Utah St. 53.9% ⚠️✓
(5)Wisconsin
(12)High Point
Wisconsin 89.6%✗
(4)Arkansas
(13)Hawaii
Arkansas 90.6%✓
(6)BYU
(11)Texas
Texas 37.4% ⚠️✓
(3)Gonzaga
(14)Kennesaw St.
Gonzaga 99.4%✓
(7)Miami FL
(10)Missouri
Miami FL 72.7%✓
(2)Purdue
(15)Queens
Purdue 96.8%✓
Semifinal — Duke vs Florida
(1)Duke
(1)Florida
Duke 71.1%✗
Championship
(1)Duke
(1)Arizona
Duke 55.6%✗
ChampionSemifinal — Arizona vs Michigan
(1)Arizona
(1)Michigan
Arizona 50.3%✗
South
Round of 64
(1)Florida
(16)Prairie View A&M
Florida 99.9%✓
(8)Clemson
(9)Iowa
Iowa 63.3% ⚠️✓
(5)Vanderbilt
(12)McNeese
Vanderbilt 91.1%✓
(4)Nebraska
(13)Troy
Nebraska 97.8%✓
(6)North Carolina
(11)VCU
North Carolina 66.9%✗
(3)Illinois
(14)Penn
Illinois 97.9%✓
(7)Saint Mary's
(10)Texas A&M
Saint Mary's 70.7%✗
(2)Houston
(15)Idaho
Houston 99.5%✓
Round of 32
(1)Florida
(9)Iowa
Florida 90.2%✗
(5)Vanderbilt
(4)Nebraska
Vanderbilt 54.4% ⚠️✗
(3)Illinois
(6)North Carolina
Illinois 83.9%✓
(2)Houston
(7)Saint Mary's
Houston 85.8%✓
Sweet 16
(1)Florida
(5)Vanderbilt
Florida 73.3%✗
(2)Houston
(3)Illinois
Houston 54.5%✗
Elite 8
(1)Florida
(2)Houston
Florida 51.5%✗
Midwest
Elite 8
(1)Michigan
(2)Iowa St.
Michigan 69.1%✓
Sweet 16
(1)Michigan
(5)Texas Tech
Michigan 87.7%✓
(2)Iowa St.
(6)Tennessee
Iowa St. 73.4%✗
Round of 32
(1)Michigan
(9)Saint Louis
Michigan 97.2%✓
(4)Alabama
(5)Texas Tech
Texas Tech 48.4% ⚠️✗
(3)Virginia
(6)Tennessee
Tennessee 46.9% ⚠️✓
(2)Iowa St.
(7)Kentucky
Iowa St. 87.7%✓
Round of 64
(1)Michigan
(16)Howard
Michigan 99.5%✓
(8)Georgia
(9)Saint Louis
Saint Louis 41.5% ⚠️✓
(5)Texas Tech
(12)Akron
Texas Tech 87.9%✓
(4)Alabama
(13)Hofstra
Alabama 90.9%✓
(6)Tennessee
(11)Miami OH
Tennessee 94.4%✓
(3)Virginia
(14)Wright St.
Virginia 99.2%✓
(7)Kentucky
(10)Santa Clara
Kentucky 58.4%✓
(2)Iowa St.
(15)Tennessee St.
Iowa St. 99.8%✓
Key Predictions (v3)
- Champion:Duke (1) over Arizona (1) — 55.6% win probability in the final.
- Final Four:Duke, Florida, Arizona, Michigan — all four 1-seeds make it in v3 as well, but with more upset variance along the way.
- Closest game:Arizona (50.3%) over Michigan in the semifinal — essentially a coin flip.
- Notable upset picks: Texas (11) over BYU (6), Saint Louis (9) over Georgia (8), Tennessee (6) over Virginia (3), and Texas Tech (5) over Alabama (4).
Championship Probabilities
Top teams by probability of winning it all (v3 model, 10k simulations).
The v3 upset detection model picks more upsets along the way — like Texas over BYU and Tennessee over Virginia — but still lands on an all-1-seed Final Four. The historical seed priors add variance in early rounds without dramatically reshaping the deep bracket, where efficiency advantages compound.