Probabilistic Forecasts
for the German Electricity Market

An ensemble of machine-learning models leveraging weather and market data to produce daily electricity-market forecasts up to 9 days ahead.

Price Forecasts

Forecast Horizon: 9 days

Time Zone: CET/CEST

Resolution/MTU: 15 min

Training Target: EPEX Spot Day Ahead (ENTSO-E TP 12.1.D)

Forecast Creation Time:

Forecast Publication Time:

Creation Time of used Weather Forecasts:

    11:30 CET/CEST model run

    Only day-ahead prices are published in a second, later model run at 11:30 CET/CEST. That run incorporates the results of the EXAA day-ahead auction to improve forecast accuracy. It covers one day ahead only — the horizon is fixed at one day for this run.

    Start
    End

    Overview

    This application provides automated, probabilistic forecasts for the German day-ahead electricity market, specifically targeting the DE-LU bidding zone. The scientific groundwork and methodological architecture defining this system are currently being prepared for formal academic publication. Comprehensive background information and technical specifications will be provided upon the release of the manuscript.

    The operational framework generates interdependent predictions for electricity prices, grid load, renewable energy feed-in (wind and photovoltaic), conventional dispatchable generation, and cross-border commercial exchanges. Forecasts cover a multi-day horizon and are structured in a quarter-hourly resolution to align with current market time units.

    Please note: A more detailed description of the forecasting pipeline will follow.

    Operational Timing and Applications

    Forecast updates are published daily at approximately 07:00 CET / 08:00 CEST. This publication schedule ensures data availability prior to critical market gate closures. The timing facilitates the integration of forecast data into bidding strategies for the EXAA day-ahead auction at 10:15 CET/CEST and the EPEX SPOT Single Day-Ahead Coupling (SDAC) auction at 12:00 CET/CEST.

    Furthermore, the multi-day probabilistic outputs provide the necessary quantitative inputs for stochastic dispatch optimization, unit commitment planning, and automated consumption optimization.

    Methodology

    The forecasting pipeline employs a hybrid architecture that integrates domain-specific physical modeling with advanced machine learning techniques. Initial stages utilize physical simulations to process high-resolution meteorological data for renewable generation estimation, alongside statistical decomposition for electrical load.

    Subsequent stages apply ensemble machine learning algorithms to capture non-linear market dependencies and cross-border trade impacts. The final outputs quantify forecast uncertainty by providing comprehensive predictive distributions rather than isolated deterministic point estimates.

    Data Sources

    The underlying models are driven by automated pipelines that retrieve information exclusively from public data infrastructures. Key data providers include:

    • Meteorological Data: Deutscher Wetterdienst (DWD) and the European Centre for Medium-Range Weather Forecasts (ECMWF).
    • Market and Grid Fundamentals: ENTSO-E Transparency Platform and SMARD.
    • Commodity Pricing: Federal Statistical Office (DESTATIS) for applicable fuel price indices, and the U.S. Energy Information Administration (EIA) for commodity and fuel-market series.

    For detailed attribution requirements and licence references for these upstream data sources, please consult the Data Attribution section.

    DESTATIS

    Statistisches Bundesamt (DESTATIS), GENESIS-Online. Licensed under the Data licence Germany – attribution – version 2.0 (dl-de/by-2-0), www.govdata.de/dl-de/by-2-0. Source data has been modified.

    ECMWF

    This service is based on data and products of the European Centre for Medium-Range Weather Forecasts (ECMWF). Source: www.ecmwf.int. This ECMWF data is published under a Creative Commons Attribution 4.0 International (CC BY 4.0), https://creativecommons.org/licenses/by/4.0/. ECMWF does not accept any liability whatsoever for any error or omission in the data, their availability, or for any loss or damage arising from their use.

    EIA

    Data: U.S. Energy Information Administration (EIA), retrieved via the EIA Open Data API. The EIA does not endorse this site.

    Energy-Charts

    Source: Energy-Charts (energy-charts.info), operated by the Fraunhofer Institute for Solar Energy Systems ISE. Unless stated otherwise, the data provided via the Energy-Charts API is licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0), https://creativecommons.org/licenses/by/4.0/. Energy-Charts / Fraunhofer ISE is credited as the source and does not endorse this website or its forecasts.

    ENTSO-E

    Source: ENTSO-E Transparency Platform. The re-usable data is published under the Creative Commons Attribution 4.0 International (CC BY 4.0), https://creativecommons.org/licenses/by/4.0/. ENTSO-E is referenced only as the source of the data and does not endorse this website or its forecasts.

    SMARD

    Source: Bundesnetzagentur | SMARD.de. Market data from SMARD.de is provided by the Bundesnetzagentur and, under section 111d of the Energy Industry Act (EnWG), has been made freely available for public use. It is licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0), https://creativecommons.org/licenses/by/4.0/.

    Download Forecasts for Bidding Zone DE-LU

    Set the export parameters on the left, then download the file for the DE-LU bidding zone.

    • Date range — origin dates with available forecasts; maximum 75 days between start and end
    • Horizon — limits how far ahead of each issue the timesteps go
    • Horizon > 1 day — the export contains multiple overlapping forecast timeseries, one per origin_date, rather than a single continuous timeseries
    • Contentsorigin_date, origin_time (05:30 UTC early run, or 11:30 Europe/Berlin midday run) and target_time in the selected timezone, horizon_in_hours from that origin, and the requested forecast columns

    Citation: Please cite this work if you use the forecasts in research, e.g. in energy system models or downstream studies — a citation reference will be added here once the paper is out. Two runs are published daily, the early run (05:30 UTC) and the midday run (11:30 Europe/Berlin), and any benchmark must state which run was used. You're free to use the forecasts as a benchmark or baseline, including in publications; the one restriction is that they may not be used to build competing forecasts of the same target quantities (SDAC/EPEX day-ahead prices, load, wind, PV) submitted to public benchmarks or leaderboards.

    Overview

    The API at Spotmarket-Forecast.de gives programmatic access to our daily probabilistic electricity-market forecasts for Germany (DE-LU bidding zone and German TSO areas).

    You can query price, load, wind_onshore, wind_offshore, and solar — the same quantities available for download. Day-ahead prices and DE-LU aggregates include quantile fans; TSO-level series are point forecasts. The early run (0530utc) covers a nine-day horizon of quarter-hourly targets; the midday price run (1130cet) covers the next Berlin delivery day only.

    Each response includes absolute target timestamps (ISO-8601 with offset) in the requested tz (utc or mtu = Europe/Berlin), plus origin and horizon_in_hours relative to the public model-run instant (05:30 UTC or 11:30 Europe/Berlin).

    After sign-up, your personal access token is shown in your Profile. Send it as a bearer token in the Authorization header with every request.

    New forecast runs are published daily, typically around 06:00 UTC (07:00 CET / 08:00 CEST). If a run is not yet available, the API responds with the latest published issue date.

    Citation and benchmarks

    Please cite this work if forecasts obtained via the API are used in research — for example in energy system models or other downstream studies. A citation reference will be added here once the paper is out.

    Two runs are provided daily: the early run (05:30 UTC) and the midday run (11:30 Europe/Berlin); the run is identified in the API response. Any benchmark against the forecasts must say which run was used.

    You're free to use the forecasts as a benchmark or baseline, including in publications. The one restriction: the forecasts may not be used to build competing forecasts of the same target quantities (SDAC/EPEX day-ahead electricity prices, load, wind, or solar/PV) that are then submitted to public benchmarks or leaderboards. Full terms apply — see the Terms of Use.

    You must not misrepresent forecasts as official market or grid-operator publications.

    How To

    Include your bearer token from your profile in the Authorization header of each request.

    Endpoint

    GET https://spotmarket-forecast.de/api/forecasts

    Query parameters

    • origin_date — issue date YYYY-MM-DD (date only). Required. The public origin clock time is returned in origin (05:30 UTC for 0530utc, or 11:30 Europe/Berlin for 1130cet).
    • tzutc or mtu (Europe/Berlin); default mtu. Applies to origin and target.
    • quantityprice (default), load, wind_onshore, wind_offshore, or solar.
    • areade_lu (default); 50hertz, amprion, tennet, transnetbw only for load/wind_onshore/wind_offshore/solar. Price is DE-LU only.
    • typepoint (default, median) or quantiles (full fan).
    • model_run0530utc (default, multi-day) or 1130cet (later run folding in the EXAA day-ahead auction; day-ahead only). Only valid for quantity=price.

    Validation

    Invalid parameter combinations (e.g. price with a TSO area) are rejected by the API with 400 and a detail message. Client libraries pass parameters through and raise on non-2xx responses; they do not duplicate the full validation matrix.

    Compression

    All JSON responses are gzip-compressed (Content-Encoding: gzip). Use curl --compressed or Python requests (automatic decompression). Larger responses benefit most from compression.

    Example

    curl --compressed -H "Authorization: Bearer <token>" \
      "https://spotmarket-forecast.de/api/forecasts?origin_date=2026-06-23&quantity=price&type=quantiles&area=de_lu"

    Response

    {
      "origin_date": "2026-06-23",
      "origin": "2026-06-23T05:30:00+00:00",
      "tz": "utc", "model_run": "0530utc",
      "quantity": "price", "area": "de_lu", "type": "quantiles", "kind": "quantile",
      "target": ["2026-06-23T05:30:00+00:00", "2026-06-23T05:45:00+00:00", ...],
      "horizon_in_hours": [0.0, 0.25, ...],
      "series": { "0.050": [...], "0.150": [...], ... }
    }

    origin is the public model-run instant in the requested tz (05:30 UTC for 0530utc; 11:30 Europe/Berlin for 1130cet). horizon_in_hours is the duration from that origin to each target (quarter-hourly). type=point returns a single point series key.

    Availability

    If the forecast for origin_date is not yet published, the API returns 404 with { "detail": "...", "latest_available": "YYYY-MM-DD" }.

    Interactive API

    Try GET /api/forecasts against the live API. Use Authorize with your profile bearer token. Requests count against the same rate limits as any other client.

    Python Code

    Two reference clients using requests. Replace <token> with your profile token. Gzip decompression is automatic.

    Simple client
    import requests
    
    BASE_URL = "https://spotmarket-forecast.de"
    
    
    class ForecastsClient:
        def __init__(self, token):
            self.token = token
    
        def fetch_forecast(
            self,
            origin_date,
            quantity="price",
            area="de_lu",
            forecast_type="quantiles",
        ):
            headers = {"Authorization": f"Bearer {self.token}"}
            params = {
                "origin_date": origin_date,
                "quantity": quantity,
                "area": area,
                "type": forecast_type,
            }
            response = requests.get(
                f"{BASE_URL}/api/forecasts",
                headers=headers,
                params=params,
                timeout=60,
            )
            response.raise_for_status()
            return response.json()
    
    
    if __name__ == "__main__":
        client = ForecastsClient("<token>")
        data = client.fetch_forecast("2026-06-23")
        print(data["origin_date"], data["origin"], len(data["target"]))
    Full client

    Requires requests and pandas (Python 3.9+).

    from __future__ import annotations
    
    from typing import Literal
    
    import pandas as pd
    import requests
    
    BASE_URL = "https://spotmarket-forecast.de"
    
    
    class ForecastsDataFrameClient:
        """Returns DataFrames indexed by the API's absolute target timestamps."""
    
        def __init__(self, token: str, timezone: Literal["utc", "mtu"] = "mtu"):
            self.token = token
            self.timezone = timezone
    
        def _get(self, params: dict) -> dict:
            headers = {"Authorization": f"Bearer {self.token}"}
            response = requests.get(
                f"{BASE_URL}/api/forecasts",
                headers=headers,
                params={**params, "tz": self.timezone},
                timeout=120,
            )
            response.raise_for_status()
            return response.json()
    
        def fetch_forecast(
            self,
            origin_date: str,
            quantity: str = "price",
            area: str = "de_lu",
            forecast_type: str = "quantiles",
            model_run: str = "0530utc",
        ) -> pd.DataFrame:
            payload = self._get({
                "origin_date": origin_date,
                "quantity": quantity,
                "area": area,
                "type": forecast_type,
                "model_run": model_run,
            })
            return self._payload_to_frame(payload)
    
        def _payload_to_frame(self, payload: dict) -> pd.DataFrame:
            index = pd.MultiIndex.from_arrays(
                [
                    [payload["origin_date"]] * len(payload["target"]),
                    payload["horizon_in_hours"],
                    pd.to_datetime(payload["target"]),
                ],
                names=["origin_date", "horizon_in_hours", "target_time"],
            )
            return pd.DataFrame(payload["series"], index=index)
    
        def day_ahead_only(self, df: pd.DataFrame) -> pd.DataFrame:
            """Keep timesteps for the next German delivery day (day-ahead window)."""
            targets = pd.DatetimeIndex(df.index.get_level_values("target_time"))
            if targets.tz is None:
                targets = targets.tz_localize("UTC")
            berlin_dates = targets.tz_convert("Europe/Berlin").normalize()
            origin_dates = pd.to_datetime(df.index.get_level_values("origin_date"))
            delivery = (origin_dates + pd.Timedelta(days=1)).normalize()
            return df.loc[berlin_dates.values == delivery.values]
    
    
    if __name__ == "__main__":
        client = ForecastsDataFrameClient("<token>", timezone="mtu")
        df = client.fetch_forecast("2026-06-23")
        da = client.day_ahead_only(df)
        print(df.shape, da.shape)

    Diese Datenschutzerklärung informiert über die Verarbeitung personenbezogener Daten bei der Nutzung dieser Website. Sie gilt für alle Besucher, unabhängig davon, ob ein Nutzerkonto besteht.

    1. Verantwortlicher (Art. 4 Nr. 7 DSGVO)
    Hannes Cramer, Poolstr. 20, Suite 400, c/o Placeholder GmbH, 20355 Hamburg, Deutschland.
    E-Mail: spotmarket-forecast.dexxx@contact

    2. Zwecke und Rechtsgrundlagen
    Personenbezogene Daten werden zu folgenden Zwecken verarbeitet:

    • Bereitstellung des Prognosedienstes sowie ggf. Erfüllung von Konto- und Download-Anfragen – Art. 6 Abs. 1 lit. b DSGVO (Vertrag bzw. vorvertragliche Maßnahmen).
    • Sicherer und zuverlässiger Betrieb der Website, einschließlich Server-Protokollierung, Ratenbegrenzung und Missbrauchsabwehr – Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse an einem sicheren, stabilen Dienst).
    • Erstellung aggregierter, pseudonymer Besuchsstatistiken zur Ermittlung der Gesamtnutzung – Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse an Verbesserung und Dimensionierung des Dienstes).
    • Beantwortung von Anfragen über das Kontaktformular – Art. 6 Abs. 1 lit. b DSGVO, sofern die Anfrage einen Vertrag betrifft, andernfalls Art. 6 Abs. 1 lit. f DSGVO.

    3. Kategorien personenbezogener Daten
    Je nach Nutzung der Website können verarbeitet werden:

    • Alle Besucher: IP-Adresse und Browser-Kennung (User-Agent) (siehe Ziffern 4 und 5) sowie technisch notwendige Sitzungsdaten (Ziffer 6).
    • Nutzer des Kontaktformulars: die angegebene E-Mail-Adresse und der Nachrichteninhalt.
    • Nur registrierte Nutzer: E-Mail-Adresse, gehashtes Passwort und Nutzungsmetadaten (Anzahl der API-Abfragen bzw. abgeschlossenen Downloads).

    4. Server-Logfiles und Hosting
    Beim Aufruf der Website werden automatisch Verbindungsdaten, einschließlich der IP-Adresse, verarbeitet, um die Website auszuliefern und die Sicherheit zu gewährleisten. Diese Website wird auf einem virtuellen Server der netcup GmbH, Daimlerstraße 25, 76185 Karlsruhe, Deutschland, gehostet, die als Auftragsverarbeiter gemäß Art. 28 DSGVO tätig ist. Zugriffsprotokolle des Webservers, die die IP-Adresse enthalten, werden für 7 Tage gespeichert und anschließend automatisch gelöscht. Rechtsgrundlage: Art. 6 Abs. 1 lit. f DSGVO.

    5. Besuchsstatistik
    Die Gesamtnutzung der Website wird ohne Cookies und ohne einen Drittanbieter-Analysedienst gemessen. Für jeden Seitenaufruf werden kurzzeitig die IP-Adresse und der User-Agent verarbeitet, um daraus mit einem täglich wechselnden Zufallswert (Salt) einen nicht umkehrbaren Hashwert (SHA-256) zu berechnen. Dieser Hashwert dient ausschließlich dazu, wiederholte Besuche innerhalb desselben Tages zu erkennen, damit eindeutige Tagesbesucher nicht doppelt gezählt werden.

    • Die ungehashte IP-Adresse und der User-Agent werden nicht gespeichert.
    • Die kurzfristigen Hashwerte zur Deduplizierung werden nach wenigen Tagen gelöscht.
    • Dauerhaft gespeichert werden lediglich aggregierte Zählwerte (Seitenaufrufe und eindeutige Besucher pro Tag); diese enthalten keine identifizierenden Daten.

    Da der Salt täglich wechselt, können Besucher nicht über verschiedene Tage hinweg wiedererkannt werden. Es werden keine Profile erstellt und es findet kein websiteübergreifendes Tracking statt. Rechtsgrundlage: Art. 6 Abs. 1 lit. f DSGVO.

    6. Cookies und Sitzungen
    Es werden ausschließlich technisch notwendige Cookies und Sitzungsdaten verwendet – zur Authentifizierung, zur Sicherheit (z. B. CSRF-Schutz) und zur Anzeige der Prognose-Diagramme. Sie sind für den Betrieb der Website erforderlich und werden für alle Besucher gesetzt, die die entsprechenden Funktionen nutzen. Für eine solche unbedingt erforderliche Speicherung ist gemäß § 25 Abs. 2 TDDDG keine Einwilligung erforderlich. Analyse- oder Tracking-Cookies von Dritten werden nicht eingesetzt.

    7. Kontaktformular
    Wird das Kontaktformular genutzt, werden die angegebene E-Mail-Adresse und Nachricht zur Bearbeitung der Anfrage verarbeitet. Rechtsgrundlage: Art. 6 Abs. 1 lit. b DSGVO, sofern die Anfrage einen Vertrag betrifft, andernfalls Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse an der Beantwortung).

    8. Nutzerkonten und API-Nutzung
    Bei Anlage eines Kontos werden die E-Mail-Adresse und ein gehashtes Passwort gespeichert. Für angemeldete Nutzer wird zudem die Anzahl der API-Abfragen und abgeschlossenen Downloads gezählt; dieser Wert wird im Profil angezeigt und dient dem Betrieb und der Überwachung des Dienstes. Rechtsgrundlage: Art. 6 Abs. 1 lit. b und lit. f DSGVO.

    9. Speicherdauer

    • Kontodaten (E-Mail, gehashtes Passwort, Nutzungszähler): werden für die Dauer des Kontos gespeichert und bei Löschung des Kontos gelöscht, sofern keine gesetzlichen Aufbewahrungspflichten bestehen.
    • Zugriffsprotokolle des Webservers (inkl. IP-Adresse): 7 Tage.
    • Deduplizierungsdaten der Besuchsstatistik: werden durch eine tägliche Bereinigung nach 2 Tagen gelöscht; aggregierte Zählwerte (Seitenaufrufe und eindeutige Besucher pro Tag) werden dauerhaft als anonyme Statistik ohne identifizierende Daten aufbewahrt.
    • Daten der Ratenbegrenzung: werden nur kurzzeitig in einem temporären In-Memory-Cache vorgehalten (Sekunden bis maximal eine Stunde) und nicht als Verlauf gespeichert.
    • Sitzungsdaten: Sitzungen laufen nach 3 Stunden ab; abgelaufene Sitzungsdatensätze werden durch eine tägliche Bereinigung entfernt.
    • Kontaktnachrichten: werden nicht in einer Datenbank gespeichert; sie werden an das E-Mail-Postfach des Verantwortlichen gesendet und dort bis zur Erledigung der Anfrage aufbewahrt, vorbehaltlich gesetzlicher Aufbewahrungsfristen.

    10. Empfänger
    Personenbezogene Daten werden durch den Hosting-Anbieter (Ziffer 4) als Auftragsverarbeiter gemäß Art. 28 DSGVO verarbeitet. Im Übrigen werden personenbezogene Daten nicht an Dritte weitergegeben, es sei denn, dies ist gesetzlich vorgeschrieben. Die zur Erstellung der Prognosen genutzten externen Datenquellen (z. B. ENTSO-E, ECMWF, DWD, DESTATIS) liefern Daten an den Verantwortlichen; personenbezogene Daten der Nutzer werden nicht an diese übermittelt.

    11. Ihre Rechte
    Es bestehen die Rechte auf Auskunft, Berichtigung, Löschung, Einschränkung der Verarbeitung, Datenübertragbarkeit und Widerspruch (Art. 15–21 DSGVO). Soweit die Verarbeitung auf Art. 6 Abs. 1 lit. f DSGVO beruht, kann ihr jederzeit aus Gründen, die sich aus der besonderen Situation der betroffenen Person ergeben, widersprochen werden. Zudem besteht ein Beschwerderecht bei einer Datenschutz-Aufsichtsbehörde.

    12. Kontakt für Datenschutzanfragen
    spotmarket-forecast.dexxx@contact

    Terms of Use

    1. Scope
    These terms govern access to and use of the Spotmarket-Forecast.de website, charts, and related services, which are operated by Hannes Cramer. By accessing or using the service, these terms are accepted.

    2. Service description
    Spotmarket-Forecast.de provides electricity-market forecasts and related information for research, analytical, and informational purposes. The forecasts are probabilistic and may differ from actual outcomes. Two day-ahead forecast runs are published each day, based on different information cut-offs (see Section 5).

    3. No warranty
    Content is provided “as is”, without warranty of accuracy, completeness, or fitness for a particular purpose. The service is used at the user's own risk.

    4. Permitted use and restriction
    The forecasts remain the property of the operator and are made available for broad use, including academic and scientific research, energy-system modelling and optimization, downstream studies, internal analysis, and use as a benchmark or baseline within research and publications.

    The following single restriction applies: the forecasts may not be used — whether in whole, in part, or in any derived or transformed form — to build competing forecasts of the same target quantities (SDAC/EPEX day-ahead electricity prices, load, wind, or solar/PV) that are then submitted to, entered in, or published on any public forecasting competition, benchmark, leaderboard, or evaluation platform. Using the forecasts themselves as a benchmark or baseline — including reporting comparisons against them in research and publications — is expressly permitted.

    5. Citation and benchmark comparisons
    If the forecasts are used in academic or research work, the appropriate citation should be requested via the contact address in the Impressum. A citation reference will be added here once the accompanying paper has been published.

    Two day-ahead forecast runs are published each day, based on different information cut-offs:

    • the early run, produced at 05:30 UTC, and
    • the midday run, produced at 11:30 local time (Europe/Berlin, CET/CEST).

    Any benchmark, comparison, or evaluation reported against the forecasts must state which of the two runs was used. Comparisons that do not identify the run are not a valid representation of the forecasts' performance.

    6. Acceptable use
    The service may not be misused. Unauthorized access may not be attempted, and data may not be scraped or bulk-downloaded beyond normal use. The service may not be used in violation of applicable law.

    7. Accounts and API access
    Where registration or API access is offered, additional usage limits and authentication requirements apply. Credentials must be kept confidential, and any activity carried out under a set of credentials is attributed to its holder.

    8. Liability
    To the extent permitted by law, liability is limited to intent and gross negligence. No liability is accepted for trading, operational, or financial decisions based on forecast content.

    9. Contact
    Questions about these terms can be directed to the contact address provided in the Impressum.

    10. Changes
    These terms may be updated from time to time. Continued use of the service after changes take effect constitutes acceptance of the revised terms.

    Contact

    Solve the math problem
    Math problem

    Profile

    Please log in to view your profile.