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.
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.
| Column | Type | Description |
|---|---|---|
| index_month | date · not null | First-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. |
| gpr | double precision | Headline 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. |
| gprt | double precision | Geopolitical 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. |
| gpra | double precision | Geopolitical 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. |
| gprh | double precision | Historical 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. |
| gprht | double precision | Historical Geopolitical Threats sub-index (source `GPRHT`) — the threat constituent of the historical (3-newspaper) index gprh. |
| gprha | double precision | Historical Geopolitical Acts sub-index (source `GPRHA`) — the realized-acts constituent of the historical (3-newspaper) index gprh. |
| share_gpr | double precision | Raw 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_gprh | double precision | Raw 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. |
| n10 | double precision | Article/search count behind the recent 10-newspaper share (source `N10`) — corpus size (number of articles) underlying share_gpr. |
| n3h | double precision | Article/search count behind the historical 3-newspaper share (source `N3H`) — corpus size (number of articles) underlying share_gprh. |
| shareh_cat_1 | double precision | Historical GPR share decomposed into sub-category 1 — war threats (source `SHAREH_CAT_1`). |
| shareh_cat_2 | double precision | Historical GPR share decomposed into sub-category 2 — peace threats (source `SHAREH_CAT_2`). |
| shareh_cat_3 | double precision | Historical GPR share decomposed into sub-category 3 — military buildups (source `SHAREH_CAT_3`). |
| shareh_cat_4 | double precision | Historical GPR share decomposed into sub-category 4 — nuclear threats (source `SHAREH_CAT_4`). |
| shareh_cat_5 | double precision | Historical GPR share decomposed into sub-category 5 — terror threats (source `SHAREH_CAT_5`). |
| shareh_cat_6 | double precision | Historical GPR share decomposed into sub-category 6 — beginning of war (source `SHAREH_CAT_6`). |
| shareh_cat_7 | double precision | Historical GPR share decomposed into sub-category 7 — escalation of war (source `SHAREH_CAT_7`). |
| shareh_cat_8 | double precision | Historical GPR share decomposed into sub-category 8 — terror acts (source `SHAREH_CAT_8`). |
| available_date | date | PUBLIC-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.