Skip to content

Instantly share code, notes, and snippets.

@geoand
Created February 16, 2026 09:39
Show Gist options
  • Select an option

  • Save geoand/8a58be89ee6098f19f2c5be80e7efcc8 to your computer and use it in GitHub Desktop.

Select an option

Save geoand/8a58be89ee6098f19f2c5be80e7efcc8 to your computer and use it in GitHub Desktop.
Euribor 3-Month Interest Rate Chart (1996-2026) - Python source code
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime
# Euribor 3-month data (annual averages)
data_raw = [
('1996-01-01', 5.81), ('1997-01-01', 4.39), ('1998-01-01', 3.81),
('1999-01-01', 2.95), ('2000-01-01', 4.40), ('2001-01-01', 4.26),
('2002-01-01', 3.32), ('2003-01-01', 2.33), ('2004-01-01', 2.11),
('2005-01-01', 2.19), ('2006-01-01', 3.08), ('2007-01-01', 4.28),
('2008-01-01', 4.64), ('2009-01-01', 1.22), ('2010-01-01', 0.81),
('2011-01-01', 1.39), ('2012-01-01', 0.57), ('2013-01-01', 0.22),
('2014-01-01', 0.21), ('2015-01-01', -0.02), ('2016-01-01', -0.26),
('2017-01-01', -0.33), ('2018-01-01', -0.32), ('2019-01-01', -0.36),
('2020-01-01', -0.43), ('2021-01-01', -0.55), ('2022-01-01', 0.35),
('2023-01-01', 3.43), ('2024-01-01', 3.50), ('2025-01-01', 2.25),
('2026-01-01', 2.05)
]
dates = [datetime.strptime(d, '%Y-%m-%d') for d, r in data_raw]
rates = [r for d, r in data_raw]
fig, ax = plt.subplots(figsize=(14, 7))
# Fill areas for positive and negative rates
ax.fill_between(dates, rates, 0, where=[r >= 0 for r in rates], alpha=0.3, color='green', label='Positive rates')
ax.fill_between(dates, rates, 0, where=[r < 0 for r in rates], alpha=0.3, color='red', label='Negative rates')
# Main line
ax.plot(dates, rates, 'b-', linewidth=2, marker='o', markersize=4)
# Zero line
ax.axhline(y=0, color='black', linestyle='-', linewidth=0.5)
# Annotations for key events
ax.annotate('Euro Launch', xy=(datetime(1999,1,1), 2.95), xytext=(datetime(1999,6,1), 5),
arrowprops=dict(arrowstyle='->', color='gray'), fontsize=9)
ax.annotate('Financial Crisis', xy=(datetime(2008,1,1), 4.64), xytext=(datetime(2006,1,1), 6),
arrowprops=dict(arrowstyle='->', color='gray'), fontsize=9)
ax.annotate('First Negative Rates', xy=(datetime(2015,1,1), -0.02), xytext=(datetime(2012,6,1), -1.5),
arrowprops=dict(arrowstyle='->', color='gray'), fontsize=9)
ax.annotate('All-time Low -0.58%', xy=(datetime(2021,1,1), -0.55), xytext=(datetime(2018,6,1), -1.8),
arrowprops=dict(arrowstyle='->', color='gray'), fontsize=9)
ax.annotate('Post-COVID Spike', xy=(datetime(2023,1,1), 3.43), xytext=(datetime(2023,6,1), 5.5),
arrowprops=dict(arrowstyle='->', color='gray'), fontsize=9)
ax.set_xlabel('Year', fontsize=12)
ax.set_ylabel('Euribor 3-Month Rate (%)', fontsize=12)
ax.set_title('Euribor 3-Month Interest Rate (1996-2026)', fontsize=14, fontweight='bold')
ax.grid(True, alpha=0.3)
ax.legend(loc='upper right')
ax.xaxis.set_major_locator(mdates.YearLocator(5))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y'))
ax.set_xlim(datetime(1995,6,1), datetime(2026,6,1))
ax.set_ylim(-2, 7)
plt.tight_layout()
plt.savefig('euribor_30_years.png', dpi=150, bbox_inches='tight')
print('Chart saved to euribor_30_years.png')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment