GPU Economy

updated · 220 quotes

Reproduce the Cloud GPU Price Index

Every published week of the Price Index ships with a receipt: the quotes that entered that week’s value, one row each, with the page it was read from and when. A receipt and one command give the published number back. No key, no account, no library beyond Python’s own.

The formula, in three lines

  1. Quotes. NVIDIA H100 SXM, on-demand, listed in USD, not a marketplace floor. For each provider and region, the latest read of the week, counted only if that read is within 48 hours of the week’s last scrape. That list is the receipt.
  2. Level. The median of usd_per_gpu_hour over the receipt, rounded half up to the cent. A week is published only when at least 8 providers are in it.
  3. Change. The base-100 index multiplies the previous week’s value by the geometric mean of this week’s price over last week’s, across the (provider, region) pairs present in both receipts. The first week is 100.

Check it yourself: the week of September 7, 2026 (2026-W37, provisional)

No week of our series has closed yet, so this is the running week: its receipt and the value it reproduces change with every hourly scrape until the week closes on Monday, September 14, 2026. A closed week’s receipt never changes, and once one exists this section shows it instead.

The receipt is /price-index/receipts/2026-W37.csv. Run this in any terminal with Python 3:

curl -s https://gpueconomy.com/price-index/receipts/2026-W37.csv | python3 -c "import csv, sys, statistics; from decimal import Decimal as D, ROUND_HALF_UP; r = list(csv.DictReader(sys.stdin)); m = statistics.median(D(x['usd_per_gpu_hour']) for x in r); print(m.quantize(D('0.01'), ROUND_HALF_UP), len(r), 'quotes', len({x['provider_id'] for x in r}), 'providers')"

It prints 3.97 18 quotes 16 providers. The published value for that week is $3.97 per GPU-hour, the median of 18 quotes from 16 providers (base-100 index 100.0) — the build of this page recomputed it from the same file and would have stopped on a closed week that did not match.

Receipt for the week of September 7, 2026: every quote in the value, cheapest first. Each price links to the page it was read from.
ProviderRegionUSD / GPU-hourScopeRead at
Cudo Computeno-kristiansand-1$1.79GPU only
GMI Cloud$2.00from
Jarvislabs$2.69instance
RunPodCommunity Cloud$2.69instance
Hyperstack$3.20instance
Verda$3.25instance
RunPodSecure Cloud$3.49instance
Nebius$3.85instance
Modal$3.95GPU only
Lambda$3.99instance
Together AI$3.99instance
PaperspaceGPU Droplets$4.41instance
PaperspacePaperspace$5.95instance
CoreWeave$6.16instance
Amazon Web Servicesus-east-1$6.88instance
Google Cloudus-west8$9.80GPU only
Oracle Cloud (OCI)$10.00instance
Microsoft Azureeastus$11.06instance

The base-100 link between two weeks

Given two consecutive receipts, this prints the week-over-week link (the geometric mean of the price ratios) and how many (provider, region) pairs it rests on. The index for a week is the previous week’s index times that link. It needs two closed weeks; the week names below are the first pair it will work for.

python3 -c "import csv, math, sys, urllib.request as u
def week(w): return {(x['provider_id'], x['region']): float(x['usd_per_gpu_hour']) for x in csv.DictReader(u.urlopen(u.Request('https://gpueconomy.com/price-index/receipts/' + w + '.csv', headers={'User-Agent': 'gpueconomy-reproduce/1.0'})).read().decode().splitlines())}
a, b = week(sys.argv[1]), week(sys.argv[2]); pairs = a.keys() & b.keys()
print(round(math.exp(sum(math.log(b[k] / a[k]) for k in pairs) / len(pairs)), 6), len(pairs), 'pairs')" 2026-W37 2026-W38

Every receipt

WeekISO weekVintageMedianQuotesProvidersReceipt
2026-W37provisional$3.9718162026-W37.csv

Columns: week_start, iso_week, vintage, gpu_id, provider_id, region, usd_per_gpu_hour, price_scope, source_url, scraped_at, included, included_rule. included_rule points at the panel rules. CC BY 4.0, like every file here.

What a receipt does not list yet

Quotes that were read but kept out of the value — marketplace floors, EUR listings, spot and reserved rates, and quotes not confirmed within 48 hours — are not in the files yet. Each is excluded by a rule on the methodology page. Listing them too, each with the rule that excluded it, is the next step, once those rules have stopped changing, so the files are not rewritten twice.

Data updated: