Date: March 4, 2026
What Changed
Sprint 3 added 24 new features designed to capture volatile market conditions — commodity price momentum, volatility regime detection, price curve shape, demand ramps, and multi-week seasonal lags. Motivated by the Iran conflict driving gas/electricity price spikes, these features encode exactly the kind of regime shifts that standard lag-based models struggle with.
Feature Design Logic
The 24 features are organised into five groups, each targeting a specific mechanism by which market conditions propagate to electricity prices:
- Commodity derivatives capture how gas and carbon price momentum signals impending cost pressure on thermal generation. When gas prices rise sharply over 7 or 30 days, gas-fired plants become more expensive, and those costs pass through to electricity prices at the hours when gas plants set the marginal price.
- Volatility regime indicators detect when the market has entered a high-uncertainty state. A model that knows the market is currently in a high-volatility regime can allocate its capacity differently — prioritising tail coverage over point accuracy.
- Price curve shape features encode intraday stress. The ratio of peak to base prices and the steepness of morning and evening demand ramps indicate how much upward pressure exists within a given day, beyond what aggregate daily signals can capture.
- Demand ramps capture sudden load changes that require expensive peaking capacity to respond. When demand rises steeply while gas prices are already elevated, the interaction creates disproportionately high price spikes.
- Multi-week lags provide a longer seasonal reference that the standard 168-hour (one-week) lag cannot capture. Two- and three-week lags help the model anchor to recent seasonal patterns rather than extrapolating from a single week.
New Features
Commodity Derivatives (10 features)
| Feature | Formula | Purpose |
|---|
gas_price_change_7d | gas(t) - gas(t-7d) | Short-term gas momentum |
gas_price_change_30d | gas(t) - gas(t-30d) | Medium-term gas trend |
gas_price_pct_change_7d | (gas(t) - gas(t-7d)) / gas(t-7d) | Normalized gas momentum |
oil_price_change_7d | oil(t) - oil(t-7d) | Oil price momentum |
oil_price_change_30d | oil(t) - oil(t-30d) | Oil price trend |
oil_gas_ratio | oil / gas | Energy substitution signal |
gas_carbon_ratio | gas / carbon | Fuel switching signal |
marginal_cost_gas | gas * 1.9 + carbon * 0.37 | Gas plant breakeven cost |
clean_spark_spread | price - marginal_cost_gas | Generation profitability |
gas_x_residual_demand | gas * residual_demand | Commodity-demand interaction |
Volatility Regime Indicators (5 features)
| Feature | Window | Purpose |
|---|
price_iqr_24h | 24h | Interquartile range — robust volatility |
price_skewness_7d | 7d | Distribution asymmetry (spike tendency) |
extreme_price_count_7d | 7d | Count of hours beyond 2 standard deviations |
vol_regime | 7d | Binary: high-vol if IQR > median IQR |
price_acceleration_24h | 24h | Rate of change of price momentum |
Price Curve Shape (3 features)
| Feature | Purpose |
|---|
price_peak_to_base_ratio | Peak/off-peak ratio — market stress indicator |
price_slope_morning | 06:00–10:00 ramp rate — morning demand pressure |
price_slope_evening | 18:00–22:00 ramp rate — evening peak dynamics |
Demand Ramps (2 features)
| Feature | Purpose |
|---|
demand_ramp_4h | 4-hour demand change — captures ramping events |
demand_ramp_x_gas_price | Demand ramp times gas price — expensive ramps |
Multi-Week Lags (4 features)
| Feature | Purpose |
|---|
price_lag_336h | 2-week lag — captures biweekly patterns |
price_lag_504h | 3-week lag — captures longer seasonal cycles |
price_same_weekday_4w_avg | 4-week same-weekday average — stable seasonal reference |
price_same_weekday_4w_std | 4-week same-weekday std — seasonal volatility |
Configuration
| Parameter | Value |
|---|
| Loss function | Quantile 0.55 |
| Ensemble | 3 models (HistGBT, LightGBM, XGBoost) |
| Features | ~100 (76 from v4.1 + 24 new) |
| Feature selection | No |
| Peak-split | No |
Results
149-day backtest (Oct 2025 – Feb 2026), ensemble models:
| Product | v4.1 MAE | v4.2 MAE | Change |
|---|
| Dayahead | 13.42 | 14.95 | +11.4% (regression) |
| Strategic | 20.78 | 20.36 | -2.0% |
February 2026 (crisis period):
| Product | v4.1 MAE | v4.2 MAE | Change |
|---|
| Dayahead | 9.72 | 8.95 | -8.0% |
The new features help during volatile periods but add noise during stable months (Oct–Jan). Strategic forecasting improved because commodity momentum and multi-week lags are more informative at longer horizons. Dayahead regressed because the 22 additional features increased overfitting risk on a model that was already well-tuned.
Decision: v4.1 remained the production baseline; v4.2 features were retained for the v4.3 feature selection pipeline to prune the noise.