Obscura

GPR Index Monthly

The monthly Geopolitical Risk index (Caldara and Iacoviello), with deeper history than the daily version.

gpr_index_monthly — the dataset name to pass to the Obscura API.

Category Government Columns 20 Refresh Daily Point-in-time available_date

What one row means

Caldara & Iacoviello Geopolitical Risk (GPR) index — MONTHLY headline series, one row per month from 1899-12 (the workbook's first row is `12/31/1899`, normalised to 1899-12-01 — the series does NOT start in 1900, which is only the base of the authors' 1900-2019 normalisation window). Sourced from matteoiacoviello.com's `data_gpr_export.xls` and fully restated on each release (idempotent upsert on `index_month`). `index_month` is normalised to the first of the month from the source `month` column. The recent + historical headline indices, their threat/act splits, the raw article shares/counts, and the 8-category historical share decomposition are stored; the per-country `GPRC_*`/`GPRHC_*` columns are deferred to a future child table.

One row per index_month — one row per calendar month since 1899-12 (production min(index_month) = 1899-12-01, from the source's `12/31/1899` first row), upsert-restated in place on every vendor republish.

Point-in-time availability

Every Obscura dataset carries available_date: the calendar day the publisher made the row available, day-of, with no session rounding. It is the one column a backtest filters on, and it means the same thing on every dataset in the catalog.

For gpr_index_monthly: published: available_date = index_month + 31 days (release_calendar: the monthly GPR headline is published early the following month).

Refresh cadence

Obscura refreshes gpr_index_monthly daily — the most frequent scheduled job that re-collects or re-exports it. This is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when a row became public is recorded per row in available_date.

Schema — 20 columns

The full public column list for gpr_index_monthly, with the meaning of every field. The same schema is served unauthenticated at https://api.obscura.trade/v1/catalog/gpr_index_monthly.

ColumnTypeDescription
index_monthdate · not nullFirst-of-month period date derived from the source `month` column (mixed month-start/month-end conventions in the raw file are normalised by first_of_month()). Primary key and the OnConflict upsert target: a republish of the source file overwrites the row for the same month in place rather than adding a new version. This is the natural/event period column, not the public-availability date.
gprdouble precisionHeadline monthly geopolitical risk index (source `GPR`), Caldara & Iacoviello's news-based measure normalized so the 1900-2019 average is 100. NULL for early-history months with no underlying coverage.
gprtdouble precisionGeopolitical Threats sub-index (source `GPRT`) — the constituent of gpr driven by newspaper references to threats of war, mobilization, terrorism, and diplomatic tension. One of the two additive splits of the headline index, alongside gpra.
gpradouble precisionGeopolitical Acts sub-index (source `GPRA`) — the constituent of gpr driven by newspaper references to REALIZED adverse geopolitical events (actual war outbreak, terrorist attack, military strike), as opposed to a mere threat. Pairs with gprt.
gprhdouble precisionHistorical headline GPR index (source `GPRH`), 3-newspaper methodology, normalized so the 1900-2019 average is 100. The ONLY headline series populated back to the 1899-12 floor: for months before ~1985 the recent `gpr` is NULL while this carries the actual long-history value.
gprhtdouble precisionHistorical Geopolitical Threats sub-index (source `GPRHT`) — the threat constituent of the historical (3-newspaper) index gprh.
gprhadouble precisionHistorical Geopolitical Acts sub-index (source `GPRHA`) — the realized-acts constituent of the historical (3-newspaper) index gprh.
share_gprdouble precisionRaw share (%) of newspaper articles discussing geopolitical risk (source `SHARE_GPR`, recent 10-newspaper corpus) — the un-normalised underlying measure the recent index gpr is built from.
share_gprhdouble precisionRaw share (%) of newspaper articles discussing geopolitical risk (source `SHARE_GPRH`, historical 3-newspaper corpus) — the un-normalised measure the historical index gprh is built from.
n10double precisionArticle/search count behind the recent 10-newspaper share (source `N10`) — corpus size (number of articles) underlying share_gpr.
n3hdouble precisionArticle/search count behind the historical 3-newspaper share (source `N3H`) — corpus size (number of articles) underlying share_gprh.
shareh_cat_1double precisionHistorical GPR share decomposed into sub-category 1 — war threats (source `SHAREH_CAT_1`).
shareh_cat_2double precisionHistorical GPR share decomposed into sub-category 2 — peace threats (source `SHAREH_CAT_2`).
shareh_cat_3double precisionHistorical GPR share decomposed into sub-category 3 — military buildups (source `SHAREH_CAT_3`).
shareh_cat_4double precisionHistorical GPR share decomposed into sub-category 4 — nuclear threats (source `SHAREH_CAT_4`).
shareh_cat_5double precisionHistorical GPR share decomposed into sub-category 5 — terror threats (source `SHAREH_CAT_5`).
shareh_cat_6double precisionHistorical GPR share decomposed into sub-category 6 — beginning of war (source `SHAREH_CAT_6`).
shareh_cat_7double precisionHistorical GPR share decomposed into sub-category 7 — escalation of war (source `SHAREH_CAT_7`).
shareh_cat_8double precisionHistorical GPR share decomposed into sub-category 8 — terror acts (source `SHAREH_CAT_8`).
available_datedatePUBLIC-availability date = index_month + 31 days. DB-generated (STORED), read-only; the release_calendar point-in-time column to filter/join on — the date the vendor is expected to have published this month's GPR/GPRT/GPRA values, per matteoiacoviello.com's early-following-month release cadence. NEVER the observed period itself (that is index_month).

Access gpr_index_monthly

Two delivery paths, one identifier. Both require an Obscura account and an active subscription; the catalog entry and the schema above are public.

import obscura

client = obscura.Client("obs_live_…")

df = client.query(
    dataset="gpr_index_monthly",
    start="2024-01-01",
)

Create a free account Browse all 95 datasets

Frequently asked questions

What is in the gpr_index_monthly dataset?

The monthly Geopolitical Risk index (Caldara and Iacoviello), with deeper history than the daily version. Caldara & Iacoviello Geopolitical Risk (GPR) index — MONTHLY headline series, one row per month from 1899-12 (the workbook's first row is `12/31/1899`, normalised to 1899-12-01 — the series does NOT start in 1900, which is only the base of the authors' 1900-2019 normalisation window). Sourced from matteoiacoviello.com's `data_gpr_export.xls` and fully restated on each release (idempotent upsert on `index_month`). `index_month` is normalised to the first of the month from the source `month` column. The recent + historical headline indices, their threat/act splits, the raw article shares/counts, and the 8-category historical share decomposition are stored; the per-country `GPRC_*`/`GPRHC_*` columns are deferred to a future child table.

How do I avoid look-ahead bias with gpr_index_monthly?

Filter on gpr_index_monthly.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — published: available_date = index_month + 31 days (release_calendar: the monthly GPR headline is published early the following month). A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.

In what formats can I get gpr_index_monthly?

As a Parquet bulk export (POST https://api.obscura.trade/v1/download) or as JSON from the typed query API (POST https://api.obscura.trade/v1/query), both with dataset="gpr_index_monthly". The column schema is public at https://api.obscura.trade/v1/catalog/gpr_index_monthly.

How often is gpr_index_monthly updated?

Obscura refreshes gpr_index_monthly on a daily schedule — that is the most frequent scheduled job that re-collects or re-exports the table. It is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when the publisher makes a row available is described by the availability rule above, and is recorded per row in available_date.

Related datasets

Border CrossingsMonthly inbound crossings at U.S. land ports on the Canadian and Mexican borders, split by mode (trucks, trains, persona… Congress LeaderboardWhich members of Congress have done best on the stock purchases they disclose: one dollar-weighted, one-year-forward ret… Congress TradesStock and asset trades disclosed by members of Congress and their households under the STOCK Act, parsed from House and … FEMA DisastersFederally declared disasters with type, location and dates, from FEMA. Government Contract TickersA crosswalk from federal-contract recipient names to ticker symbols, so government awards can be matched to public compa… GPR Index DailyThe daily Geopolitical Risk index of Caldara and Iacoviello, derived from newspaper coverage of geopolitical tension. H-1B ApprovalsApproved H-1B visa petitions by employer, from USCIS. LEHD J2J FlowsJob-to-job worker flows from the Census LEHD program: how workers move between employers, industries and regions.