How the Hormuz Crisis Index is calculated
The HMX-INDEX is a weekly composite measuring geopolitical, maritime and energy-market stress in the Strait of Hormuz against a calm baseline. This page documents every input, every constant and every known weakness, so the number can be checked rather than taken on trust.
The formula
Each component is converted to a stress score between 0 and 100 by expressing its current value as a percentage change from its baseline value, then dividing by that component's cap and rescaling:
Stress scores are multiplied by their weight and summed, and the total is added to 100. Weights sum to exactly 1.0, so a component at maximum stress across all seven inputs would produce a score of 200.
Directional inversion. For ship traffic a fall below baseline is the crisis signal, so its percentage change is negated before scoring. All other components treat a rise as stress.
The index is one-sided by design. Stress scores are floored at zero, so conditions calmer than the baseline register as 0 rather than as negative stress, and the composite cannot fall below 100. This is deliberate — the index measures crisis stress, not general market wellbeing — but it is a real limitation, and it is listed as one below.
Components, weights and caps
Seven components, weighted to reflect how directly each one transmits chokepoint disruption into observable cost. The cap is the percentage change from baseline that scores 100 — the point at which that component is treated as maximally stressed.
| Component | Weight | Baseline | Cap | Source | Cadence |
|---|---|---|---|---|---|
| Brent Crude | 30% | 64.77 $/bbl | +55% | yfinance (BZ=F) | Daily (automatic) |
| Hormuz Transits (all commercial vessels) | 15% | 616.00 transits/wk | −90% | IMF PortWatch | Weekly (manual entry, IMF PortWatch publishes with a 2-day lag) |
| War-Risk Insurance (per transit) | 15% | 0.25 % hull value | +3900% | Marsh / market brokers | Weekly (manual entry, broker-quoted) |
| Tanker Freight (BDTI) | 15% | 900.00 index | +75% | Baltic Exchange | Weekly (manual entry) |
| TTF European Gas | 10% | 34.11 EUR/MWh | +95% | yfinance (TTF=F) | Daily (automatic) |
| VIX Volatility Index | 10% | 16.05 | +200% | yfinance (^VIX) | Daily (automatic) |
| Cape of Good Hope Reroutes | 5% | 8.00 % of traffic | +250% | AIS / Vortexa | Weekly (manual entry) |
Why each cap was set where it was
Caps are the most consequential judgement calls in the model: a tighter cap makes a component saturate sooner and so raises its effective influence at moderate stress levels. Each is anchored to a historical precedent rather than chosen to make the chart look right.
- Brent Crude +55%
- +55% approximates the peak move in Brent during the 2022 Ukraine invasion shock (~$78 to ~$128 over five weeks), the largest modern supply-driven repricing outside 2008.
- Hormuz Transits (all commercial vessels) −90%
- -90% is calibrated on the 2026 closure itself: PortWatch recorded 15 vessels/day against an 88/day baseline on 2026-07-19, an 83% decline, and single days near-total. The previous -50% cap saturated at a halving, so a disrupted strait and a closed one scored identically — the one discrimination this component exists to make. -90% keeps that range resolvable while still reserving the top of the scale for full closure.
- War-Risk Insurance (per transit) +3900%
- +3900% takes the rate from a 0.25% pre-war baseline to 10% of hull value, the peak quoted for Hormuz transits during this crisis. The previous +400% cap topped out at 0.50% of hull — a level the market passed in March 2026 — so a 5x reading and a 40x reading both scored 100 and the component could not rank severity within the crisis it was built to measure.
- Tanker Freight (BDTI) +75%
- +75% on the Baltic Dirty Tanker Index approximates the 2022 dislocation peak, when rerouting and sanctions repriced dirty tanker tonne-miles.
- TTF European Gas +95%
- +95% is deliberately wider than Brent's cap because TTF is structurally more volatile; the 2022 European gas crisis moved several multiples of this, so the cap marks 'severe' rather than 'worst imaginable'.
- VIX Volatility Index +200%
- +200% takes VIX from a ~16.1 baseline to ~48, above the March 2020 and October 2008 equity stress peaks.
- Cape of Good Hope Reroutes +250%
- +250% takes reroutes from an 8% baseline to 28% of regional traffic, comparable to the Suez diversion share observed in early 2024.
Baseline selection
For the three market-fed components the baseline is the mean of daily closes across 2026-01-01 to 2026-01-31 — 20 trading days with no active chokepoint disruption. Ship traffic is baselined on the IMF PortWatch one-year reference window. The remaining three manual components are anchored to their sources' stated pre-crisis levels. No baseline drifts once set.
This is still an approximation. One calm month is a better anchor than one calm week, but a different month would move every historical score by a point or so. A trailing multi-month median would be more robust and is on the roadmap. Until then, the baseline values are published in full — in the table above, in the JSON API, and in the CSV export — so anyone can rebase the series themselves and check how sensitive a conclusion is to that choice.
Severity bands
The composite is classified into five bands. Band thresholds and the gauge on the dashboard are generated from the same constants, so they cannot drift apart.
| Band | Score range |
|---|---|
| Calm | 100 – 110 |
| Elevated | 110 – 125 |
| Acute | 125 – 150 |
| Severe | 150 – 180 |
| Extreme | 180 and above |
Data cadence and staleness
Three components — Brent crude, TTF gas and VIX, together 50% of index weight — refresh automatically from market data. The other four have no free API and are entered by hand each week from licensed industry sources. The site does not pretend otherwise: every component in the breakdown table shows its own cadence and last-updated date.
What happens when a value cannot be fetched
- The last known value is carried forward. It is never reset to baseline — a value we could not fetch is not a value that is calm, and treating it as one would make an outage look like a de-escalation.
- The component is flagged stale in the breakdown table and in the JSON API.
- If stale components account for 20% or more of index weight, the whole snapshot is marked degraded and a reduced-confidence notice appears above the dashboard.
Operational note: this deployment is running on an ephemeral filesystem, so scheduled history writes persist only for the life of the serving instance. The published weekly series is the version committed to the repository.
Known limitations
Stated plainly, because a reader who finds these on their own trusts everything else less.
- Half the index weight is manually keyed. Four of seven components refresh weekly by hand, not continuously. Between updates those values are carried forward unchanged.
- The index cannot express calm below baseline. Stress scores floor at zero, so the composite has a hard floor of 100. A genuine de-escalation below January 2026 conditions is invisible to the model.
- The baseline is a single calm month for six of the seven components. See baseline selection above. Ship traffic is the exception: it is baselined on the IMF PortWatch one-year reference window, which is the more robust treatment and the direction the other six should move in.
- Components are correlated. Brent (30%), TTF gas (10%) and VIX (10%) tend to move together during an energy shock, so half the index weight can respond to a single event. The composite is therefore less diversified than a seven-component structure implies. A correlation matrix is published alongside the data.
- Cap thresholds are judgement calls. They are anchored to historical precedent and documented above, but a different analyst would reasonably choose different values, and the composite is sensitive to them.
- Scores are point estimates without a confidence interval. One decimal place implies more precision than four weekly manual inputs can support. Treat differences under roughly one point as noise.
Citation
Index data is published under CC BY 4.0. Attribution formats are on the Data & API page.