Skip to content

markrusch/Compute-Index

Repository files navigation

eu-compute-index

EU-CRI — a daily, methodology-transparent reference price for renting AI compute in Europe. Headline series EU-CRI-H100: one NVIDIA H100 SXM 80GB GPU-hour, on-demand, 8-GPU NVLink node, delivered from an EU/EEA data centre, in USD (EUR companion at the ECB reference rate). Sub-indices: EU-sovereign providers, marketplace vs cloud, class series (A100/B200 once they clear the source gate), and EU-CRI-COMPUTE — a chain-linked composite whose class basket follows the observed market across hardware generations. Constituent weights are data-driven: recomputed on a fixed weekly schedule from a trailing observation window, capped so no single venue can set the print, and stored append-only for audit.

The credibility strategy is radical methodological transparency on a regional niche: every parameter is a visible config value, the methodology document is generated from that config, raw observations are immutable, and every published print carries a full, queryable constituent set. Design follows the IOSCO Principles for Financial Benchmarks (2013) as voluntary best practice — see GOVERNANCE.md, METHODOLOGY.md, and SOURCES.md.

EU-CRI is a research publication. It is not investment advice and is not administered as a benchmark under EU Regulation 2016/1011; it may not be used as a reference price in financial instruments.

Quickstart

python -m venv .venv
.venv/Scripts/activate            # Windows; source .venv/bin/activate on Linux
pip install -e .[dev]
python -m eucri.run migrate       # create data/eucri.db
python -m eucri.run daily         # collect today's observations + compute all series
python -m eucri.run constituents --date 2026-07-18
pytest

Commands

Command Purpose
migrate apply database migrations
daily [--date D] run collectors (idempotent per source+day), compute all series, export CSV/charts
constituents --date D [--series S] full audit table for a print (IOSCO P13/P16)
backfill --from D --to D recompute prints from stored observations (never re-collects)
weights [--date D] show (computing if due) the weight review in effect for a date
validate source-dropout sensitivity + optional check-series correlation
post regenerate the paste-ready Substack post
docs regenerate METHODOLOGY.md + METHODOLOGY.lock

Layout

  • config/ — all methodology parameters (factors.yaml), sovereign constituent list, static provider price entries with last_verified dates
  • src/eucri/ — collectors (fail-soft, 1 request/source/day, honest User-Agent), normalisation, index calculation, outputs
  • data/eucri.db — SQLite, committed; observations and prints are append-only (trigger-enforced)
  • site/ — the live dashboard (index.html), CSV history, charts, data/latest.json (constituents, weight review, and per-source weblinks for the dashboard), and api/refresh.js (Vercel-only serverless function). Regenerated daily. Deployed to GitHub Pages by .github/workflows/pages.yml on every push that touches site/.
  • config/source_links.yaml — reference weblinks for the dashboard's Sources panel and per-constituent links. Presentational only; not part of METHODOLOGY.lock.

Deploying the dashboard

site/ is a self-contained static site plus one optional serverless endpoint, so it can be hosted anywhere that serves static files. Two targets are wired up:

  • GitHub Pages (works out of the box): .github/workflows/pages.yml deploys site/ on every push. The dashboard degrades gracefully here — the "Request today's collection" button reports "live refresh isn't available on this mirror" since Pages has no serverless functions.

  • Vercel (adds live refresh): import the repo as a Vercel project with Root Directory set to site. This serves the same dashboard plus api/refresh.js, which lets a visitor trigger daily.yml on demand when today hasn't been collected yet. Requires two Vercel Environment Variables (Project Settings → Environment Variables — never committed to the repo):

    • GITHUB_DISPATCH_TOKEN — a token scoped to just this repo's Actions (read/write), e.g. a fine-grained PAT limited to markrusch/Compute-Index
    • GITHUB_REPOmarkrusch/Compute-Index

    The refresh endpoint refuses any date other than today (in UTC): these collectors report live market prices, not history, so a past date can never be honestly re-collected — see GOVERNANCE.md and STYLE.md on why a gap stays a gap.

Changing the methodology

Not casually. Any change to config/factors.yaml, config/sovereign.yaml, src/eucri/index.py, src/eucri/normalise.py, or src/eucri/weights.py fails CI unless the version is bumped, the CHANGELOG has an entry, and the lock is regenerated — and takes effect only after one publication's notice. Scheduled weight reviews execute a fixed published formula and are data updates, not methodology changes. Procedure: GOVERNANCE.md.

About

EU-CRI: a daily, methodology-transparent reference price for renting AI compute in the EU/EEA. Open source, IOSCO-aligned.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors