v3.1 — MAE Loss + Asymmetric Conformal
Date: February 26, 2026
What Changed
MAE Loss Function
Switched all three models from MSE (squared error) to MAE (absolute error):
| Model | Old Loss | New Loss |
|---|---|---|
| HistGBT | loss="squared_error" | loss="absolute_error" |
| LightGBM | objective="regression" | objective="mae" |
| XGBoost | objective="reg:squarederror" | objective="reg:absoluteerror" |
Why: MSE targets the conditional mean; MAE targets the conditional median. Electricity prices are right-skewed (occasional spikes, bounded floor near 0), so the mean sits below the median, causing MSE-trained models to systematically underpredict.
Result: Strategic ensemble bias improved 96% — from -6.94 to -0.30 EUR/MWh.
Asymmetric Conformal Intervals
Switched from absolute residuals to signed residuals for conformal calibration:
- Old:
|actual - predicted|→ symmetric intervals - New:
(actual - predicted)→ asymmetric intervals
This captures the directional nature of forecast errors. When the model underpredicts more than it overpredicts, the upper bound extends further than the lower bound.
Rolling Bias Correction
Added per-hour rolling bias correction using the last 30 days of predictions:
- Computes mean bias per hour-of-day
- Subtracts from new predictions
- Peak hours (17-19h) showed the worst bias: -22 to -25 EUR/MWh
Negative Price Floor Clipping
Reduced false-negative predictions:
- Analyzed 180 days of historical data for per-hour negative price frequency
- For hours with fewer than 5% negative prices, clip predictions at 0
- Allow negatives at midday hours where solar saturation causes frequent negative pricing
D+1 Feature Bug Fix
Fixed a critical bug where strategic backtests excluded published D+1 prices despite them being available at the 15:00 UTC origin. After fix, XGBoost strategic MAE improved 49% (40.25 → 20.40 EUR/MWh).
Configuration
| Parameter | Value |
|---|---|
| Loss function | MAE (absolute error) |
| Ensemble | 3 models (HistGBT, LightGBM, XGBoost) |
| Features | ~57 |
| Feature selection | No |
| Peak-split | No |
Impact
| Metric | Before (v3.0) | After (v3.1) | Change |
|---|---|---|---|
| Strategic ensemble bias | -6.94 | -0.30 | 96% improvement |
| Strategic XGBoost MAE | 40.25 | 20.40 | 49% improvement |
| D+1 day-ahead MAE | ~16 | 14.85 | ~7% improvement |