https://github.com/EMen11/swiss-finance-data
Python package for Swiss financial data
https://github.com/EMen11/swiss-finance-data
Last synced: 3 months ago
JSON representation
Python package for Swiss financial data
- Host: GitHub
- URL: https://github.com/EMen11/swiss-finance-data
- Owner: EMen11
- License: mit
- Created: 2026-03-03T18:40:57.000Z (5 months ago)
- Default Branch: main
- Last Pushed: 2026-03-09T10:43:30.000Z (5 months ago)
- Last Synced: 2026-03-09T11:53:48.708Z (5 months ago)
- Language: HTML
- Size: 1.53 MB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: docs/contributing.md
- License: LICENSE
Awesome Lists containing this project
- awesome-quant - swiss-finance-data - `Python` - Python package for Swiss financial data (SNB Policy Rate, SARON, CHF FX rates, CPI, SMI equities, Confederation bond yields) from official SNB sources. (Market Data & Data Sources)
README
# swiss-finance-data
> Python package for Swiss financial data — official sources, clean API
[](https://pypi.org/project/swiss-finance-data/)
[](https://github.com/EMen11/swiss-finance-data/actions)
[](https://codecov.io/gh/EMen11/swiss-finance-data)
[](LICENSE)
[](https://pypi.org/project/swiss-finance-data/)
[](https://pepy.tech/project/swiss-finance-data)
[](https://emen11.github.io/swiss-finance-data)
---
## 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 →](https://emen11.github.io/swiss-finance-data)**
---
## 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](mcp/README.md) for installation instructions and tool reference.
---
## Installation
```bash
pip install swiss-finance-data
```
**Requirements:** Python 3.10+
> Requires internet access — data is fetched live from official sources.
---
## Quick Start
```python
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
```python
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
```python
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`
```python
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
```python
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
```python
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
```python
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
```python
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](https://data.snb.ch/) | SNB Policy Rate | [SNB Open Data terms](https://www.snb.ch/en/srv/disclaimer_liability) |
| [Swiss National Bank](https://data.snb.ch/) | SARON monthly avg (2009+) | [SNB Open Data terms](https://www.snb.ch/en/srv/disclaimer_liability) |
| [Swiss National Bank](https://data.snb.ch/) | SARON daily fixing (2009+) | [SNB Open Data terms](https://www.snb.ch/en/srv/disclaimer_liability) |
| [Swiss National Bank](https://data.snb.ch/) | CHF FX Rates (monthly, 1999+) | [SNB Open Data terms](https://www.snb.ch/en/srv/disclaimer_liability) |
| [Swiss National Bank](https://data.snb.ch/) | Swiss CPI (monthly, 1921+) | [SNB Open Data terms](https://www.snb.ch/en/srv/disclaimer_liability) |
| [Swiss National Bank](https://data.snb.ch/) | Confederation bond yields (monthly, 13 maturities) | [SNB Open Data terms](https://www.snb.ch/en/srv/disclaimer_liability) |
| [Yahoo Finance](https://finance.yahoo.com/) | SMI equities (via yfinance) | Yahoo Finance ToS |
---
## Examples
| Notebook | Description |
|----------|-------------|
| [Markowitz SMI Optimisation](examples/markowitz_smi_optimization.ipynb) | Mean-variance portfolio optimisation on SMI constituents using SARON as risk-free rate |
| [Swiss Multi-Asset Portfolio Optimizer](https://github.com/EMen11/swiss-multiasset-portfolio-optimizer) | End-to-end portfolio optimization (Markowitz, Black-Litterman, walk-forward backtest) using swiss-finance-data as data layer |
---
## Development
### Setup
```bash
git clone https://github.com/EMen11/swiss-finance-data.git
cd swiss-finance-data
pip install -e .[dev]
```
### Run tests
```bash
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)](https://semver.org/).
---
## Roadmap
- [x] v0.1.0 — SNB policy rates
- [x] v0.1.1 — Improved error handling and date validation
- [x] v0.2.0 — SARON monthly + CHF FX rates
- [x] v0.3.0 — SARON daily + Swiss CPI + inflation
- [x] v0.4.0 — SMI equities (20 constituents, prices, returns)
- [x] v0.5.0 — Swiss Confederation bond yields (13 maturities, yield curve)
- [x] v1.0.0 — Stable public API, full documentation (CONTRIBUTING, DATA_SOURCES)
- [x] v1.1.1 — MCP server (18 tools), MkDocs documentation, pandas 2.x fix
---
## Changelog
See [CHANGELOG.md](CHANGELOG.md) for full version history.
---
## License
MIT License — see [LICENSE](LICENSE) for details.
---
## Author
**Elie Menassa**
- GitHub: [@EMen11](https://github.com/EMen11)
- Email: menassa.elie.dev@gmail.com