FAQ
General
What is EPF?
EPF (Electricity Price Forecasting) is a machine learning system that predicts day-ahead electricity prices for Spain, Portugal, France, and Germany across the OMIE (Iberian) and EPEX SPOT (Central European) markets via the ENTSO-E Transparency Platform, up to 7 days ahead. It produces two daily forecasts: a D+1 day-ahead product at ~10:00 UTC and a D+2 to D+7 strategic product at ~15:00 UTC.
What market does EPF cover?
EPF forecasts ES (OMIE), PT (MIBEL via ENTSO-E), FR (EPEX SPOT via ENTSO-E), and DE (EPEX SPOT via ENTSO-E). Each country uses a tuned XGBoost model — see the methodology changelog for the country-aware refactor and Phase 5 cross-price ablation for the per-country production state.
How often are forecasts updated?
Twice daily:
- ~10:00 UTC — D+1 day-ahead forecast (24 hours of prices for tomorrow)
- ~15:00 UTC — D+2 to D+7 strategic forecast (144 hours of prices for the next 6 days)
What resolution is available?
Forecasts are available at 15-minute resolution (96 quarter-hours per day), aligned with the EU-wide MTU15 transition that took effect in the OMIE market in October 2025.
Accuracy & Methodology
How accurate are the forecasts?
145-day walk-forward backtest, 2025-11-01 → 2026-03-25 (post Z3 ablation, April 2026):
| Country | D+1 MAE | Strategic MAE | Production tag |
|---|---|---|---|
| ES | 13.99 EUR/MWh | 17.35 EUR/MWh | v12.0 ablation (DA) + v11.0 (ST) |
| PT | 21.94 EUR/MWh | 24.67 EUR/MWh | v6.0 ablation (DA) + v6.0 with Z3 (ST) |
| FR | 24.52 EUR/MWh | 28.47 EUR/MWh | v6.0 ablation (DA) + v5.0 (ST) |
| DE | 27.64 EUR/MWh | 35.99 EUR/MWh | v6.0 (both horizons, with cross-prices) |
Spain has the tightest MAE because OMIE/MIBEL is mature and well-coupled to its own ENTSO-E data. Germany has the widest MAE because EPEX SPOT shows the largest absolute price variance (negative prices, renewable swings). Accuracy varies by horizon: near-term forecasts (D+1, D+2) are more accurate than longer-range predictions (D+6, D+7).
See the current production summary for the ES-only v11.0 ancestor and the Phase 5 / Z3 ablation changelog for the multi-country promotion that led to the current stack.
What models does EPF use?
Single-model XGBoost per country × horizon group. All four countries share the same base recipe (depth=12, learning_rate=0.03, quantile q=0.55, price-weighting 3× above 60 EUR/MWh, sample decay 365-day halflife) and a residual_1w target transform (except France, which trains on raw EUR because nuclear baseload gives stable weekly patterns). Cross-country price features are gated per country via EPF_CROSS_PRICE_COUNTRIES=DE — only Germany keeps them in production. See the XGBoost page and cross-price gating decision.
No LSTM, no ensemble. The v10.x LSTM+XGBoost hybrid was retracted in April 2026 after two code bugs were discovered; the v4.3-era HistGBM+LightGBM+XGBoost ensemble was retired at the same cutover. Single XGBoost strictly dominates both on the same evaluation window.
What data sources feed the models?
Five data sources:
| Source | Data | Update Frequency |
|---|---|---|
| REE/ESIOS | 16 electricity indicators for Spain (demand, generation, interconnections, prices) | Hourly |
| ENTSO-E Transparency Platform | Day-ahead prices, generation, and load for PT (MIBEL), FR (EPEX SPOT), DE (EPEX SPOT), plus ES intraday cross-checks | Hourly |
| Open-Meteo | Weather from population-weighted stations per country (ES + PT + FR + DE): temperature, wind, solar irradiance, precipitation | Hourly |
| TTF Gas | Natural gas prices (EUR/MWh) from MIBGAS | Daily |
| EU ETS | Carbon emission allowance prices (EUR/tCO2) | Daily |
What are the 50+ engineered features?
Features are derived from the raw data and include:
- Price dynamics: lags, rolling means, volatility, momentum
- Temporal: cyclical hour/day/month encoding, country-specific holiday calendars (Z1 sprint), vacation periods
- Generation mix: renewable share, wind/solar share, residual demand
- Generation forecasts: country-specific day-ahead renewable, wind, and solar generation forecast targets (Z2 sprint)
- Weather interactions: temperature-demand, wind-generation, solar irradiance
- Solar geometry: solar elevation features (Z4 sprint)
- Commodity signals: marginal cost proxy, spark spread, gas-demand interaction
- Cross-country prices: gated to DE-only via
EPF_CROSS_PRICE_COUNTRIES=DEafter the Z3 ablation showed they hurt ES/FR/PT MAE
See the Feature Engineering section for the full list.
What economic quality metrics does EPF track?
Beyond MAE and RMSE, EPF evaluates 7 metrics that measure forecast value for trading:
| Metric | What it measures |
|---|---|
| Corr-f (Deviation) | Within-day price shape accuracy (daily mean removed) |
| Direction Accuracy | % of hours with correct price movement direction |
| Spike Recall | Ability to identify the most expensive hours |
| Spread Capture | % of optimal BESS arbitrage captured by following the forecast |
These are visible in the Evaluation > Accuracy tab under “Economic Performance”. See Economic Quality Metrics for detailed definitions and thresholds.
How does the two-product system work?
The D+1 day-ahead product is generated before OMIE publishes prices (~10:00 UTC), so traders can use it for bidding. The D+2–D+7 strategic product is generated after D+1 prices are known (~15:00 UTC), using published D+1 prices as the strongest predictive feature.
Each product has its own trained models, optimized for its specific information availability. See Two-Product System for details.
What are confidence intervals?
EPF provides 50% and 90% confidence bands around each point forecast using split conformal prediction. The 90% band means: historically, 90% of actual prices have fallen within this range for predictions at the same horizon.
The intervals are asymmetric — wider on the upside to reflect the right-skewed nature of electricity prices (bounded below, occasional high spikes).
Technical
Is there an API?
Yes. The REST API provides programmatic access to forecasts, market data, and evaluation metrics. See the API Overview for details. Public access is planned for a future release.
What happens when data is missing?
The system has several resilience mechanisms:
- Weather data: Open-Meteo has high availability; if a station fails, the weighted average adjusts
- Commodity data: Forward-filled over weekends and holidays (markets don’t trade daily)
- REE data: The pipeline retries collection for the last 2 days on each run
- Model features: Tree-based models handle NaN values natively — no imputation needed
How does the system handle price spikes?
Price spikes (>200 EUR/MWh) are part of the training data and the models learn to predict them. However, extreme events are inherently harder to forecast. The confidence intervals widen during volatile periods.
A sanity check aborts predictions if the maximum predicted price exceeds 500 EUR/MWh, flagging potential data quality issues.
How does the system handle negative prices?
Negative prices occur during periods of high renewable generation and low demand (typically midday in spring/autumn). The models are trained on historical negative price events and can predict them.
A post-prediction bias correction clips predicted prices at 0 EUR/MWh for hours where less than 5% of historical prices were negative. Hours with frequent negative prices (e.g., midday solar surplus periods) are left unconstrained with a floor at -50 EUR/MWh.
How is the system deployed?
EPF runs on secure cloud infrastructure with two automated daily forecast runs — day-ahead at ~10:00 UTC and strategic at ~15:00 UTC. A dedicated REST API provides programmatic access to forecasts and evaluation data.