Methodology · v1.1

GGRI Methodology

Global Geopolitical Risk Index · v1.1 · supersedes v1.0

At a glance

The GGRI is a single-number daily index of global geopolitical risk, scored 0–100, delivered every weekday at 0500 EST. See a sample daily brief → for the actual format subscribers receive.

The score is the weighted sum of nine deterministic components plus a small bounded chaos term:

GGRI = round( Σᵢ Wᵢ · Cᵢ + Z, 1 )

where:

Tier mapping

TierRangeOperational meaning
LOW0–20Baseline. Background of routine geopolitics.
MODERATE21–40Elevated friction; specific theaters bear watching.
ELEVATED41–60Multiple active theaters; markets noticing.
HIGH61–80Active kinetic + sanctions cycles + market stress.
EXTREME81–100Multi-theater conflict, energy/finance dislocation, cyber escalation.

What changed in v1.1

v1.0 ran six components. v1.1 adds three and rebalances. Rationale:

Component table — v1.1 weights

ComponentWeightWhat it measures
C1Conflict0.22Active kinetic engagement; combat tempo; civilian casualties; refugee flows
C2Geopolitical Tensions0.16Diplomatic posture; alliance stress; expert-rated state-vs-state risk
C3Markets0.10VIX, sovereign CDS, currency stress, equity drawdowns (excludes energy)
C4News Tone0.13VADER-scored sentiment across major outlets; press-freedom signal
C5Social Attention0.09Reddit r/worldnews ranking; Telegram channel velocity; Wikipedia spikes
C6Cyber0.09CISA KEV adds; ransomware disclosures; nation-state campaigns
C7Sanctions & Regulatory (new)0.07OFAC/EU/UK actions; export controls; treaty withdrawals
C8Energy & Chokepoints (new)0.07WTI/Brent/LNG; Hormuz/Suez/Bab-al-Mandeb status; AIS-derived shipping disruptions
C9Civil Stability (new)0.04Protest counts (ACLED); election-window risk; coup probability; cabinet collapses
Sum1.00(assert at module load)
Chaos term±5bounded integer, CSPRNG-drawn

Why the weight shifts

Component scoring rubrics

Each component returns a 0–100 score from a small number of normalized sub-signals.

C1 — Conflict

Sub-signals: active conflict-day tally (theaters with kinetic combat in last 24h), ACLED event count delta vs. 30-day rolling average, civilian casualty reports (CrisisWatch, ISW), refugee-movement reports (UNHCR ETT).

Mapping: 0 = no active conflict; 50 = one major theater + low-intensity others; 80 = multiple major theaters + acceleration; 100 = WMD use or peer-state direct combat.

C2 — Geopolitical Tensions

Sub-signals: expert surveys (CSIS ChinaPower, AEI tracker, Just Security); diplomatic moves (treaty withdrawals, embassy closures, ambassador recalls — minus the sanctions/regulatory component, which is now C7); alliance stress (NATO/QUAD/SCO friction signals); high-stakes summits (positive signal: scheduled; negative signal: cancelled).

C3 — Markets (narrowed in v1.1)

Sub-signals: VIX level + 5-day rate of change; sovereign CDS spreads (top-20 economies, weighted); currency stress (DXY, EM-FX volatility); equity drawdowns vs. 30-day high.

C4 — News Tone

Sub-signals: VADER compound sentiment across the day's headlines per source, then per-tier weighted average; press-freedom signal (RSF index events); headline-volume concentration (high concentration on geopolitical themes = elevated).

C5 — Social Attention

Sub-signals: Reddit r/worldnews top-10 attention concentration; Wikipedia view spikes on country/conflict articles; Telegram channel velocity in war-zone-relevant channels (where reachable).

Caveat: sandbox runs from Lambda are blocked from Reddit and Telegram; on those days C5 is qualitatively assessed and flagged in the brief. The local production engine is unrestricted and produces the canonical value.

C6 — Cyber

Sub-signals: CISA KEV adds in last 24h (count + severity); ransomware disclosures with sectoral materiality (banking/critical infrastructure weighted higher); nation-state campaign reports (CYFIRMA, Mandiant); major CVE active-exploitation flags.

C7 — Sanctions & Regulatory (new)

Sub-signals: OFAC designations (last 24h, weighted by target severity); EU/UK sanctions packages; BIS export-control list adds; Federal Register executive orders with international scope; treaty withdrawals / suspensions; embargo escalations.

Mapping: 0 = quiet day; 50 = routine designations only; 80 = major package (e.g., Russia 14th-package class); 100 = sweeping multilateral action (oil cap, secondary sanctions, etc.).

C8 — Energy & Chokepoints (new)

Sub-signals: WTI / Brent / LNG (TTF, JKM) day-over-day moves; Strait-of-Hormuz transit status (incidents, escort posture); Suez / Bab-al-Mandeb / Malacca traffic flags; maritime AIS-derived disruptions (vessel redirections, port closures); pipeline status (Druzhba, BTC, Nord Stream class events); strategic commodity stress (rare earths, lithium, grain export controls).

Mapping: 0 = quiet markets, no chokepoint stress; 50 = elevated oil + minor maritime incident; 80 = chokepoint contested + structural energy shock; 100 = sustained chokepoint closure or strategic embargo.

C9 — Civil Stability (new)

Sub-signals: ACLED protest event counts (delta vs. 30-day rolling average); election-window risk (countries entering 60-day pre-election window); coup / regime-change indicators (sudden cabinet collapses, military redeployments to capitals); constitutional crises (referenda, judicial-executive standoffs).

Mapping: 0 = quiet domestic politics globally; 50 = scattered protests + 2–3 election windows; 80 = simultaneous protests in 5+ countries or a coup in progress; 100 = coordinated regional unrest or multiple state-failure events.

Source pool — 41 feeds across 4 tiers

Sources are grouped into four tiers, with a downstream weight applied to each tier when computing tone, attention, and event-count signals.

Tier 0 — Primary government (no editorial layer) — weight 1.00

OFAC Recent Actions, Federal Register, CISA KEV catalog, CISA Alerts, EU Official Journal (sanctions section).

Tier 1 — Wire / authoritative — weight 0.90

AP News (apf-topnews), AFP (when reachable), CrisisGroup CrisisWatch, ISW (Institute for the Study of War), ACLED, Bellingcat.

Tier 2 — Established media / think tanks — weight 0.70

BBC World, BBC US & Canada, BBC Africa, BBC Middle East, BBC Asia, BBC Latin America; Guardian World, Guardian US, Guardian UK; NPR World, NPR Politics, NPR National; VOA World; Yahoo News World, Yahoo News US; CBS News World; ABC News World; Al Jazeera; CSIS, AEI (China-Taiwan tracker), Just Security; Kyiv Independent, The Moscow Times, Times of Israel, South China Morning Post; CYFIRMA Weekly Intelligence.

Tier 3 — State-affiliated (always flagged) — weight 0.40

RT (Russia), TASS (Russia), Xinhua (China), PressTV (Iran).

State-affiliated sources are never excluded — Moscow's framing of Hormuz is operationally relevant — but they are always flagged in the response payload (source_class: "state_affiliated", with the affiliated state) so consumers can choose to discount.

Sources we'd like but can't include yet

Country attribution

For per-country scoring (the AtlasRisks dashboard), each headline is attributed to one or more countries via:

  1. Keyword match — ~250 country/keyword mappings covering capitals, leader names, key institutions, and common synonyms (USA: also catches Trump, White House, Pentagon, Federal Reserve, Wall Street, Silicon Valley, etc.).
  2. Region fallback — when a feed is region-specific (e.g., BBC US & Canada, Guardian UK), unmatched articles default to the feed's primary country.
  3. global_recent fallback — a per-day rolling list of the 25 most-recent global headlines is exposed so countries with no specific coverage today still show real fresh news with a "no country-specific coverage" flag.

The chaos term

A bounded integer drawn from CSPRNG (secrets.SystemRandom().randint(-5,5)) added to the deterministic score. Two purposes:

  1. Prevent pseudo-precision. A daily 0–100 index that always returns 73.5 implies a precision the underlying signal doesn't support. The chaos term keeps the index honest about its noise floor.
  2. Make the model robust to over-interpretation. A consumer who treats the score's last-decimal as meaningful is misreading the index; the chaos term is a small but real reminder that this is a direction-of-risk indicator, not a measurement.

The local production engine uses the RANDOM.org true-RNG path when reachable (atmospheric-noise true random) and falls back to OS CSPRNG otherwise. The cloud sandbox cannot reach RANDOM.org and uses CSPRNG only; the chaos_provenance field in the output JSON records which path was used.

Output schema

The daily JSON brief returns:

{
  "date": "2026-05-05",
  "version": "1.1",
  "ggri": 63.4,
  "deterministic": 62.4,
  "chaos": 1,
  "chaos_provenance": "csprng_local",   // or "random_org_atmospheric"
  "tier": "HIGH",
  "components": {
    "C1": { "score": 78, "weight": 0.22, "contribution": 17.16, "evidence": [...] },
    "C2": { "score": 70, "weight": 0.16, "contribution": 11.20, "evidence": [...] },
    "C3": { "score": 52, "weight": 0.10, "contribution": 5.20,  "evidence": [...] },
    "C4": { "score": 62, "weight": 0.13, "contribution": 8.06,  "evidence": [...] },
    "C5": { "score": 60, "weight": 0.09, "contribution": 5.40,  "evidence": [...] },
    "C6": { "score": 58, "weight": 0.09, "contribution": 5.22,  "evidence": [...] },
    "C7": { "score": 72, "weight": 0.07, "contribution": 5.04,  "evidence": [...] },
    "C8": { "score": 80, "weight": 0.07, "contribution": 5.60,  "evidence": [...] },
    "C9": { "score": 35, "weight": 0.04, "contribution": 1.40,  "evidence": [...] }
  },
  "top_drivers": ["C8", "C1", "C2"],
  "anomalies": [...],
  "by_country": { "IRN": { "score": 88, ... }, "USA": { ... }, ... },
  "global_recent": [...],
  "sources_used": [
    { "id": "ofac_recent",  "tier": 0, "weight": 1.0, "items": 3 },
    { "id": "rt",           "tier": 3, "weight": 0.4, "state_affiliated": "Russia", "items": 7 },
    ...
  ]
}

Changelog

v1.1 — 2026-05-05

v1.0 — 2026-04-24

How to read the GGRI

The GGRI is a direction-of-risk indicator, not a measurement. A 63.4 today and a 62.1 tomorrow does not mean risk fell by 1.3; the noise floor is wider than that. Read tier transitions, week-over-week trajectory, and the top-three drivers — not last-decimal moves.

Use the per-component scores and the linked evidence in evidence: [...] to investigate why the day's score is what it is. The score is a starting point for analysis, not a substitute for it.


— AtlasRisks · GGRI v1.1 · 2026-05-05