EIOPA Risk-Free Rate
Retrieves the risk-free interest rate term structures the European Insurance and Occupational Pensions Authority (EIOPA) publishes monthly: the curves European insurers must discount their liabilities with under Solvency II. They cover the euro and the currencies of every country of the European Economic Area, plus Switzerland, the United Kingdom, Australia, Canada, China, Colombia, Hong Kong, Japan, Taiwan and the United States, for maturities of 1 to 150 years. Beyond the last liquid maturity each curve converges to the ultimate forward rate (UFR), as Solvency II prescribes.
Four curves are published: the basic spot curve (curve=”spot_no_va”), the spot curve with the volatility adjustment (curve=”spot_with_va”), and the basic curve after the interest rate shocks of the Solvency II standard formula (curve=”shock_up” and curve=”shock_down”). EIOPA ships the shocked worksheets as formulas without computed values, so they are computed here with those formulas: upwards by the relative shock per maturity and at least one percentage point, downwards by the relative shock with negative rates left unchanged. Every value is a decimal fraction (0.0358 for 3.58%), at the end of the month the release is for.
No API key is needed. EIOPA’s page links the releases from January 2023; each is a separate file, so only the months between the start and end date are downloaded, and a release is cached for a year since it does not change.
See definition: https://www.eiopa.europa.eu/tools-and-data/risk-free-interest-rate-term-structures_en
Also known as: Solvency II discount curve, EIOPA RFR, risk-free rate term structure, UFR curve.
EIOPA Risk-Free Rate in Python
Install the Finance Toolkit with:
pip install financetoolkit -U
Then call get_eiopa_risk_free_rate as shown below.
from financetoolkit import FixedIncome
fixedincome = FixedIncome(start_date='2026-07-01', end_date='2026-09-30')
curves = fixedincome.get_eiopa_risk_free_rate(countries=['Euro Area', 'United Kingdom'])
curves.loc[:, (slice(None), ['1Y', '10Y', '30Y', '60Y', '150Y'])]
Which returns:
| (‘Euro Area’, ‘1Y’) | (‘United Kingdom’, ‘1Y’) | (‘Euro Area’, ‘10Y’) | (‘United Kingdom’, ‘10Y’) | (‘Euro Area’, ‘30Y’) | |
|---|---|---|---|---|---|
| 2026-07 | 0.0283 | 0.0415 | 0.0316 | 0.0468 | 0.0337 |
| 2026-08 | 0.0292 | 0.0418 | 0.0327 | 0.0473 | 0.0345 |
| 2026-09 | 0.0327 | 0.0445 | 0.0358 | 0.0501 | 0.0351 |
Parameters
The function accepts the following parameters:
- countries (list[str] | str | None, optional): The currencies or countries to include, as EIOPA names them, e.g. ‘Euro Area’, ‘United Kingdom’ or ‘United States’. Defaults to None, which returns all of them.
- curve (str, optional): “spot_no_va”, “spot_with_va”, “shock_up” or “shock_down”. Defaults to “spot_no_va”.
- rounding (int | None, optional): The number of decimals to round the results to. Defaults to None.
- growth (bool, optional): Whether to return the growth data or the actual data. Defaults to False.
- lag (int, optional): The number of periods to lag the growth data by. Defaults to 1.
- standardize (bool, optional): Whether to standardize (Z-Score) the result. When combined with growth=True, standardizes the growth values instead of the raw values. Defaults to False.
- maturity_years (list[int] | None, optional): The maturities in years to keep, e.g. [1, 2, 5, 10, 20, 30] for the key points of the curve. Defaults to None, which keeps every maturity from 1 to 150 years.