Morozov Balance Index (MBI): methodology
The Morozov Balance Index (MBI) answers one question for each of the 960 Chess960 starting positions: how big is White's opening advantage? This page is the full method — every number on this site can be recomputed from it.
Author of the methodology: Roman Morozov. About the author · Version 1.0 · 2026-08-25
CC BY 4.0 Methodology and data: CC BY 4.0 — free to use with attribution to the author.
What the index measures
In chess, White moves first. That first move is worth something, and in Chess960 it is worth a different amount in each of the 960 starting setups. The index measures the SIZE of that opening edge — not who is better. In 956 of the 960 positions the engine puts the start at equality or in White's favour; the other four land 2 to 7 centipawns on Black's side, which is less than the search moves between its own iterations — noise around zero, not an advantage for Black. The measure is the distance from zero whichever way it points, so the honest phrasing is "how large is the head start here", and a balanced position is one where that head start is as small as it gets.
MBI is a 0–100 scale. 100 means the smallest measured White edge among all 960 positions — the most balanced start. 0 means the largest measured edge. The index is a rank-based transform of one measured quantity (see below), so it says how a position compares with the other 959, not how many pawns anybody is up.
How each position is evaluated
Every starting position is analysed once by Stockfish from the initial setup, with a fixed budget of search NODES rather than a fixed amount of time. This is the key decision of the whole method: a node budget is machine-independent. A time budget would give a fast computer a deeper search and therefore a different number, and nobody could check the result.
- Engine: Stockfish 17.1, official build, NNUE evaluation embedded in the binary.
- Binary SHA-256:
5f95eaea0d4eb697381989187ce6eb4d6ad59283c34421765ecc73cdb09ba766 - NNUE networks: nn-1c0000000000.nnue, nn-37f18f62d772.nnue
- Search limit: 400 000 000 nodes per position (`go nodes`).
- UCI options: Threads = 1, Hash = 256 MB, UCI_Chess960 = true.
- `ucinewgame` before every position: the hash table is cleared, so positions do not influence each other and the order of computation does not matter.
- The score is always taken from White's point of view, in centipawns (100 cp = one pawn).
- The value and the variation are taken from the last COMPLETED search iteration — a line carrying neither a lower nor an upper bound. An iteration cut short by the node limit reports a bound, not a settled evaluation, and its variation is one or two moves long; using it would publish noise as a result.
Single-threaded search with a fixed hash and a fixed node count is deterministic: the same binary on any machine returns the same centipawn value, bit for bit. That is what makes an independent check possible rather than merely plausible.
From centipawns to the index
Centipawns are not a linear measure of anything human, and the difference between +18 and +22 is not meaningful on its own. The index therefore uses the RANK of a position among all 960, not the raw number:
rank(sp) = position of eval_cp(sp) in the sorted list of all 960 values
(ascending: smallest White edge first, ties share the mean rank)
MBI(sp) = round( 100 * (960 - rank(sp)) / (960 - 1) )
| Class | White edge | Positions |
|---|---|---|
| A — most balanced | ≤ +19 cp | 240 |
| B — balanced | +20…+26 cp | 240 |
| C — noticeable edge | +27…+35 cp | 240 |
| D — largest edge | > +35 cp | 240 |
Across all 960 positions the engine value runs from +-7 to +83 centipawns, median +26.0.
How the 960 values are distributed
Each bar is a five-centipawn bucket; the number on the right is how many of the 960 starting positions fall into it.
Validation
An engine evaluation is a claim about a position. To check that the claim predicts actual results, a subset of positions is played out: engine against engine, many games per position, with the seeds fixed and published. If positions the index calls balanced really do score closer to 50% for White, the index measures what it says it measures.
- 60 positions × 50 games = 3000 games, time control 300,000 nodes/move.
- Spearman correlation between the starting evaluation and White’s score: 0.76 (95% CI 0.63…0.85, 10000 bootstrap resamples). MBI is a monotone transform of that evaluation, so the same number describes it.
- Verdict: validated — the ranking predicts self-play results, and the index is published as measured.
Seed base: 20260825. Every game can be replayed exactly.
| Position | Group | Engine, cp | Games | W/D/L | White score |
|---|---|---|---|---|---|
| 42 | random | +23 | 50 | 6/44/0 | 56.0% (42.3–68.8%) |
| 52 | random | +18 | 50 | 5/45/0 | 55.0% (41.3–67.9%) |
| 80 | most skewed | +83 | 50 | 7/42/1 | 56.0% (42.3–68.8%) |
| 86 | random | +34 | 50 | 1/48/1 | 50.0% (36.6–63.4%) |
| 102 | most balanced | 0 | 50 | 3/47/0 | 53.0% (39.5–66.1%) |
| 131 | most balanced | 0 | 50 | 0/50/0 | 50.0% (36.6–63.4%) |
| 204 | most balanced | 0 | 50 | 0/46/4 | 46.0% (33.0–59.6%) |
| 217 | most balanced | +3 | 50 | 0/50/0 | 50.0% (36.6–63.4%) |
| 259 | most balanced | +3 | 50 | 2/43/5 | 47.0% (33.9–60.6%) |
| 262 | random | +43 | 50 | 6/44/0 | 56.0% (42.3–68.8%) |
| 266 | random | +26 | 50 | 3/47/0 | 53.0% (39.5–66.1%) |
| 268 | most skewed | +58 | 50 | 8/42/0 | 58.0% (44.2–70.6%) |
| 269 | most balanced | 0 | 50 | 1/46/3 | 48.0% (34.8–61.5%) |
| 272 | most skewed | +58 | 50 | 13/36/1 | 62.0% (48.2–74.1%) |
| 292 | random | +49 | 50 | 1/49/0 | 51.0% (37.6–64.3%) |
| 300 | most balanced | 0 | 50 | 3/47/0 | 53.0% (39.5–66.1%) |
| 332 | most skewed | +59 | 50 | 10/40/0 | 60.0% (46.2–72.4%) |
| 348 | most skewed | +62 | 50 | 6/44/0 | 56.0% (42.3–68.8%) |
| 399 | most skewed | +65 | 50 | 7/38/5 | 52.0% (38.5–65.2%) |
| 401 | most balanced | -7 | 50 | 0/49/1 | 49.0% (35.7–62.4%) |
| 418 | most balanced | -2 | 50 | 1/49/0 | 51.0% (37.6–64.3%) |
| 424 | random | +23 | 50 | 6/44/0 | 56.0% (42.3–68.8%) |
| 429 | most balanced | 0 | 50 | 0/50/0 | 50.0% (36.6–63.4%) |
| 432 | most balanced | +3 | 50 | 5/44/1 | 54.0% (40.4–67.0%) |
| 433 | most balanced | -4 | 50 | 4/45/1 | 53.0% (39.5–66.1%) |
| 467 | most balanced | +2 | 50 | 2/47/1 | 51.0% (37.6–64.3%) |
| 471 | most balanced | 0 | 50 | 0/50/0 | 50.0% (36.6–63.4%) |
| 481 | random | +5 | 50 | 1/49/0 | 51.0% (37.6–64.3%) |
| 485 | most balanced | +3 | 50 | 1/49/0 | 51.0% (37.6–64.3%) |
| 497 | most balanced | 0 | 50 | 0/48/2 | 48.0% (34.8–61.5%) |
| 499 | random | +18 | 50 | 4/46/0 | 54.0% (40.4–67.0%) |
| 531 | random | +13 | 50 | 4/46/0 | 54.0% (40.4–67.0%) |
| 556 | random | +21 | 50 | 2/48/0 | 52.0% (38.5–65.2%) |
| 557 | most skewed | +63 | 50 | 15/35/0 | 65.0% (51.1–76.7%) |
| 565 | most skewed | +60 | 50 | 4/44/2 | 52.0% (38.5–65.2%) |
| 576 | most balanced | 0 | 50 | 1/48/1 | 50.0% (36.6–63.4%) |
| 578 | most skewed | +56 | 50 | 12/38/0 | 62.0% (48.2–74.1%) |
| 593 | most balanced | +2 | 50 | 0/49/1 | 49.0% (35.7–62.4%) |
| 604 | most skewed | +81 | 50 | 13/37/0 | 63.0% (49.1–75.0%) |
| 620 | most skewed | +63 | 50 | 12/38/0 | 62.0% (48.2–74.1%) |
| 637 | random | +21 | 50 | 7/43/0 | 57.0% (43.3–69.7%) |
| 654 | random | +34 | 50 | 4/45/1 | 53.0% (39.5–66.1%) |
| 665 | random | +22 | 50 | 6/44/0 | 56.0% (42.3–68.8%) |
| 745 | random | +13 | 50 | 3/46/1 | 52.0% (38.5–65.2%) |
| 748 | random | +42 | 50 | 6/43/1 | 55.0% (41.3–67.9%) |
| 760 | most skewed | +61 | 50 | 8/40/2 | 56.0% (42.3–68.8%) |
| 784 | most skewed | +58 | 50 | 10/38/2 | 58.0% (44.2–70.6%) |
| 786 | most balanced | +2 | 50 | 4/45/1 | 53.0% (39.5–66.1%) |
| 794 | most skewed | +67 | 50 | 12/38/0 | 62.0% (48.2–74.1%) |
| 801 | random | +11 | 50 | 1/49/0 | 51.0% (37.6–64.3%) |
| 814 | random | +32 | 50 | 5/45/0 | 55.0% (41.3–67.9%) |
| 823 | most balanced | -5 | 50 | 2/48/0 | 52.0% (38.5–65.2%) |
| 868 | most skewed | +75 | 50 | 9/41/0 | 59.0% (45.2–71.5%) |
| 870 | random | +44 | 50 | 5/45/0 | 55.0% (41.3–67.9%) |
| 879 | most skewed | +66 | 50 | 11/38/1 | 60.0% (46.2–72.4%) |
| 880 | most skewed | +63 | 50 | 7/42/1 | 56.0% (42.3–68.8%) |
| 885 | random | +14 | 50 | 1/49/0 | 51.0% (37.6–64.3%) |
| 886 | most skewed | +58 | 50 | 5/45/0 | 55.0% (41.3–67.9%) |
| 902 | most skewed | +62 | 50 | 5/44/1 | 54.0% (40.4–67.0%) |
| 935 | most skewed | +78 | 50 | 11/38/1 | 60.0% (46.2–72.4%) |
Limitations — read this before quoting the numbers
- An engine evaluation is not human practice. A position an engine calls balanced can still be uncomfortable, sharp or unfamiliar for a human, and that is not measured here.
- One engine, one evaluation function. A different engine would produce a slightly different ordering. The method is fixed and published so that anyone can repeat it with another engine and compare.
- A fixed node budget is a snapshot at one search depth. Deeper analysis moves individual values; the ranking is far more stable than any single number, which is why the index is rank-based.
- Chess960 has almost no opening theory. In classical chess White's edge is partly a library of prepared lines; here it is only what the pieces do. That makes the measurement cleaner, but it also means these numbers say nothing about the classical start.
- Self-play at a fast time control is a cheap approximation of "real play". It validates the ordering, it does not certify any single position.
- The index is a property of the STARTING position only. It says nothing about who is better after one move.
Reproduce it yourself
Everything needed to recompute the dataset is public: the exact engine build, the budget, the scripts and the raw output. Recomputing one position takes a few minutes on a single core; the whole set is an overnight run.
- Download the raw data and the scripts from the open-data page. Open data
- Check one position against the published dataset — this recomputes it from scratch and compares:
python tools/balance/verify_reproduce.py --sp 518 - Or recompute the entire set (resumable; it appends to the same file if interrupted):
python tools/balance/eval_all.py --nodes 400000000 --workers 20
If your value differs, the difference is the finding — the engine build, the node budget or the options will not match. All three are printed above.
Citation and licence
The methodology and the dataset are published under CC BY 4.0: use them for anything, including commercially, with attribution.
Morozov R. Chess960 Balance Index (MBI). ch960.com/balance, 2026. CC BY 4.0.
Balance of all 960 positions · Dataset and raw engine output