Every major ESG framework — MSCI, Sustainalytics, S&P Global — rates steel mills and chemical plants harshly. They emit a lot, therefore they score badly. The frameworks measure the level of emissions at a point in time. Almost none of them measure the rate of change.

That distinction matters. A steel producer whose facility NO₂ is declining by 1 µg/m³ per year is making capital investments that will compound. One with flat emissions is not. Under scope-based ESG, both may receive the same score — because steelmaking is inherently emissions-intensive regardless of trajectory.

The hypothesis: Companies whose facility NO₂ is falling fastest should outperform peers, because the satellite signal captures real capital deployment ahead of self-reported Scope 1 disclosures. We ran the analysis. Here is what happened.

The method

For each company we identified its primary production facility in the EEA E-PRTR registry (~60,000 verified EU industrial facilities, CC BY 4.0). Rather than drawing manual bounding boxes, we used each facility's verified GPS from E-PRTR as the query anchor — which also gives us access to the self-reported annual NOₓ emissions for comparison. We queried the Jiskta API using aggregate=trend, which runs OLS linear regression on monthly mean NO₂ values per grid cell and returns a slope in µg/m³/year. We used 72 months of Copernicus CAMS reanalysis (January 2018 – December 2023), then fetched 5-year total returns from Yahoo Finance for the same window (January 2018 – January 2024).

from jiskta import JisktaClient
import yfinance as yf

client = JisktaClient(api_key="sk_live_...")

# Step 1: Find the facility in E-PRTR (verified GPS, not manual bbox)
facilities = client.facilities(name="RWE")
rwe = next(f for f in facilities if f["country"] == "DE" and "Power" in f["name"])
print(f"RWE Power: {rwe['lat']:.3f}°N, {rwe['lon']:.3f}°E")
# → RWE Power: 50.833°N, 6.315°E  (Weisweiler coal plant)

# Step 2: Query CAMS trend at verified facility GPS — also returns E-PRTR divergence
df, divergence = client.query(
    facility=rwe["inspire_hash"],  # E-PRTR facility ID pins the exact location
    start="2018-01", end="2023-12",
    variables=["no2"], aggregate="trend",
    return_divergence=True,
)
slope = df["slope"].mean()
print(f"CAMS NO₂ slope: {slope:+.3f} µg/m³/yr")           # → −1.095
print(f"E-PRTR NOₓ slope: {divergence['eprtr_nox_slope']:+.0f} t/yr")  # → −642
print(f"Divergence: {divergence['direction']} (score={divergence['score']:.2f})")  # → consistent

rwe_stock = yf.Ticker("RWE.DE")
hist = rwe_stock.history(start="2018-01-01", end="2024-01-01", auto_adjust=True)
ret = (hist["Close"].iloc[-1] / hist["Close"].iloc[0] - 1) * 100
print(f"RWE total return: {ret:+.1f}%")                    # → +190.8%

Who is actually reducing NO₂ at the source?

The bars below show the mean OLS slope across all CAMS grid cells in each facility bbox. A negative slope means NO₂ is falling — the facility area is getting measurably cleaner each year. The only bar extending downward (HeidelbergMaterials) means NO₂ is rising at that facility.

NO₂ Trend at Primary Facility — January 2018 to December 2023
OLS slope across facility grid cells (µg/m³/yr). Source: Jiskta API, Copernicus CAMS reanalysis at 0.1°
+1.0 +0.5 0 −0.5 µg/m³ per year improving ↑ worsening ↓ −1.095 −1.033 −0.933 −0.422 −0.385 +0.930 ↑ worsening RWE MT BASF VW TKA HEI

Three findings jump out. First, RWE leads clearly — the coal-to-renewables transition is visible from orbit. Every closed power station removes a sustained NO₂ source and the satellite record shows this as a clean downward trend. Second, BASF ranks surprisingly high: Ludwigshafen has been reducing NO₂ meaningfully, driven by energy efficiency improvements and process changes. Third, and most striking: HeidelbergMaterials is the only company whose facility NO₂ is rising (+0.930 µg/m³/yr).

The surprising result: markets don't price this signal

If satellite emission trajectories were already priced into equities, we would expect a clear positive correlation between improvement rate and stock return. The scatter plot tells a different story.

Facility NO₂ Improvement vs. 5-Year Stock Return
Jiskta API (Copernicus CAMS trend, 2018–2023) vs. Yahoo Finance total return Jan 2018 → Jan 2024
−100% −50% 0% +100% +200% −1.0 −0.5 0 +0.5 +1.0 ← worsening     improving → (NO₂ slope µg/m³/yr) R²=0.08 RWE +191% MT BASF VW TKA −73% HEI 🚩 market says green satellite says worsening

The trend line has R² = 0.08 across all six companies — barely above noise. The hypothesis that faster-improving companies would outperform does not hold cleanly across this sample. MT and BASF both have strong improvement rates yet negative returns; TKA barely improves and is also negative. RWE is the only company where the satellite signal and the market performance align.

Key finding: Markets are not pricing emission trajectories — they are pricing sectoral narratives and macro exposure. But the mismatch creates two specific signals worth watching.

Two signals that matter

Signal 1 — HeidelbergMaterials: satellite vs. self-reported divergence

HeidelbergMaterials rebranded from HeidelbergCement in 2022 and has built a strong market narrative around green cement: CCUS investment, low-carbon products, net-zero pledges. The stock is roughly flat (+7.6% over 6 years) — not a disaster, but the market is pricing the green transition story.

The E-PRTR supports the narrative: the Leimen plant's self-reported NOₓ fell from 262 tonnes (2018) to 142 tonnes (2021) — a 46% reduction that is real and audited. But the satellite disagrees: the Leimen grid cell shows NO₂ rising at +0.930 µg/m³/yr over 2018–2023. This divergence does not mean the facility is misreporting; it may reflect rising background activity from other sources in the same 0.1° cell, increased truck traffic, or cement logistics. But it is a flag: the reported improvement at the stack level is not translating to measured atmospheric improvement at the facility level.

Signal 2 — RWE: the only company the signal works for

RWE is the cleanest case in the dataset: −1.095 µg/m³/yr improvement and +190.8% total return. The mechanism is structural and traceable: hard coal and lignite plant closures remove real emitters from the grid. This is not a narrative — it is a physical fact visible in atmospheric data, and the market has priced it correctly.

This suggests a hypothesis worth testing at scale: the satellite signal is most actionable for energy transition companies where capacity additions and closures create sharp, traceable changes in the NO₂ record. For heavy manufacturers (steel, chemicals, cement), the signal is noisier because process improvements are more incremental and macro factors dominate.

Satellite vs. self-reported: where they agree and where they don't

The E-PRTR database contains annual self-reported NOₓ emissions for each facility, submitted by operators to national regulators and then to the EEA. Comparing the E-PRTR NOₓ trend to the CAMS satellite NO₂ trend for the same facility produces a divergence score — a direct test of whether the satellite and the permit holder are telling the same story.

Company E-PRTR facility CAMS slope E-PRTR NOₓ trend Signal
RWE RWE Power AG, Weisweiler
id: 12394198829192159256
−1.095 µg/m³/yr −642 t NOₓ/yr Consistent — coal exit verified by both satellite and regulator
BASF BASF SE, Ludwigshafen
id: 12626246128710077482
−0.933 µg/m³/yr −246 t NOₓ/yr Consistent — efficiency improvements visible in both sources
VW Volkswagen AG, Wolfsburg
id: 13408216860473500983
−0.422 µg/m³/yr −176 t NOₓ/yr Consistent — BEV transition reducing plant energy consumption
ArcelorMittal Arcelormittal Belgium, Ghent
id: 1986304935103026946
−1.033 µg/m³/yr +89 t NOₓ/yr (flat) ⚠️ Divergent — satellite improving but E-PRTR flat; regional co-location effect?
Thyssenkrupp TK Steel, Bruckhausen
id: 11332985180430661771
−0.385 µg/m³/yr +5 t NOₓ/yr (flat) ⚠️ Divergent — small CAMS improvement not confirmed by E-PRTR
HeidelbergMaterials HeidelbergCement, Leimen
id: 3687905997148585988
+0.930 µg/m³/yr −43 t NOₓ/yr 🚩 Strongly divergent — E-PRTR improving but satellite says worsening

The three consistent pairs (RWE, BASF, VW) are the cleanest signal: satellite and regulator agree on direction. For analysts these are the high-confidence cases.

The ArcelorMittal and Thyssenkrupp divergences are easier to explain: the Ghent and Duisburg industrial zones contain dozens of facilities in a single 0.1° CAMS grid cell. When a nearby coke plant or power station closes, the CAMS cell improves even if ArcelorMittal or Thyssenkrupp's own reported emissions are unchanged. CAMS measures the area; E-PRTR measures the operator.

The HeidelbergMaterials Leimen case is the most striking. The Leimen cement plant self-reported NOₓ fell from 262 tonnes (2018) to 142 tonnes (2021) — a 46% reduction that matches the green cement narrative. But the CAMS grid cell centred on the plant shows NO₂ rising at +0.930 µg/m³/yr over the same period. Either the satellite is picking up background activity unrelated to the cement plant, or the self-reported reduction overstates the actual environmental improvement. This ambiguity is exactly what the divergence score is designed to flag for further investigation.

Data table

Company Facility CAMS NO₂ slope (µg/m³/yr) E-PRTR NOₓ (2018→2023) Total return 2018–2024 Reading
RWE (RWE.DE) Weisweiler, Coal/Power −1.095 11,500 → 5,864 t (−642/yr) +190.8% ✅ Coal exit visible from space — signal works
ArcelorMittal (MT) Belgium/Ghent, Steel −1.033 5,120 → 5,170 t (flat) −11.9% ⚠️ CAMS improving; E-PRTR flat — nearby sources explain CAMS gain
BASF (BAS.DE) Ludwigshafen, Chemicals −0.933 4,170 → 2,827 t (−246/yr) −25.3% ⚠️ Facility improving; energy crisis hit earnings first
Volkswagen (VOW3.DE) Wolfsburg, Automotive −0.422 1,640 → 713 t (−176/yr) −0.3% 🟡 Both sources agree on improvement; BEV transition costs drag stock
Thyssenkrupp (TKA.DE) Bruckhausen, Steel −0.385 516 → 546 t (flat) −72.8% ❌ Barely improving on either metric; structural issues dominate
HeidelbergMaterials (HEI.DE) Leimen, Cement +0.930 262 → 142 t (−43/yr) +7.6% 🚩 E-PRTR says improving; satellite says worsening — divergence flag

CAMS slopes from Jiskta API (aggregate=trend, Copernicus CAMS 0.1°, 72 months 2018–2023). E-PRTR NOₓ from EEA E-PRTR registry (verified facility GPS, annual self-reported emissions, CC BY 4.0). Stock returns from Yahoo Finance, Jan 2018 → Jan 2024, adjusted close, total return.

Why this matters for ESG analysis

The low R² is not a failure — it is the finding. Markets currently price sectoral narratives (green cement, EV transition) rather than satellite-verifiable emission trajectories. This creates two opportunities:

  • Short the narrative divergence: When a company markets itself as a green transition leader but facility NO₂ is flat or rising, that divergence tends to resolve — either through operational improvement (stock re-rates up) or through narrative correction (stock re-rates down).
  • Front-run the disclosure lag: Scope 1 annual reports are published 12–18 months after the year ends. Satellite NO₂ trends are available monthly. For companies where facility-level emission changes drive fundamental valuation (primarily utilities and energy transition plays), the satellite signal leads the disclosure by over a year.

Replicate this analysis

The complete notebook — including facility lookup via the E-PRTR registry, CAMS trend queries using verified facility GPS, and the divergence analysis — is in the jiskta-examples repository (notebooks/09_esg_satellite_validation.ipynb). All numbers in this post were generated by running that notebook against the live Jiskta API and the EEA E-PRTR dataset.

Adding more companies is straightforward: use client.facilities(name="...") to find the E-PRTR facility, then call client.query(facility=id, ..., return_divergence=True). Each company requires 6 API credits for a 6-year trend (one credit per year per facility). At Starter pricing, analysing a 50-company industrial portfolio costs under €0.10.

Run this on your portfolio

Query facility-level NO₂ trends for any European industrial company, back to 2013. Sign up for a free API key and the first 500 credits are on us.

Get API Key →