Danial Sanahurskyj

War–Peace Index

A daily measure of whether global news coverage of the Russia–Ukraine conflict is leaning toward escalation or de-escalation, and how loud that coverage is. Built from the GDELT news archive, 1 January 2018 to the latest day.

Measure
Smoothing
Range

Validation dates

The index should move the right way on days with an unambiguous story. Lettered markers on the chart match this table. Values are the raw daily readings.

DateEventPeaceWarDirectionSigned int. ‰

Three measures, one identity

Each day GDELT reports how many monitored articles match a peace query, how many match a war query, and how many articles it monitored in total. The index splits that into how much of the news is about the conflict and which way it leans.

Salience

(peace + war) / total

Share of all monitored news that is classified conflict coverage. Peaked at 19.1% on 27 Feb 2022.

Direction

(peace − war) / (peace + war)

Tone of conflict coverage, bounded between −1 (all war) and +1 (all peace). Unreliable on thin days, so it is blanked when fewer than 50 articles match.

Signed intensity

(peace − war) / total

Salience × direction. Net peace-minus-war articles per 1,000 monitored articles. The main series for regressions; its daily change is the news shock.

Methodology

Every query requires both a Ukraine term and a Russia term, which keeps out stories that only mention one side, such as the Flight 752 shoot-down in Iran on 10 January 2020.

(Ukraine OR Kyiv) (Russia OR Russian) (<peace terms>) (Ukraine OR Kyiv) (Russia OR Russian) (<war terms>)
Peace terms
ceasefire"peace talks""peace deal"trucearmisticenegotiations
War terms
invasionoffensiveshellingairstrikebombardmentmobilizationescalation
  • Source. GDELT DOC 2.0 API, timelinevolraw mode, unsmoothed. Article counts and the total-monitored normalizer are read by series label.
  • Dictionaries are deliberately narrow. Broad words like "summit", "diplomacy", "missile" and "assault" were excluded because they appear in routine coverage that does not signal a change in the conflict.
  • Calendar. Every day from 2018-01-01 is a row. GDELT returned no data on 23 days; those rows are blank, and the daily change on the following day is blank too, so no multi-day move is reported as a one-day shock.
  • Double counting. An article matching both dictionaries counts in both buckets. This inflates salience slightly but cancels out of signed intensity.
  • Low volume. 10 days had fewer than 50 matched articles. Direction is hidden on those days in the chart; signed intensity is kept because the total-news denominator already shrinks them toward zero.

Data

The full daily series as CSV, one row per calendar day. Updated automatically every night with the previous day's data.

Download CSV
peace, war
Matched article counts
total_news
GDELT total monitored articles
salience
(peace + war) / total_news
direction
(peace − war) / (peace + war)
signed_intensity
(peace − war) / total_news
d_signed_intensity
One-day change; blank after a missing day
low_volume
1 if peace + war < 50
Suggested citation
Sanahurskyj, D. (2026). War–Peace Index: a daily GDELT-based measure of Russia–Ukraine escalation and de-escalation news [Data set], retrieved .

Licensed under CC BY 4.0: free to use with attribution. Underlying article counts come from the GDELT Project. The index is used in a forthcoming paper on Ukrainian GDP warrants and geopolitical risk.