swiss-finance-data

April 13, 2026 · View on GitHub

Python package for Swiss financial data — official sources, clean API

PyPI version Tests Coverage License Python Downloads Documentation


Why swiss-finance-data?

Accessing Swiss financial data in Python is fragmented. Existing tools focus on US/global markets and provide limited support for Swiss-specific datasets.

swiss-finance-data aims to provide:

  • A unified, clean API for Swiss financial data
  • Official government data sources — no scraping
  • Extensible provider architecture
  • Long-term maintainability

Full documentation →


Scope

swiss-finance-data focuses on:

  • Official and legally reusable data sources
  • Clean abstraction over data providers
  • Stability and long-term maintainability
  • Swiss-specific financial datasets

It does not aim to replace global data providers such as yfinance, but to complement them for Swiss markets.


Features

v1.1.1 — Stable public API + MCP Server:

  • SNB Policy Rate — Current and historical Swiss National Bank policy rates
  • SARON — Monthly average and daily fixing, the CHF risk-free reference rate (replaces LIBOR)
  • CHF FX Rates — EUR, USD, GBP, JPY, CAD, AUD, SEK, NOK, DKK vs CHF
  • Swiss CPI — Consumer Price Index and YoY inflation rate (data since 1921)
  • SMI Equities — All 20 Swiss Market Index constituents, prices and returns
  • Swiss Confederation Bonds — Yield curve and historical yields, 13 maturities (1y–30y)
  • Provider Architecture — Extensible system for multiple data sources
  • Reliable — Official Swiss government data sources, no scraping
  • Robust error handling — Clear messages for invalid date ranges and future dates

MCP Server

swiss-finance-data exposes all its data as an MCP (Model Context Protocol) server, making Swiss financial data directly accessible to AI assistants.

18 tools available, covering the full API: SNB policy rate, SARON, CHF FX rates, Swiss CPI, SMI equities, and Swiss Confederation bond yields.

Compatible with: Claude Code, Cursor, and any MCP-compatible client.

See mcp/README.md for installation instructions and tool reference.


Installation

pip install swiss-finance-data

Requirements: Python 3.10+

Requires internet access — data is fetched live from official sources.


Quick Start

from swiss_finance import SNB, FX, CPI, SMI, Bonds

# SNB Policy Rate
rate = SNB.get_policy_rate()
print(f"SNB Policy Rate: {rate}%")

# SARON — CHF risk-free rate (monthly and daily)
saron = SNB.get_saron()
rf_daily = SNB.get_saron_daily() / 100 / 252  # daily risk-free rate
print(f"SARON: {saron}%")

# CHF Exchange Rates
eur_chf = FX.get_rate("EUR")
print(f"EUR/CHF: {eur_chf}")

# Swiss CPI and inflation
inflation = CPI.get_inflation_yoy()
print(f"Inflation YoY: {inflation.iloc[-1, 0]:.2f}%")

# SMI equities
prices = SMI.get_prices()           # current prices for all 20 constituents
returns = SMI.get_returns(period="1y")  # daily returns
hist = SMI.get_historical_prices(
    tickers=["NESN.SW", "ROG.SW", "NOVN.SW"],
    start="2023-01-01"
)

# Swiss Confederation bond yields
yield_10y = Bonds.get_yield("10y")
print(f"10y Confederation bond: {yield_10y:.2f}%")
curve = Bonds.get_yield_curve()                           # full yield curve (latest)
hist_bonds = Bonds.get_historical_yields(maturity="10y", start="2020-01-01")

API Documentation

SNB Policy Rate

SNB.get_policy_rate(provider='snb_official') -> float
SNB.get_historical_rates(start='YYYY-MM', end='YYYY-MM') -> pd.DataFrame
SNB.list_providers() -> list

SARON

SNB.get_saron() -> float                                        # monthly average
SNB.get_historical_saron(start='YYYY-MM', end='YYYY-MM') -> pd.DataFrame
SNB.get_saron_daily() -> float                                  # latest daily fixing
SNB.get_historical_saron_daily(start='YYYY-MM-DD', end='YYYY-MM-DD') -> pd.DataFrame

FX — CHF Exchange Rates

Supported currencies: EUR, USD, GBP, JPY, CAD, AUD, SEK, NOK, DKK

FX.get_rate(currency='EUR') -> float
FX.get_historical_rates(currency='EUR', start='YYYY-MM', end='YYYY-MM') -> pd.DataFrame
FX.list_currencies() -> list

CPI — Swiss Consumer Price Index

CPI.get_current() -> float                                      # latest index value
CPI.get_historical(start='YYYY-MM', end='YYYY-MM') -> pd.DataFrame
CPI.get_inflation_yoy(start='YYYY-MM', end='YYYY-MM') -> pd.DataFrame

SMI — Swiss Market Index Equities

SMI.get_constituents() -> dict                                  # {ticker: company_name}
SMI.get_prices() -> pd.DataFrame                                # current prices, all 20
SMI.get_historical_prices(
    tickers=['NESN.SW', 'ROG.SW'],  # optional, default: all 20
    period='1y',                     # ignored if start/end provided
    start='YYYY-MM-DD',
    end='YYYY-MM-DD'
) -> pd.DataFrame
SMI.get_returns(tickers=None, period='1y', start=None, end=None) -> pd.DataFrame

SMI constituents: NESN, ROG, NOVN, UBSG, ZURN, ABBN, SREN, GIVN, LONN, SIKA, GEBN, SLHN, SCMN, HOLN, PGHN, CFR, ALC, SDZ, STMN, VACN

Bonds — Swiss Confederation Bond Yields

Bonds.list_maturities() -> list                             # ['1y', '2y', ..., '30y']
Bonds.get_yield(maturity='10y') -> float                    # latest yield in %
Bonds.get_yield_curve() -> pd.DataFrame                     # one row, all maturities
Bonds.get_historical_yields(
    maturity='10y',          # optional, returns all maturities if omitted
    start='YYYY-MM-DD',
    end='YYYY-MM-DD'
) -> pd.DataFrame

Available maturities: 1y, 2y, 3y, 4y, 5y, 6y, 7y, 8y, 9y, 10y, 15y, 20y, 30y

Error handling

from swiss_finance import SNB, FX, CPI, SMI, SNBAPIError, DataValidationError

try:
    rate = SNB.get_policy_rate()
except SNBAPIError as e:
    print(f"Failed to fetch data: {e}")

try:
    rates = SNB.get_historical_rates(start='2030-01')
except DataValidationError as e:
    print(f"Invalid date range: {e}")

Data Sources

SourceDatasetLicense
Swiss National BankSNB Policy RateSNB Open Data terms
Swiss National BankSARON monthly avg (2009+)SNB Open Data terms
Swiss National BankSARON daily fixing (2009+)SNB Open Data terms
Swiss National BankCHF FX Rates (monthly, 1999+)SNB Open Data terms
Swiss National BankSwiss CPI (monthly, 1921+)SNB Open Data terms
Swiss National BankConfederation bond yields (monthly, 13 maturities)SNB Open Data terms
Yahoo FinanceSMI equities (via yfinance)Yahoo Finance ToS

Examples

NotebookDescription
Markowitz SMI OptimisationMean-variance portfolio optimisation on SMI constituents using SARON as risk-free rate
Swiss Multi-Asset Portfolio OptimizerEnd-to-end portfolio optimization (Markowitz, Black-Litterman, walk-forward backtest) using swiss-finance-data as data layer

Development

Setup

git clone https://github.com/EMen11/swiss-finance-data.git
cd swiss-finance-data
pip install -e .[dev]

Run tests

pytest --cov=swiss_finance tests/

API Stability

  • v0.x — API may evolve based on feedback
  • v1.0+ — Stable public API with backward compatibility guaranteed
  • Versioning follows Semantic Versioning (SemVer).

Roadmap

  • v0.1.0 — SNB policy rates
  • v0.1.1 — Improved error handling and date validation
  • v0.2.0 — SARON monthly + CHF FX rates
  • v0.3.0 — SARON daily + Swiss CPI + inflation
  • v0.4.0 — SMI equities (20 constituents, prices, returns)
  • v0.5.0 — Swiss Confederation bond yields (13 maturities, yield curve)
  • v1.0.0 — Stable public API, full documentation (CONTRIBUTING, DATA_SOURCES)
  • v1.1.1 — MCP server (18 tools), MkDocs documentation, pandas 2.x fix

Changelog

See CHANGELOG.md for full version history.


License

MIT License — see LICENSE for details.


Author

Elie Menassa