Python package for Swiss financial data
Project description
swiss-finance-data
Python package for Swiss financial data — official sources, clean API
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
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
v0.5.0 — Available now:
- 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
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 # ['2y', '3y', ..., '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 (12 maturities, yield curve)
- v1.0.0 — Stable API, full documentation
Changelog
See CHANGELOG.md for full version history.
License
MIT License — see LICENSE for details.
Author
Elie Menassa
- GitHub: @EMen11
- Email: menassa.elie.dev@gmail.com
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file swiss_finance_data-0.5.0.tar.gz.
File metadata
- Download URL: swiss_finance_data-0.5.0.tar.gz
- Upload date:
- Size: 24.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
185a8cf36432b5fff5b48bfa8f2b95748be5b9906d7c3aeb0e2f26502b3952cb
|
|
| MD5 |
2bce98c626bc1e150296ac0995ad3d48
|
|
| BLAKE2b-256 |
59e94f19bf84c231e167bff2b97773c76f7e74f1d12c1cdfcb49dde0ce33f786
|
File details
Details for the file swiss_finance_data-0.5.0-py3-none-any.whl.
File metadata
- Download URL: swiss_finance_data-0.5.0-py3-none-any.whl
- Upload date:
- Size: 24.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3ebf85db5b062ace5b7f458a279353fd75e0ec2ae47a656a6346d025ea7debce
|
|
| MD5 |
96c40cd8ce27f09342d4551a7baa2e94
|
|
| BLAKE2b-256 |
1d35a8ab1382faadf94e46984278e1ddfb4fcbd79b279214f10a497b8c5a5252
|