About this map
How to read it
- Bidding zones and the day-ahead price
- Europe's power market is split into bidding zones, mostly countries (Norway, Sweden, Denmark and Italy are split into
several). Each day at 12:00 CET the Single Day-Ahead Coupling (SDAC) auction clears all zones at once and sets one price per zone for
each quarter-hour of the next day, in €/MWh. The price is set by the most expensive power plant (or demand bid) needed. It can go
negative when inflexible or subsidised generation exceeds demand. The harmonised floor is −€500/MWh.
- Flow-based market coupling (Core)
- In the Core region (Benelux, France, Germany, Austria, Central-Eastern Europe), cross-border capacity is not a fixed number per border.
The auction models how each trade physically spreads over the meshed AC grid (power takes every parallel path), and only accepts the
combination of trades that keeps every monitored line within its limits. That is why a trade between France and Germany can be
limited by a line inside Belgium.
- Why prices split: congestion
- When two neighbouring zones clear at different prices, the auction would have moved more cheap power to the expensive side if it
could. A lasting price gap therefore means the grid between them was full: some line or transformer, checked against the outage of
another element, had reached its limit. The value of one more MW of capacity on that element is its shadow price, and price
gaps between zones are built from these shadow prices. (The individual constraints are published by JAO; they are not shown here.)
- Net position
- The number under a zone's price is its net scheduled exchange with all neighbours: + means the country exports on balance, − means
it imports. Shown at country level for the Core zones.
- Scheduled vs physical flows
- Scheduled arrows are the commercial exchanges between countries. For AC borders they are drawn as arcs between zone
labels, for HVDC links along the real cable. Physical flows are what the meters measured. They often differ: power takes
every parallel path, so physical power entering NL from Germany frequently continues to Belgium (a "loop flow"). Both are hourly or
quarter-hourly country-level data; Denmark and Norway are whole-country totals.
- Why does power sometimes flow from expensive to cheap?
- Under flow-based coupling, a "counter-intuitive" exchange can free up capacity on a congested line that a more valuable trade
elsewhere needs. The auction maximises total welfare across Europe, not each border separately.
- Model price and "model misses" (⚑)
- For NL, Germany and Belgium the zone panel and the timeline also show a model price (dashed). It comes from my own zonal market
model (see below). The ⚑ markers are the quarter-hours where the real price differed most from the model, labelled with the
regime the model was in (scarcity, renewable surplus, …). Use ⚑‹ ⚑› or the n / p keys to jump between them.
The year in numbers
Oct 2025 – Sep 2026, 15-minute day-ahead prices; zones whose prices are licensed for publication only.
Median daily range = typical gap between the day's highest and lowest quarter-hour price, which is what a battery earns its living on.
The model behind the dashed line
The model price comes from a zonal market model I built: a linear program (linopy + HiGHS) that clears NL, Germany and Belgium
every quarter-hour against data-driven supply curves, the published flow-based grid limits and the HVDC links to the Nordics. Only its
output, the model price, is shown here; none of its grid inputs are displayed.
It replays history with observed demand and renewables, so it is a fundamentals replay, not a day-ahead forecast. Over
Nov 2025 – Sep 2026 its mean absolute error is €13/MWh for NL (€8 DE, €18 BE), against €34–37 for a naive
same-time-last-week baseline. It misses most in solar months and in scarcity hours, which is what the ⚑ markers show.
The same project includes a day-ahead wind forecast for the Netherlands (gradient-boosted trees on day-before weather forecasts) that
beats the recalibrated TSO forecast: 8.2% vs 11.7% normalised error offshore, 5.7% vs 12.0% onshore, plus a study of whether Dutch
imbalance prices can be predicted a few hours ahead. Mostly they can't, beyond what persistence already gives.
Data & licences
Only data that may be republished is shown. Zones in grey have no public price: their
day-ahead prices come from the power exchanges (EPEX SPOT, Nord Pool) and are licensed for private use only, so they are left out,
along with anything derived from them.
- Day-ahead prices (15 zones): Bundesnetzagentur | SMARD.de, via Energy-Charts.info (Fraunhofer ISE). CC BY 4.0.
- Cross-border flows and net positions (scheduled commercial exchanges and physical flows, country level): Energy-Charts.info (Fraunhofer ISE), CC BY 4.0. Net positions are the sum of each country's scheduled exchanges.
- Transmission grid ≥ 220 kV and HVDC links: © OpenStreetMap contributors, ODbL, via the PyPSA-Eur prebuilt OSM network (Xiong et al.). The grid geometry shipped with this page is a simplified derivative and is likewise available under the ODbL.
- Offshore wind farms: EMODnet Human Activities (data originator CETMAR), CC BY 4.0.
- Bidding-zone outlines: made with Natural Earth (public domain), merged to approximate zone borders inside Denmark, Norway, Sweden and Italy.
- Basemap: © CARTO, © OpenStreetMap contributors.
Model prices and the ⚑ markers are my own computations. All series were resampled to a common 15-minute UTC grid (hourly
values forward-filled; flows converted from GW to MW and re-signed per border) and are shown without warranty.
Data built .
Who made this
I'm Cormac Berkery, a data scientist in Amsterdam working on power-market modelling and
forecasting. This map is the visual front end of a larger project: data pipelines for European market and grid data, the market
model above, and forecasting experiments. Feedback is welcome.