TTSI · Documentation
Methodology
Exactly how the TradeTurbulence Stress Index v3 is calculated: five pillars, ten public series, a fixed 2010–2019 reference, and why version 2 was replaced.
This page is the specification. If anything here disagrees with the number on
the index page, the number is wrong and we want to hear about
it. The code that computes it is indexer/ttsi.py; the two are kept in step.
The one-sentence version
Take ten public series in five pillars — shipping routes, supply chains, energy costs, money and finance, trade policy — rank each against its own values in a fixed reference decade, average the ranks within each pillar, then average the pillars with fixed published weights.
50 is an ordinary day of the 2010s. The 2010–2019 median of the index is 50.6. 80 or above has happened on 4% of days since 2020 and on none in the reference decade.
Why version 2 was replaced
Version 2 was published from July to August 2026. Measured on its own published history, it missed the three largest physical disruptions to trade of the decade:
| Episode | v2 average | v2 band | v3 average | v3 peak |
|---|---|---|---|---|
| Container crisis, Jun 2021 – Jan 2022 | 34.3 | Settled | 56.3 | 67.6 |
| Red Sea diversions, Dec 2023 – Jun 2024 | 30.0 | Settled | 52.5 | 58.2 |
| Strait of Hormuz closure, Mar 2026 – | 48.7 | Normal | 79.5 | 86.7 |
Version 2 scored the 2021–22 container crisis — ports jammed, freight rates up roughly tenfold — as calmer than the second half of 2019, and the Red Sea diversions as calmer than the middle of 2023. It moved into Settled on 12 August 2026, the day before this site reported the Strait of Hormuz’s share of chokepoint traffic 94.7% below normal. Three faults, each fixed in version 3:
- It had no physical measure of trade. Its only trade input was Kilian’s index of global real economic activity: monthly, 77 days behind, and a measure of demand for shipping. In 2021 demand was booming, so the component that was meant to see trade breaking scored 7.8 out of 100 through the worst supply-chain crisis on record. Version 3 drops it and measures what actually breaks: routes and supply chains.
- Rolling five-year ranks absorb anything that lasts. A disruption that persists becomes part of its own window, and its readings drift back toward 50 while nothing has been fixed. Version 3 ranks against a fixed reference, so a closure that lasts a year reads as severe for that year.
- It scored oil on volatility alone and tariffs not at all. Version 3 adds the real oil price and a trade-policy pillar built on the tariff rate importers actually pay.
The version 2 history is archived, unchanged, as ttsi-v2.csv. The two versions are not comparable and should not be spliced.
The five pillars
| Pillar | Weight | Signals (weight within pillar) | Updates |
|---|---|---|---|
| Shipping routes | 25% | Route Displacement Index (50%) · chokepoint tonnage shortfall (50%) | daily, ~6 days behind |
| Supply chains | 20% | NY Fed Global Supply Chain Pressure Index (100%) | monthly, ~1 week behind |
| Energy costs | 20% | Brent 20-day realised volatility (50%) · real Brent price (50%) | daily, ~4 days behind |
| Money and finance | 20% | Broad dollar, 63-day change (40%) · St. Louis Fed Financial Stress Index (40%) · VIX (20%) | daily and weekly |
| Trade policy | 15% | US effective tariff rate (60%) · trade policy uncertainty (40%) | daily and monthly |
Shipping routes carry the most weight because they are the most direct and the freshest physical measure of whether goods are moving. Trade policy carries the least because both of its signals are measured in the United States.
Shipping routes
From IMF PortWatch satellite AIS counts at the world’s 28 maritime chokepoints, the same feed as the chokepoint board.
- Route Displacement Index: the share of chokepoint traffic on a different route than in 2019–2023, over 30 days. When ships divert, the total barely moves, because the Cape gains what Suez loses. The share is what changes.
- Chokepoint tonnage shortfall: of the deadweight tonnage that normally passes the major chokepoints, the share missing from the routes that lost it. Routes running above their baseline count as zero. The RDI measures diversion; this measures closure.
Supply chains
The Global Supply Chain Pressure Index from the Federal Reserve Bank of New York combines ocean, air and road freight costs with delivery times, backlogs and purchased inventories from manufacturing surveys in seven economies, with demand effects removed. It is the one public series that measured the 2021–22 crisis as it happened. No free daily container freight rate exists; this is the honest substitute.
Energy costs
- 20-day realised volatility of Brent, annualised. Unpredictable fuel costs break freight contracts and production plans.
- Real Brent: the price in today’s dollars, deflated by US CPI. Fuel is the largest variable cost of moving goods, so the level matters as well as the swings. Adjusting for inflation keeps a 2026 price comparable with a 2012 one.
Money and finance
- Broad dollar index, 63-day change. About half of world trade is invoiced in dollars. A fast-rising dollar raises import bills and tightens trade finance outside the United States, so appreciation scores as stress.
- St. Louis Fed Financial Stress Index: 18 funding, credit and volatility measures, weekly.
- VIX, weighted lower because it overlaps the St. Louis index by construction. It carries the pillar between weekly releases.
Trade policy
- US effective tariff rate. Customs duties deposited at the Treasury over the last 91 days, from the Daily Treasury Statement, divided by goods imported over the same days (Census, via FRED). This is the tariff actually paid, not the headline schedule, and it moves within days of a change. Duties are gross deposits. Refunds of duties paid on earlier imports are excluded, because they say nothing about the cost of importing today. A month Census has not yet published is filled with the latest published month’s imports.
- Trade policy uncertainty: the trade category of the Economic Policy Uncertainty index (Baker, Bloom and Davis). Uncertainty delays orders and investment before any duty is collected.
How a reading is computed
- Score each signal. A signal’s score is the share of its own observations in the reference period that sit below today’s value: the midrank percentile. The reference period is 1 January 2010 to 31 December 2019 for every signal except the two shipping signals. Those use 1 January 2019 to 31 October 2023, the pre-disruption window the chokepoint board uses, because PortWatch begins in 2019. A score of 90 means “higher than on 90% of reference days”. A value beyond anything in the reference scores 100, and the index page flags it.
- Score each pillar as the weighted mean of its signals.
- Combine the pillars as a weighted mean.
Each day uses each series’ most recent observation dated on or before that day. Every input on the index page states its own observation date, so the lag of a monthly series is visible rather than hidden.
Why a fixed reference decade
The 2010s are the most recent full decade that contains ordinary times and ordinary stress: the euro crisis, the 2014–16 oil collapse, the 2015 China devaluation scare and the 2018–19 tariff escalation. They contain no pandemic, no war between major oil producers and no closed chokepoint. Ranking against a fixed decade gives the bands a meaning that does not move: Severe in 2030 will mean what it means today.
The cost is stated plainly. A fixed reference is a choice, and readings before 2020 are scored against a decade they partly sit inside, so the history before 2020 is a reconstruction rather than what the index would have read on the day. From 2020 onward, every reading uses only data published by its date and the fixed constants above. For the shipping pillar that holds from November 2023.
Why the arithmetic mean
Quadratic and maximum aggregates were tested. They lift a single-pillar crisis such as the Red Sea further, but they break the bands. A plain quadratic mean puts 35% of ordinary 2010s days in Elevated. A signed quadratic mean leaves only 16% in Normal. The arithmetic mean keeps 57% of reference days in Normal, 18% in Settled, 24% in Elevated, 2% in Calm and none in Severe, which is what the labels promise. To keep a single-pillar crisis from being averaged out of sight, the index page shows each pillar and how many are in severe territory.
Robustness
The weights were set before the backtest and not tuned to it. Moving to 30/20/20/15/15 shifts no episode’s average by more than 3.1 points. Equal weights shift none by more than 2.4. The ranking of episodes is a property of what is measured, not of the weights.
Other ways of combining the pillars, tested
In October 2026, more than 25 ways of combining the inputs were scored on the same real data and labels. The test is how well each one separates the ten episodes below from four quiet stretches (2012 H2, mid-2013 to mid-2014, 2017, April–October 2023), using ROC AUC (1.0 is perfect separation, 0.5 is a coin toss), and whether that still holds when any one episode or quiet stretch is left out.
| Method | AUC | Worst, one left out | Verdict |
|---|---|---|---|
| Mean pulled halfway to the worst pillar | 0.961 | 0.942 | Slightly better separation, but slow (18 days) and lifts ordinary days to a median of 63 |
| Ordered weighted average (most-stressed pillar weighted 35%, then 25/20/12/8) | 0.959 | 0.940 | Reacts in a median 1 day and keeps the scale once re-mapped; under review for v3.1 |
| Power mean, p = 2 | 0.951 | 0.928 | Better separation, but lifts ordinary days |
| Weighted arithmetic mean (published) | 0.945 | 0.919 | Best-calibrated scale |
| CISS-style correlation weighting (ECB method) | 0.944 | 0.936 | Slow: needs months of co-movement |
| Share of inputs beyond their 90th percentile | 0.922 | 0.899 | Good companion, too coarse alone |
| First principal component | 0.920 | 0.883 | Loads against oil, because oil crashes in recessions |
| Dynamic factor model (Kalman filter) | 0.889 | 0.851 | Too slow to react |
| Two-state hidden Markov regime probability | 0.759 | 0.719 | Finds the post-2018 tariff era, not crises |
| Logistic regression fitted to the episodes | 0.798 | 0.727 | Fourteen windows are far too few to learn weights |
| Mahalanobis “turbulence” (Kritzman and Li) | 0.635 | 0.565 | Measures unusualness in any direction, not stress |
| Version 2, as published | 0.746 | 0.702 | — |
The ordered weighted average’s lead over the published mean held in 98% of 2,000 episode-level bootstrap resamples. Its cost is scale: it lifts ordinary days to a median of 57. Re-mapped onto the mean’s 2010s distribution, it keeps both the separation and the calibration. That variant is the leading candidate for version 3.1, and any change will be published here first.
Several popular tools did not earn a place. Extreme-value return periods are unreliable when the reference decade holds only eleven independent extreme spells. Today’s reading lies beyond the fitted tail, so “once in N years” would be false precision. A nowcast of the monthly supply-chain index from daily inputs did worse out of sample than carrying the last month forward, which is what the index does. The absorption ratio, a measure of how tightly markets move together, did not reliably rise before episodes.
Companion measures published alongside
- Breadth and spread. How many pillars are in severe territory, and the effective number of stressed pillars (the inverse Herfindahl index of each pillar’s excess over 50). Big crises are broad: Covid, Ukraine and Hormuz each spread stress across three or more effective pillars. The 2015 oil collapse ran on about one.
- Half-closed routes, on the chokepoint board: how many of the routes that normally carry real traffic are running at under half of it.
- The US effective tariff rate and Brent in rupees, as indicators in their own right.
Validation
Episode averages and peaks, computed by the published code on 10 October 2026:
| Episode | Average | Peak |
|---|---|---|
| Lehman collapse, Sep–Dec 2008 | 55.8 | 72.5 |
| Euro debt crisis, Aug–Dec 2011 | 63.6 | 71.7 |
| Oil price collapse, Aug 2015 – Feb 2016 | 50.7 | 60.0 |
| US–China tariff escalation, May–Dec 2019 | 59.6 | 75.2 |
| Covid-19 shutdown, Mar–Jun 2020 | 75.2 | 79.0 |
| Container crisis, Jun 2021 – Jan 2022 | 56.3 | 67.6 |
| Ukraine invasion, Feb–Jun 2022 | 68.9 | 74.7 |
| Red Sea diversions, Dec 2023 – Jun 2024 | 52.5 | 58.2 |
| 2025 tariff shock, Apr–Jun 2025 | 62.2 | 66.9 |
| Strait of Hormuz closure, from Mar 2026 | 79.5 | 86.7 |
For comparison, the quiet stretches read 46.5 (2017) and 38.2 (April–October 2023). Two results differ sharply from version 2, and both are deliberate:
- The 2015–16 oil collapse reads Normal. Cheap fuel eases trade. Version 2 scored the size of the move, not its direction, and called it 92.
- Lehman peaks at 72.5, not 100. The 2008 shock was a collapse of credit and demand, not of the machinery of trade. The money pillar reads it at 99, and the routes and supply chains that the index now weights did not break. This index measures friction in moving and paying for goods, not the volume traded.
Known limitations
- No daily container freight rate. Drewry, Freightos and the Baltic indices are licensed. The supply-chain pillar includes freight costs, but monthly. Freight producer-price indices were tested and rejected: they rose about 10% during the Red Sea diversions while spot container rates roughly tripled.
- Two pillars are US-measured. The tariff rate is the US effective rate, and financial stress is read through US markets. The routes and supply-chain pillars are global.
- Shipping history starts in 2019. Before 30 January 2019 the index is computed from four pillars, re-weighted pro rata, and the CSV leaves the routes column empty for those days.
- AIS counts are a floor. A vessel with its transponder off is not counted. Where ships run dark, the shipping pillar understates the disruption.
- Source revisions propagate. When a publisher revises history, the next build uses the revision.
- It is not a forecast. A high reading describes conditions now.
When something breaks
The index is rebuilt every day at 13:40 UTC. If any source cannot be fetched and no cached copy exists, the build stops and the published reading does not change. An index that quietly drops an input is a different index. Any input older than its expected lag is listed as a warning in ttsi.json and in the build log. The Treasury has renamed its customs line twice (in 2020 and in November 2025). The build matches the word “customs” rather than a fixed name, and fails loudly if the line disappears while the Statement keeps publishing.
Licence and citation
The index and its full history are released under CC BY 4.0. Please cite it as:
TradeTurbulence Stress Index (TTSI) v3, TradeTurbulence, https://tradeturbulence.com/stress-index/
The index publishes derived scores, not the source series. FRED, Treasury and Census series are US federal works. PortWatch data is used under IMF terms. The GSCPI is published by the Federal Reserve Bank of New York, and the Economic Policy Uncertainty index by Baker, Bloom and Davis. Cite them directly if you use their figures.
Versions
- v3.0, October 2026: five pillars, fixed reference decade. This page.
- v2.0, July 2026: four components, rolling five-year percentile ranks. Archived history.
- v1: fixed thresholds and a hard-coded freight fallback. Withdrawn.
Corrections
Found an error? Tell us and we will fix it and note the correction here.
Pillars and weights
- Shipping routes 25%
Are ships getting through the world's chokepoints, or being forced around them?
- RDI Route Displacement Index (30-day) 50% of this pillar Share of traffic through the world's 28 maritime chokepoints that is on a different route than in 2019–2023. Rerouting conserves ships, so it is the share of traffic, not the total, that reveals a disruption.
- PORTWATCH Chokepoint deadweight capacity vs 2019-2023 (30-day) 50% of this pillar Of the deadweight tonnage that normally passes the major chokepoints, the share now missing from the routes that lost it — the closure measure, where the RDI is the diversion measure.
- Supply chains 20%
Are freight, deliveries and inventories under pressure?
- GSCPI Global Supply Chain Pressure Index Ocean, air and land freight costs plus delivery times, backlogs and inventories from manufacturing surveys in seven economies, with demand stripped out. In standard deviations from its own average: the December 2021 peak is 4.3.
- Energy costs 20%
Is fuel — the biggest variable cost of moving goods — expensive or unstable?
- DCOILBRENTEU Crude Oil Prices: Brent — Europe 50% of this pillar How violently fuel is repricing. Unpredictable input costs break shipping contracts and production plans faster than a high but stable price does.
- DCOILBRENTEU Crude Oil Prices: Brent — Europe, deflated by US CPI (CPIAUCSL) 50% of this pillar Brent in today's dollars. Fuel is the largest variable cost of moving goods by sea, air and road; the level matters as well as the swings, and adjusting for inflation keeps a 2026 price comparable with a 2012 one.
- Money and finance 20%
Is the dollar squeezing importers, and is trade credit available?
- DTWEXBGS Nominal Broad U.S. Dollar Index 40% of this pillar About half of world trade is invoiced in dollars. A fast-rising dollar raises import bills and tightens trade finance everywhere outside the US, so appreciation scores as stress.
- STLFSI4 St. Louis Fed Financial Stress Index 40% of this pillar A composite of 18 funding, credit and volatility measures. When it rises, the working capital and trade credit that physically move goods gets withdrawn.
- VIXCLS CBOE Volatility Index (VIX) 20% of this pillar The daily risk pulse, carrying the pillar between weekly stress-index releases. It overlaps the St. Louis index by construction, so it is weighted lower.
- Trade policy 15%
How much are tariffs actually costing importers, and how uncertain is policy?
- DTS-CUSTOMS Daily Treasury Statement customs deposits / goods imports (BOPGIMP) 60% of this pillar Customs duties actually deposited at the Treasury over the last 91 days, per dollar of goods imported over the same days — the tariff importers really pay, not the headline schedule. Moves within days of a tariff change.
- EPUTRADE Economic Policy Uncertainty Index: Categorical Index: Trade policy 40% of this pillar How much US newspaper coverage is about trade-policy uncertainty, from the Baker, Bloom and Davis Economic Policy Uncertainty project. Uncertainty delays orders and investment even before any tariff is collected.
Bands
| Range | Band | Meaning |
|---|---|---|
| 80–100 | Severe | Trade is under strain on several fronts at once. The index never reached this band in the 2010s. |
| 60–80 | Elevated | Clearly harder than an ordinary day of the 2010s — about one day in four then. At least one pillar is under real strain. |
| 40–60 | Normal | An ordinary day of the 2010s, where more than half of them sat. Friction exists, but nothing is breaking. |
| 20–40 | Settled | Easier than usual: ships are on their normal routes, costs and credit are behaving. |
| 0–20 | Calm | Unusually easy conditions for trade, seen on fewer than one day in fifty in the 2010s. |
Reproduce it yourself
Everything the index consumes is a keyless public file or API. These are the exact queries the pipeline makes — nothing is scraped, and there is no private input anywhere in the calculation. PortWatch and the Treasury API return 1,000 and 10,000 rows a page; the pipeline pages through them.
# every input the index uses
curl -s "https://fred.stlouisfed.org/graph/fredgraph.csv?id=DCOILBRENTEU" -o DCOILBRENTEU.csv
curl -s "https://fred.stlouisfed.org/graph/fredgraph.csv?id=CPIAUCSL" -o CPIAUCSL.csv
curl -s "https://fred.stlouisfed.org/graph/fredgraph.csv?id=DTWEXBGS" -o DTWEXBGS.csv
curl -s "https://fred.stlouisfed.org/graph/fredgraph.csv?id=STLFSI4" -o STLFSI4.csv
curl -s "https://fred.stlouisfed.org/graph/fredgraph.csv?id=VIXCLS" -o VIXCLS.csv
curl -s "https://fred.stlouisfed.org/graph/fredgraph.csv?id=EPUTRADE" -o EPUTRADE.csv
curl -s "https://fred.stlouisfed.org/graph/fredgraph.csv?id=BOPGIMP" -o BOPGIMP.csv
curl -s "https://www.newyorkfed.org/medialibrary/research/interactives/gscpi/downloads/gscpi_data.xlsx" -o GSCPI.xls
curl -s "https://api.fiscaldata.treasury.gov/services/api/fiscal_service/v1/accounting/dts/deposits_withdrawals_operating_cash?filter=record_date:gte:2025-10-01,transaction_type:eq:Deposits&fields=record_date,transaction_catg,transaction_today_amt&page%5Bsize%5D=10000" -o DTS-CUSTOMS.json
curl -s "https://services9.arcgis.com/weJ1QsnbMYJlCHdG/arcgis/rest/services/Daily_Chokepoints_Data/FeatureServer/0/query?where=1%3D1&outFields=date,portid,n_total,capacity&orderByFields=ObjectId%20ASC&resultRecordCount=1000&f=json" -o PORTWATCH.json
# and the output, to check your arithmetic against ours
curl -s "https://tradeturbulence.com/data/ttsi.csv" -o ttsi.csv