Documentation
Technical reference for Grid Poet
1. DA Price Forecast
Grid Poet forecasts day-ahead electricity prices for the DE-LU bidding zone (Germany + Luxembourg). The forecast is generated daily before the EPEX SPOT day-ahead auction closes at 12:00 CET, predicting 24 hourly prices for the next delivery day (D+1).
The model outputs three quantiles: P10 (10th percentile, lower bound), P50 (median, point forecast), and P90 (90th percentile, upper bound), forming an 80% prediction interval.
1.1 Pipeline Flow
The daily forecast pipeline runs in five stages:
1.2 Data Sources
| Source | Data | Resolution |
|---|---|---|
| ENTSO-E Transparency Platform | DA prices, generation by source, load, cross-border flows, wind/solar forecasts (DE-LU + 13 zones) | 15-min / hourly |
| Energy-Charts (Fraunhofer ISE) | Generation mix (fallback source, publishes faster than ENTSO-E for some types) | Hourly |
| Open-Meteo | Wind speed (100m), solar radiation, temperature, cloud cover | Hourly |
Weather Locations
Weather data is fetched from 6 representative locations across Germany, weighted by installed renewable capacity:
| Location | Coordinates | Represents |
|---|---|---|
| North Sea | 54.5Β°N, 7.0Β°E | Offshore wind cluster |
| North | 53.5Β°N, 10.0Β°E | Onshore wind (Schleswig-Holstein, Niedersachsen) |
| Central West | 51.5Β°N, 7.5Β°E | NRW industrial demand, onshore wind |
| Central East | 51.3Β°N, 12.4Β°E | Sachsen-Anhalt / Brandenburg wind+solar |
| South West | 48.8Β°N, 9.2Β°E | Baden-WΓΌrttemberg solar |
| South East | 48.1Β°N, 11.6Β°E | Bavaria solar |
Wind speed is weighted by installed wind capacity (offshore/onshore splits). Solar radiation is weighted by installed PV capacity (concentrated in southern Germany). Temperature uses equal weighting.
1.3 Features (~37 total)
Weather (D+1 forecast)
- Capacity-weighted wind speed at 100m hub height
- Capacity-weighted direct solar radiation
- Average temperature and cloud cover across locations
- Northβsouth wind gradient (congestion proxy)
- Northβsouth radiation gradient
Price Lags (strict no-leakage: D-1 and earlier)
- Same hour yesterday (D-1) and one week ago (D-7)
- Yesterday's daily mean, min, max
- 7-day rolling mean and standard deviation
Generation Lags (D-1)
- Gas, coal, and renewable generation shares
- Consumption and residual load
- Gas-to-coal ratio (implicit fuel economics proxy)
Calendar
- Hour, day of week, month
- Weekend, public holiday (all 16 German federal states), bridge day
- Cyclical encodings (hour sin/cos, month sin/cos)
Derived
- Wind power proxy β wind speed cubed (cubic power law, capped at 25 m/s cut-out)
- Solar capacity factor proxy β radiation adjusted for temperature derating
- Residual load Γ peak hour interaction
1.4 Model
LightGBM gradient-boosted decision trees with quantile regression objective. Three separate models predict P10, P50 (median), and P90, sharing the same feature set.
A single model covers all 24 hours with hour as a feature, rather than 24 separate hour-specific models. This gives the model more training data per hour and lets it learn cross-hour patterns.
Training approach
Historical data from January 2024 to present. Walk-forward evaluation: train on all data except the last 30 days, test on the final 30 days. Hyperparameters are tuned to minimize MAE on the held-out test set.
1.5 Evaluation
Metrics
| Metric | Description |
|---|---|
| MAE | Mean absolute error β average distance between forecast and actual price |
| RMSE | Root mean squared error β penalises large errors more heavily |
| Mean bias | Average (forecast β actual). Positive = systematically overestimating |
| 80% coverage | Fraction of actuals falling within the P10βP90 interval. Target: 80% |
| Skill score | 1 β (MAE / baseline_MAE). Positive = better than persistence (same-hour D-1) |
Baseline
The persistence baseline predicts tomorrow's price = today's price for the same hour. This is the simplest reasonable forecast and the benchmark to beat. A skill score of 0.40 means the model reduces MAE by 40% compared to persistence.
1.6 Timestamp Conventions
Power market timestamps are interval-aligned: 14:00 means the interval from 14:00 to 15:00 (left-aligned). All internal timestamps use naive UTC.
DST transitions are handled explicitly: a CET delivery date may have 23, 24, or 25 hours. Display conversion to Berlin time is applied in the frontend.
2. Grid Poet Image Pipeline
The image pipeline runs hourly and transforms live grid data into AI-generated artwork:
- Fetch β current generation mix, consumption, weather from ENTSO-E + Open-Meteo
- Analyse β Claude AI writes an analysis, poem, and image prompt based on the grid state
- Generate β FLUX.2 Pro creates a painting in the 19th-century German Romantic landscape tradition
- Publish β image + metadata saved, served on the main page
Each image captures a moment in Germany's energy transition β the interplay of wind, solar, fossil fuels, and weather β through the lens of landscape painting.
3. Captured Prices & Cannibalization
The Analytics page shows captured prices and generation-vs-price scatter plots using hourly market data.
Source data
| Data | Source | Unit |
|---|---|---|
| DA price | ENTSO-E | EUR/MWh |
| Wind onshore | ENTSO-E | GW |
| Wind offshore | ENTSO-E | GW |
| Solar | ENTSO-E | GW |
| Biomass | ENTSO-E | GW |
| Hydro | ENTSO-E | GW |
| Natural gas | ENTSO-E | GW |
| Hard coal | ENTSO-E | GW |
| Brown coal (lignite) | ENTSO-E | GW |
| Consumption (total load) | ENTSO-E | GW |
Derived metrics
| Metric | Formula |
|---|---|
| Captured price (per technology) | Ξ£(priceh Γ genh) / Ξ£(genh) β volume-weighted average DA price |
| Baseload price | Ξ£(priceh) / N β simple arithmetic mean, the reference line |
| Net import | max(0, consumption β total generation) β positive during import hours |
4. European Markets
The Markets page compares day-ahead electricity prices, generation mixes, and cross-border flows across 14 European bidding zones: Germany (DE-LU), France (FR), Netherlands (NL), Austria (AT), Poland (PL), Denmark West (DK1), Belgium (BE), Czech Republic (CZ), Spain (ES), Portugal (PT), Norway South (NO1), Sweden Mid (SE3), Finland (FI), and Great Britain (GB).
Data sources
Day-ahead prices for continental zones are sourced from the ENTSO-E Transparency Platform (authoritative TSO data). Generation mix data is sourced from Energy-Charts (Fraunhofer ISE, CC BY 4.0). GB uses Elexon BMRS (settlement prices, not DA auction).
Timestamps
All timestamps refer to the delivery interval β the time during which power was physically delivered. Timestamps are left-aligned: "14:00" means 14:00β15:00.
Cross-border flows
Cross-border data shows scheduled commercial exchanges for Germany. Positive values = export from DE, negative = import to DE. Source: ENTSO-E Transparency Platform (values in GW).
5. Data Attribution
- ENTSO-E β Transparency Platform: DA prices, generation, load, cross-border flows (14 zones)
- Energy-Charts β Fraunhofer ISE: generation mix fallback (CC BY 4.0)
- Elexon β BMRS: GB settlement prices
- Open-Meteo β open-source weather API (ECMWF, DWD, and other NWP models)
- FLUX.2 Pro β Black Forest Labs: image generation
- Claude β Anthropic: analysis, poetry, and image prompts