Loading research piece
Fetching primary parquet sources and computing exhibits.
Fetching primary parquet sources and computing exhibits.
The Grubel-Lloyd index (Grubel & Lloyd, 1975, Intra-Industry Trade) measures how much of a country-product flow is two-way: similar goods crossing the border in both directions, the statistical signature of intra-industry specialisation. Computed at country × HS6 and trade-weighted across 238 economies and 5,022 HS6 lines, global intra-industry trade stands at 0.423 in 2024, against 0.438 in 1995. The net 30-year change is -15 GL × 1,000 points, with a peak of 0.457 in 1999.
The weighted-average Grubel-Lloyd index pools country-product IIT shares across all 238 BACI reporters and all HS6 lines where the country has strictly positive exports and imports, weighting each observation by its two-way trade (X + M). This is the standard country-level operationalisation laid out in Grubel & Lloyd (1975), with the modern panel extension surveyed in Brülhart (1994, 'Marginal Intra-Industry Trade,' Weltwirtschaftliches Archiv 130: 600-613), and refined for vertical vs horizontal IIT by Fontagné & Freudenberg (1997, CEPII Working Paper 1997-06).
@misc{hossen_2026_figure-1,
author = {Md Deluair Hossen},
title = {Global Grubel-Lloyd index, country-HS6 trade-weighted, 1995-2024},
year = {2026},
howpublished = {TradeWeave Workbench},
url = {https://tradeweave.org},
note = {Figure: Figure 1}
}WITH cyp AS ( SELECT year, country_code, product_code, export_value AS x, import_value AS m FROM 'country_year_product/**/*.parquet' WHERE export_value > 0 AND import_value > 0 ) SELECT year, SUM((1 - ABS(x - m) / NULLIF(x + m, 0)) * (x + m)) / NULLIF(SUM(x + m), 0) AS gl FROM cyp GROUP BY year ORDER BY year;
Slicing the 2024 country-product GL pool by HS Section (21 sections of the WCO Harmonized System) exposes the structural composition of IIT. Chemicals, machinery, textiles and prepared foodstuffs tend to run higher, because production is fragmented across borders and varieties are differentiated, while primary-commodity sections sit lower because most producers are net exporters or net importers without offsetting reverse flows. This matches the horizontal-vs-vertical IIT taxonomy of Fontagné & Freudenberg (1997) and the differentiated-products mechanism of Krugman (1980, AER) on monopolistic competition in international trade.
The pair-level Grubel-Lloyd applied to bilateral gross flows isolates the trade relationships that are most two-way. By construction this is an aggregate (not HS6) statistic computed on bilateral totals: GL_ij = 1 - |X_ij - X_ji| / (X_ij + X_ji) where X_ij is i's exports to j. Classic horizontal-IIT pairings (intra-EU DEU-FRA, USMCA CAN-USA) sit high and stable; pairs driven by unilateral comparative advantage (e.g., CHN selling to HKG or to large net-import regions) sit lower. The pattern speaks to the Helpman-Krugman (1985) monopolistic-competition trade benchmark relative to the Ricardian comparative-advantage benchmark.
| # | Pair | Two-way trade 2024 | GL 2024 |
|---|---|---|---|
| 1 | MEX-USA Mexico / USA | $728.2B | 0.651 |
| 2 | CAN-USA Canada / USA | $658.1B | 0.784 |
| 3 | CHN-USA China / USA | $603.8B | 0.514 |
| 4 | CHN-HKG China / China, Hong Kong SAR | $308.8B | 0.206 |
| 5 | CHN-JPN China / Japan | $301.1B | 0.914 |
| 6 | CHN-KOR China / Rep. of Korea | $294.2B | 0.945 |
| 7 | CHN-DEU China / Germany |
For each HS6 line in 2024 we compute global GL (weighted mean of country-level GL across the world) and plot it against the Product Complexity Index (PCI) from Hausmann, Hidalgo et al. (2014,The Atlas of Economic Complexity, Harvard CID). PCI is zero-centred and routinely negative for undifferentiated primary products, positive for complex differentiated goods. A positive correlation implies that more complex products are also more intra-industry.
Fontagné & Freudenberg (1997, CEPII WP 1997-06) distinguish horizontal IIT (differentiated varieties of similar quality, Krugman 1980 monopolistic-competition) from vertical IIT (quality-differentiated varieties along the value chain, Falvey 1981). Absent unit-value data at HS6 we use a complexity proxy: split HS6 lines at the median PCI in 2024 and compute the trade-weighted country-product GL index within each half each year. The high-PCI half (differentiated, complex) maps closer to horizontal IIT; the low-PCI half maps closer to homogeneous products with dominant Heckscher-Ohlin comparative-advantage patterns.
Figure 5 uses PCI as a complexity proxy, but the canonical Fontagné & Freudenberg (1997, CEPII WP 1997-06) test compares export and import unit values at the country×HS6 level: if the ratio UVX/UVM is within ±15% (i.e. |ln(UVX/UVM)| ≤ 0.15), the two-way flow is horizontal(similar-quality varieties, Krugman 1980); otherwise it is vertical (quality- differentiated varieties along the value chain, Falvey 1981, Journal of International Economics 11(4): 495-511). Using TradeWeave's reporter-level unit-value table (2000-2019, CEPII BACI derivation), we decompose the weighted GL index into horizontal and vertical components.
The Figures 1-6 analyses operate on BACI goods trade. The IMF BPM6 balance-of- payments standard (IMF 2013, Balance of Payments and International Investment Position Manual, 6e) splits international trade into goods (credit and debit) and services (credit and debit), enabling a like-for-like computation of country-level Grubel-Lloyd on the aggregated services account. Using IMF BoP at country frequency (2005-2024), we compute the trade-weighted cross-country GL on services credit/debit flows and compare it with the analogous goods GL from the same source. Loý & Saucier (2020, WTO ERSD-2020-06) document that services IIT is systematically higher than goods IIT; the mechanism they emphasise is the task-level fragmentation of modern services (Baldwin 2016, The Great Convergence) that mirrors the goods-trade pattern of Grossman & Rossi-Hansberg (2008).
Figures 1-7 are trade-weighted aggregates that pool the world's 238 BACI reporters and mask cross-country dispersion. For each reporter c with at least 100 HS6 cells of two-way trade in 2024 we compute the country-aggregate GLc = trade-weighted mean of cell GL across products, and bin the resulting cross-country distribution. The histogram below shows how concentrated or dispersed intra-industry trade is across reporters in a single year. Krugman (1980, AER 70(5): 950-959) predicts horizontal IIT should rise with similarity in factor endowments and market size, so the upper-tail bins should cluster on advanced manufacturing economies (intra-EU and East-Asian core) and the lower-tail bins on resource exporters and small open economies with one-sided specialisation. The country-aggregate dispersion in 2024 is the cross-section that anchors the pair-aggregate evidence in Figure 3.
@misc{hossen_2026_figure-2,
author = {Md Deluair Hossen},
title = {Grubel-Lloyd index by HS Section, 2024},
year = {2026},
howpublished = {TradeWeave Workbench},
url = {https://tradeweave.org},
note = {Figure: Figure 2}
}WITH p AS (
SELECT code, MIN(section) AS section
FROM 'products_all.parquet' WHERE revision='HS92' GROUP BY code
),
cs AS (
SELECT cyp.country_code, p.section,
SUM(cyp.export_value) AS x, SUM(cyp.import_value) AS m
FROM 'country_year_product/year=2024/*.parquet' cyp
JOIN p ON p.code = cyp.product_code
WHERE cyp.export_value > 0 AND cyp.import_value > 0
GROUP BY cyp.country_code, p.section
)
SELECT section,
SUM((1 - ABS(x - m) / NULLIF(x + m, 0)) * (x + m))
/ NULLIF(SUM(x + m), 0) AS gl
FROM cs GROUP BY section ORDER BY gl DESC;@misc{hossen_2026_figure-3,
author = {Md Deluair Hossen},
title = {Top-6 pairs by 2024 two-way trade: Grubel-Lloyd over 1995-2024},
year = {2026},
howpublished = {TradeWeave Workbench},
url = {https://tradeweave.org},
note = {Figure: Figure 3}
}WITH ctry AS (
SELECT iso3, MIN(code) AS code FROM 'countries.parquet' GROUP BY iso3
),
pair AS (
SELECT year,
LEAST(exporter_code, importer_code) AS a,
GREATEST(exporter_code, importer_code) AS b,
SUM(CASE WHEN exporter_code < importer_code THEN total_value ELSE 0 END) AS v_ab,
SUM(CASE WHEN exporter_code > importer_code THEN total_value ELSE 0 END) AS v_ba
FROM 'bilateral_year/**/*.parquet'
GROUP BY year, LEAST(exporter_code, importer_code), GREATEST(exporter_code, importer_code)
)
SELECT p.year, ca.iso3 AS iso_a, cb.iso3 AS iso_b,
1 - ABS(p.v_ab - p.v_ba) / NULLIF(p.v_ab + p.v_ba, 0) AS gl
FROM pair p
JOIN ctry ca ON ca.code = p.a
JOIN ctry cb ON cb.code = p.b
WHERE p.v_ab > 0 AND p.v_ba > 0
ORDER BY p.year, ca.iso3, cb.iso3;| $253.0B |
| 0.731 |
| 8 | CHN-VNM China / Viet Nam | $252.8B | 0.744 |
| 9 | DEU-USA Germany / USA | $246.9B | 0.733 |
| 10 | CHN-RUS China / Russian Federation | $243.4B | 0.935 |
@misc{hossen_2026_figure-4,
author = {Md Deluair Hossen},
title = {Grubel-Lloyd index vs Product Complexity Index, HS6 in 2024},
year = {2026},
howpublished = {TradeWeave Workbench},
url = {https://tradeweave.org},
note = {Figure: Figure 4}
}WITH cyp AS (
SELECT country_code, product_code, export_value AS x, import_value AS m
FROM 'country_year_product/year=2024/*.parquet'
WHERE export_value > 0 AND import_value > 0
),
gl_hs6 AS (
SELECT product_code,
SUM((1 - ABS(x - m) / NULLIF(x + m, 0)) * (x + m))
/ NULLIF(SUM(x + m), 0) AS gl,
SUM(x + m) * 1000.0 AS trade_usd
FROM cyp GROUP BY product_code
)
SELECT g.product_code, g.gl, p.pci, g.trade_usd
FROM gl_hs6 g
JOIN 'pci_rankings.parquet' p
ON p.product_code = g.product_code AND p.year = 2024;@misc{hossen_2026_figure-5,
author = {Md Deluair Hossen},
title = {Trade-weighted GL index by HS6 complexity half, 1995-2024},
year = {2026},
howpublished = {TradeWeave Workbench},
url = {https://tradeweave.org},
note = {Figure: Figure 5}
}WITH split AS (
SELECT product_code, NTILE(2) OVER (ORDER BY pci) AS half
FROM 'pci_rankings.parquet' WHERE year = 2024
),
cyp AS (
SELECT year, product_code, export_value AS x, import_value AS m
FROM 'country_year_product/**/*.parquet'
WHERE export_value > 0 AND import_value > 0
)
SELECT year,
SUM(CASE WHEN half=2 THEN (1 - ABS(x-m)/NULLIF(x+m,0))*(x+m) ELSE 0 END)
/ NULLIF(SUM(CASE WHEN half=2 THEN (x+m) ELSE 0 END), 0) AS hi_gl,
SUM(CASE WHEN half=1 THEN (1 - ABS(x-m)/NULLIF(x+m,0))*(x+m) ELSE 0 END)
/ NULLIF(SUM(CASE WHEN half=1 THEN (x+m) ELSE 0 END), 0) AS lo_gl
FROM cyp c JOIN split s ON s.product_code = c.product_code
GROUP BY year ORDER BY year;@misc{hossen_2026_figure-6,
author = {Md Deluair Hossen},
title = {Horizontal vs vertical IIT from unit-value overlap, 2000-2019},
year = {2026},
howpublished = {TradeWeave Workbench},
url = {https://tradeweave.org},
note = {Figure: Figure 6}
}WITH uv AS (
SELECT year, reporter, product_code,
median_export_uv AS uvx, median_import_uv AS uvm
FROM 'unit_values/**/*.parquet'
WHERE median_export_uv > 0 AND median_import_uv > 0
),
ctry AS (SELECT iso3, MIN(code) AS code FROM 'countries.parquet' GROUP BY iso3),
cyp AS (
SELECT year, country_code, product_code, export_value AS x, import_value AS m
FROM 'country_year_product/**/*.parquet'
WHERE export_value > 0 AND import_value > 0
),
joined AS (
SELECT c.year, c.x, c.m,
CASE WHEN ABS(LN(u.uvx / u.uvm)) <= 0.15 THEN 'H' ELSE 'V' END AS grp
FROM cyp c
JOIN ctry ct ON ct.code = c.country_code
JOIN uv u ON u.year = c.year AND u.reporter = ct.iso3 AND u.product_code = c.product_code
)
SELECT year,
SUM(CASE WHEN grp='H' THEN (1-ABS(x-m)/NULLIF(x+m,0))*(x+m) ELSE 0 END)
/ NULLIF(SUM(CASE WHEN grp='H' THEN (x+m) ELSE 0 END), 0) AS h_gl,
SUM(CASE WHEN grp='V' THEN (1-ABS(x-m)/NULLIF(x+m,0))*(x+m) ELSE 0 END)
/ NULLIF(SUM(CASE WHEN grp='V' THEN (x+m) ELSE 0 END), 0) AS v_gl
FROM joined GROUP BY year ORDER BY year;@misc{hossen_2026_figure-7,
author = {Md Deluair Hossen},
title = {Services Grubel-Lloyd vs goods Grubel-Lloyd, country-aggregate, IMF BPM6},
year = {2026},
howpublished = {TradeWeave Workbench},
url = {https://tradeweave.org},
note = {Figure: Figure 7}
}WITH bop AS (
SELECT iso3, year, indicator, value
FROM 'imf/bop.parquet'
WHERE indicator IN ('Services, Credit/Revenue','Services, Debit/Expenditure',
'Goods, Credit/Revenue','Goods, Debit/Expenditure')
AND value > 0
),
wide AS (
SELECT iso3, year,
MAX(CASE WHEN indicator='Services, Credit/Revenue' THEN value END) AS sx,
MAX(CASE WHEN indicator='Services, Debit/Expenditure' THEN value END) AS sm,
MAX(CASE WHEN indicator='Goods, Credit/Revenue' THEN value END) AS gx,
MAX(CASE WHEN indicator='Goods, Debit/Expenditure' THEN value END) AS gm
FROM bop GROUP BY iso3, year
)
SELECT year,
SUM((1-ABS(sx-sm)/NULLIF(sx+sm,0))*(sx+sm))/NULLIF(SUM(sx+sm),0) AS svc_gl,
SUM((1-ABS(gx-gm)/NULLIF(gx+gm,0))*(gx+gm))/NULLIF(SUM(gx+gm),0) AS gds_gl
FROM wide WHERE sx>0 AND sm>0 AND gx>0 AND gm>0
GROUP BY year ORDER BY year;@misc{hossen_2026_figure-8,
author = {Md Deluair Hossen},
title = {Distribution of country-aggregate Grubel-Lloyd index across BACI reporters, 2024},
year = {2026},
howpublished = {TradeWeave Workbench},
url = {https://tradeweave.org},
note = {Figure: Figure 8}
}WITH cyp AS ( SELECT country_code, product_code, export_value AS x, import_value AS m FROM 'country_year_product/year=2024/*.parquet' WHERE export_value > 0 AND import_value > 0 ) SELECT country_code, SUM((1 - ABS(x-m)/NULLIF(x+m,0)) * (x+m)) / NULLIF(SUM(x+m),0) AS gl, COUNT(*) AS n_cells FROM cyp GROUP BY country_code HAVING COUNT(*) >= 100;