Skip to main content

Python package for Swiss financial data

Project description

swiss-finance-data

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.0.0 — Stable public API:

  • 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


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

Source Dataset License
Swiss National Bank SNB Policy Rate SNB Open Data terms
Swiss National Bank SARON monthly avg (2009+) SNB Open Data terms
Swiss National Bank SARON daily fixing (2009+) SNB Open Data terms
Swiss National Bank CHF FX Rates (monthly, 1999+) SNB Open Data terms
Swiss National Bank Swiss CPI (monthly, 1921+) SNB Open Data terms
Swiss National Bank Confederation bond yields (monthly, 13 maturities) SNB Open Data terms
Yahoo Finance SMI equities (via yfinance) Yahoo Finance ToS

Examples

Notebook Description
Markowitz SMI Optimisation Mean-variance portfolio optimisation on SMI constituents using SARON as risk-free rate

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)

Changelog

See CHANGELOG.md for full version history.


License

MIT License — see LICENSE for details.


Author

Elie Menassa

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

swiss_finance_data-1.1.0.tar.gz (25.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

swiss_finance_data-1.1.0-py3-none-any.whl (25.2 kB view details)

Uploaded Python 3

File details

Details for the file swiss_finance_data-1.1.0.tar.gz.

File metadata

  • Download URL: swiss_finance_data-1.1.0.tar.gz
  • Upload date:
  • Size: 25.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for swiss_finance_data-1.1.0.tar.gz
Algorithm Hash digest
SHA256 91ff13e9585b2a30f8c3a250558a0a04fed070f6b5f0882d7488bc3cc1d2f894
MD5 3a8f4971d9a94898909d2fed4f1aaa83
BLAKE2b-256 cabef65cf28369ce47465a47dfe3fa2d6b8e497798cf2c787b84bd1f1ffec0ce

See more details on using hashes here.

File details

Details for the file swiss_finance_data-1.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for swiss_finance_data-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3cdce53623ae2d2089e27a46d6d36a36bf70f5633e0782f5a375452adafd2630
MD5 5d52a5cd229ad42bb67535b5ca78d5bb
BLAKE2b-256 02a360a9f9fe0adcc05f32dd2ab9efec31165f2271247611ce2917817a526e0c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page