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
- 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.
- Level. The median of
usd_per_gpu_hourover the receipt, rounded half up to the cent. A week is published only when at least 8 providers are in it. - 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.
| Provider | Region | USD / GPU-hour | Scope | Read at |
|---|---|---|---|---|
| Cudo Compute | no-kristiansand-1 | $1.79 | GPU only | |
| GMI Cloud | — | $2.00 | from | |
| Jarvislabs | — | $2.69 | instance | |
| RunPod | Community Cloud | $2.69 | instance | |
| Hyperstack | — | $3.20 | instance | |
| Verda | — | $3.25 | instance | |
| RunPod | Secure Cloud | $3.49 | instance | |
| Nebius | — | $3.85 | instance | |
| Modal | — | $3.95 | GPU only | |
| Lambda | — | $3.99 | instance | |
| Together AI | — | $3.99 | instance | |
| Paperspace | GPU Droplets | $4.41 | instance | |
| Paperspace | Paperspace | $5.95 | instance | |
| CoreWeave | — | $6.16 | instance | |
| Amazon Web Services | us-east-1 | $6.88 | instance | |
| Google Cloud | us-west8 | $9.80 | GPU only | |
| Oracle Cloud (OCI) | — | $10.00 | instance | |
| Microsoft Azure | eastus | $11.06 | instance |
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-W38Every receipt
| Week | ISO week | Vintage | Median | Quotes | Providers | Receipt |
|---|---|---|---|---|---|---|
| 2026-W37 | provisional | $3.97 | 18 | 16 | 2026-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: