{"id":48595272,"url":"https://github.com/EMen11/swiss-finance-data","last_synced_at":"2026-04-24T14:01:07.492Z","repository":{"id":343171809,"uuid":"1171912245","full_name":"EMen11/swiss-finance-data","owner":"EMen11","description":"Python package for Swiss financial data","archived":false,"fork":false,"pushed_at":"2026-03-09T10:43:30.000Z","size":1600,"stargazers_count":0,"open_issues_count":5,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-09T11:53:48.708Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/EMen11.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"docs/contributing.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-03T18:40:57.000Z","updated_at":"2026-03-09T10:43:08.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/EMen11/swiss-finance-data","commit_stats":null,"previous_names":["emen11/swiss-finance-data"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/EMen11/swiss-finance-data","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EMen11%2Fswiss-finance-data","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EMen11%2Fswiss-finance-data/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EMen11%2Fswiss-finance-data/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EMen11%2Fswiss-finance-data/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EMen11","download_url":"https://codeload.github.com/EMen11/swiss-finance-data/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EMen11%2Fswiss-finance-data/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32226408,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-24T13:21:15.438Z","status":"ssl_error","status_checked_at":"2026-04-24T13:21:15.005Z","response_time":64,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-08T21:00:31.108Z","updated_at":"2026-04-24T14:01:07.485Z","avatar_url":"https://github.com/EMen11.png","language":"HTML","funding_links":[],"categories":["Market Data \u0026 Data Sources"],"sub_categories":[],"readme":"# swiss-finance-data\n\n\u003e Python package for Swiss financial data — official sources, clean API\n\n[![PyPI version](https://img.shields.io/pypi/v/swiss-finance-data.svg)](https://pypi.org/project/swiss-finance-data/)\n[![Tests](https://github.com/EMen11/swiss-finance-data/actions/workflows/test.yml/badge.svg)](https://github.com/EMen11/swiss-finance-data/actions)\n[![Coverage](https://img.shields.io/codecov/c/github/EMen11/swiss-finance-data)](https://codecov.io/gh/EMen11/swiss-finance-data)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Python](https://img.shields.io/pypi/pyversions/swiss-finance-data.svg)](https://pypi.org/project/swiss-finance-data/)\n[![Downloads](https://static.pepy.tech/badge/swiss-finance-data)](https://pepy.tech/project/swiss-finance-data)\n[![Documentation](https://img.shields.io/badge/docs-online-blue.svg)](https://emen11.github.io/swiss-finance-data)\n\n---\n\n## Why swiss-finance-data?\n\nAccessing Swiss financial data in Python is fragmented. Existing tools focus on US/global markets and provide limited support for Swiss-specific datasets.\n\nswiss-finance-data aims to provide:\n- A unified, clean API for Swiss financial data\n- Official government data sources — no scraping\n- Extensible provider architecture\n- Long-term maintainability\n\n**[Full documentation →](https://emen11.github.io/swiss-finance-data)**\n\n---\n\n## Scope\n\nswiss-finance-data focuses on:\n\n- Official and legally reusable data sources\n- Clean abstraction over data providers\n- Stability and long-term maintainability\n- Swiss-specific financial datasets\n\nIt does not aim to replace global data providers such as yfinance, but to complement them for Swiss markets.\n\n---\n\n## Features\n\n**v1.1.1 — Stable public API + MCP Server:**\n-  **SNB Policy Rate** — Current and historical Swiss National Bank policy rates\n-  **SARON** — Monthly average and daily fixing, the CHF risk-free reference rate (replaces LIBOR)\n-  **CHF FX Rates** — EUR, USD, GBP, JPY, CAD, AUD, SEK, NOK, DKK vs CHF\n- **Swiss CPI** — Consumer Price Index and YoY inflation rate (data since 1921)\n- **SMI Equities** — All 20 Swiss Market Index constituents, prices and returns\n- **Swiss Confederation Bonds** — Yield curve and historical yields, 13 maturities (1y–30y)\n-  **Provider Architecture** — Extensible system for multiple data sources\n-  **Reliable** — Official Swiss government data sources, no scraping\n-  **Robust error handling** — Clear messages for invalid date ranges and future dates\n\n---\n\n## MCP Server\n\nswiss-finance-data exposes all its data as an **MCP (Model Context Protocol) server**, making Swiss financial data directly accessible to AI assistants.\n\n**18 tools available**, covering the full API: SNB policy rate, SARON, CHF FX rates, Swiss CPI, SMI equities, and Swiss Confederation bond yields.\n\n**Compatible with:** Claude Code, Cursor, and any MCP-compatible client.\n\nSee [mcp/README.md](mcp/README.md) for installation instructions and tool reference.\n\n---\n\n## Installation\n\n```bash\npip install swiss-finance-data\n```\n\n**Requirements:** Python 3.10+\n\n\u003e Requires internet access — data is fetched live from official sources.\n\n---\n\n## Quick Start\n\n```python\nfrom swiss_finance import SNB, FX, CPI, SMI, Bonds\n\n# SNB Policy Rate\nrate = SNB.get_policy_rate()\nprint(f\"SNB Policy Rate: {rate}%\")\n\n# SARON — CHF risk-free rate (monthly and daily)\nsaron = SNB.get_saron()\nrf_daily = SNB.get_saron_daily() / 100 / 252  # daily risk-free rate\nprint(f\"SARON: {saron}%\")\n\n# CHF Exchange Rates\neur_chf = FX.get_rate(\"EUR\")\nprint(f\"EUR/CHF: {eur_chf}\")\n\n# Swiss CPI and inflation\ninflation = CPI.get_inflation_yoy()\nprint(f\"Inflation YoY: {inflation.iloc[-1, 0]:.2f}%\")\n\n# SMI equities\nprices = SMI.get_prices()           # current prices for all 20 constituents\nreturns = SMI.get_returns(period=\"1y\")  # daily returns\nhist = SMI.get_historical_prices(\n    tickers=[\"NESN.SW\", \"ROG.SW\", \"NOVN.SW\"],\n    start=\"2023-01-01\"\n)\n\n# Swiss Confederation bond yields\nyield_10y = Bonds.get_yield(\"10y\")\nprint(f\"10y Confederation bond: {yield_10y:.2f}%\")\ncurve = Bonds.get_yield_curve()                           # full yield curve (latest)\nhist_bonds = Bonds.get_historical_yields(maturity=\"10y\", start=\"2020-01-01\")\n```\n\n---\n\n## API Documentation\n\n### SNB Policy Rate\n\n```python\nSNB.get_policy_rate(provider='snb_official') -\u003e float\nSNB.get_historical_rates(start='YYYY-MM', end='YYYY-MM') -\u003e pd.DataFrame\nSNB.list_providers() -\u003e list\n```\n\n### SARON\n\n```python\nSNB.get_saron() -\u003e float                                        # monthly average\nSNB.get_historical_saron(start='YYYY-MM', end='YYYY-MM') -\u003e pd.DataFrame\nSNB.get_saron_daily() -\u003e float                                  # latest daily fixing\nSNB.get_historical_saron_daily(start='YYYY-MM-DD', end='YYYY-MM-DD') -\u003e pd.DataFrame\n```\n\n### FX — CHF Exchange Rates\n\nSupported currencies: `EUR`, `USD`, `GBP`, `JPY`, `CAD`, `AUD`, `SEK`, `NOK`, `DKK`\n\n```python\nFX.get_rate(currency='EUR') -\u003e float\nFX.get_historical_rates(currency='EUR', start='YYYY-MM', end='YYYY-MM') -\u003e pd.DataFrame\nFX.list_currencies() -\u003e list\n```\n\n### CPI — Swiss Consumer Price Index\n\n```python\nCPI.get_current() -\u003e float                                      # latest index value\nCPI.get_historical(start='YYYY-MM', end='YYYY-MM') -\u003e pd.DataFrame\nCPI.get_inflation_yoy(start='YYYY-MM', end='YYYY-MM') -\u003e pd.DataFrame\n```\n\n### SMI — Swiss Market Index Equities\n\n```python\nSMI.get_constituents() -\u003e dict                                  # {ticker: company_name}\nSMI.get_prices() -\u003e pd.DataFrame                                # current prices, all 20\nSMI.get_historical_prices(\n    tickers=['NESN.SW', 'ROG.SW'],  # optional, default: all 20\n    period='1y',                     # ignored if start/end provided\n    start='YYYY-MM-DD',\n    end='YYYY-MM-DD'\n) -\u003e pd.DataFrame\nSMI.get_returns(tickers=None, period='1y', start=None, end=None) -\u003e pd.DataFrame\n```\n\n**SMI constituents:** NESN, ROG, NOVN, UBSG, ZURN, ABBN, SREN, GIVN, LONN, SIKA, GEBN, SLHN, SCMN, HOLN, PGHN, CFR, ALC, SDZ, STMN, VACN\n\n### Bonds — Swiss Confederation Bond Yields\n\n```python\nBonds.list_maturities() -\u003e list                             # ['1y', '2y', ..., '30y']\nBonds.get_yield(maturity='10y') -\u003e float                    # latest yield in %\nBonds.get_yield_curve() -\u003e pd.DataFrame                     # one row, all maturities\nBonds.get_historical_yields(\n    maturity='10y',          # optional, returns all maturities if omitted\n    start='YYYY-MM-DD',\n    end='YYYY-MM-DD'\n) -\u003e pd.DataFrame\n```\n\n**Available maturities:** 1y, 2y, 3y, 4y, 5y, 6y, 7y, 8y, 9y, 10y, 15y, 20y, 30y\n\n### Error handling\n\n```python\nfrom swiss_finance import SNB, FX, CPI, SMI, SNBAPIError, DataValidationError\n\ntry:\n    rate = SNB.get_policy_rate()\nexcept SNBAPIError as e:\n    print(f\"Failed to fetch data: {e}\")\n\ntry:\n    rates = SNB.get_historical_rates(start='2030-01')\nexcept DataValidationError as e:\n    print(f\"Invalid date range: {e}\")\n```\n\n---\n\n## Data Sources\n\n| Source | Dataset | License |\n|--------|---------|---------|\n| [Swiss National Bank](https://data.snb.ch/) | SNB Policy Rate | [SNB Open Data terms](https://www.snb.ch/en/srv/disclaimer_liability) |\n| [Swiss National Bank](https://data.snb.ch/) | SARON monthly avg (2009+) | [SNB Open Data terms](https://www.snb.ch/en/srv/disclaimer_liability) |\n| [Swiss National Bank](https://data.snb.ch/) | SARON daily fixing (2009+) | [SNB Open Data terms](https://www.snb.ch/en/srv/disclaimer_liability) |\n| [Swiss National Bank](https://data.snb.ch/) | CHF FX Rates (monthly, 1999+) | [SNB Open Data terms](https://www.snb.ch/en/srv/disclaimer_liability) |\n| [Swiss National Bank](https://data.snb.ch/) | Swiss CPI (monthly, 1921+) | [SNB Open Data terms](https://www.snb.ch/en/srv/disclaimer_liability) |\n| [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) |\n| [Yahoo Finance](https://finance.yahoo.com/) | SMI equities (via yfinance) | Yahoo Finance ToS |\n\n---\n\n## Examples\n\n| Notebook | Description |\n|----------|-------------|\n| [Markowitz SMI Optimisation](examples/markowitz_smi_optimization.ipynb) | Mean-variance portfolio optimisation on SMI constituents using SARON as risk-free rate |\n| [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 |\n\n---\n\n## Development\n\n### Setup\n\n```bash\ngit clone https://github.com/EMen11/swiss-finance-data.git\ncd swiss-finance-data\npip install -e .[dev]\n```\n\n### Run tests\n\n```bash\npytest --cov=swiss_finance tests/\n```\n\n---\n\n## API Stability\n\n- **v0.x** — API may evolve based on feedback\n- **v1.0+** — Stable public API with backward compatibility guaranteed\n- Versioning follows [Semantic Versioning (SemVer)](https://semver.org/).\n\n---\n\n## Roadmap\n\n- [x] v0.1.0 — SNB policy rates\n- [x] v0.1.1 — Improved error handling and date validation\n- [x] v0.2.0 — SARON monthly + CHF FX rates\n- [x] v0.3.0 — SARON daily + Swiss CPI + inflation\n- [x] v0.4.0 — SMI equities (20 constituents, prices, returns)\n- [x] v0.5.0 — Swiss Confederation bond yields (13 maturities, yield curve)\n- [x] v1.0.0 — Stable public API, full documentation (CONTRIBUTING, DATA_SOURCES)\n- [x] v1.1.1 — MCP server (18 tools), MkDocs documentation, pandas 2.x fix\n\n---\n\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for full version history.\n\n---\n\n## License\n\nMIT License — see [LICENSE](LICENSE) for details.\n\n---\n\n## Author\n\n**Elie Menassa**\n- GitHub: [@EMen11](https://github.com/EMen11)\n- Email: menassa.elie.dev@gmail.com","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FEMen11%2Fswiss-finance-data","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FEMen11%2Fswiss-finance-data","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FEMen11%2Fswiss-finance-data/lists"}