Central-bank rate changes (G20)¶
© 2026 Jim Domeij
Each month, we count how many G20 central banks raised their policy rate (hikes) and how many lowered it (cuts), as a simple proxy for the breadth of global tightening vs easing.
The top panel shows hikes (up) and cuts (down). The bottom panel shows the net balance on the same scale.
Note: This is a count of central banks changing rates, not the magnitude of the rate moves.
Out[1]:
In [2]:
Copied!
from polars_bloomberg import BQuery
query = """
let(
#ref_date = policy_rate().period_reference_date;
#policy_rate_changes = diff(dropNA(policy_rate(), remove_id=True));
#count_cuts = sum(group(if(#policy_rate_changes < 0, 1, 0), by=#ref_date));
#count_hikes = sum(group(if(#policy_rate_changes > 0, 1, 0), by=#ref_date));
#net_hike_count = #count_hikes - #count_cuts;
)
get(#count_cuts, #count_hikes, #net_hike_count)
for(countries('G20'))
with(pr=range(2016M12, 2025M12), pt=M, act_est_data=A, fill=PREV)
preferences(dropCols=["ORIG_IDS"])
"""
with BQuery() as bq:
df = bq.bql(query).combine()
df.head(3)
from polars_bloomberg import BQuery
query = """
let(
#ref_date = policy_rate().period_reference_date;
#policy_rate_changes = diff(dropNA(policy_rate(), remove_id=True));
#count_cuts = sum(group(if(#policy_rate_changes < 0, 1, 0), by=#ref_date));
#count_hikes = sum(group(if(#policy_rate_changes > 0, 1, 0), by=#ref_date));
#net_hike_count = #count_hikes - #count_cuts;
)
get(#count_cuts, #count_hikes, #net_hike_count)
for(countries('G20'))
with(pr=range(2016M12, 2025M12), pt=M, act_est_data=A, fill=PREV)
preferences(dropCols=["ORIG_IDS"])
"""
with BQuery() as bq:
df = bq.bql(query).combine()
df.head(3)
Out[2]:
shape: (3, 5)
| ID | #count_cuts | #REF_DATE | #count_hikes | #net_hike_count |
|---|---|---|---|---|
| str | f64 | date | f64 | f64 |
| "2016-12-31T00-00-00Z" | 0.0 | 2016-12-31 | 0.0 | 0.0 |
| "2017-01-31T00-00-00Z" | 1.0 | 2017-01-31 | 0.0 | -1.0 |
| "2017-02-28T00-00-00Z" | 1.0 | 2017-02-28 | 1.0 | 0.0 |