CS/RES/02 · 26 May 2026 · 3 min read

Weather as a price driver.

European day-ahead power is mostly a meteorology problem.

European electricity markets clear by merit order. Cheapest available capacity gets dispatched first, expensive peakers last, and the marginal unit sets the price for everyone in the zone. Wind and solar have near-zero marginal cost, so they always dispatch when they're available. The consequence: when the wind is blowing in Germany but not in France, the German day-ahead price gets pushed down relative to the French, and the cross-border spread widens. Given a weather forecast you have, to a first approximation, a forecast of that spread.

The mechanism is in the textbooks. It's reproducible from public data and well-documented in academic energy economics. You don't need machine learning to find this edge — you need to be willing to take it seriously enough to engineer the features properly.

Plot 02 · Merit order
Same demand, different wind days, different clearing prices
150 115 80 45 10 €/MWh 0 20 40 60 80 CUMULATIVE SUPPLY (GW) Demand 55 GW ≈ €45 ≈ €115 WIND · SOLAR · NUCLEAR GAS PEAKERS
High-wind day Low-wind day
Schematic. Same residual demand, different available wind/solar supply pushes gas and peakers further into the merit order on low-wind days, and the day-ahead auction clears at a much higher price. The spread between zones with different wind conditions is what the strategy trades.

We don't trade the prices. We fit a regression of zone spread on weather-derived features (wind capacity weighted by forecast wind speeds, solar irradiance, residual load), then trade the residual — the gap between the spread the weather predicts and the spread the market is actually offering. When the residual is large, mean reversion is the prior. When it's small, we don't trade.

We backtested on six years of EPEX day-ahead prices, 2018–2024, across DE, FR, ES, IT, and DK — ten pair combinations. The strategy was profitable every year out-of-sample including 2022, when most commodity strategies blew up alongside the European gas crisis. Correlation to S&P 500 and Eurostoxx is roughly zero. It's market-neutral in the structural sense, not the disguised-beta sense.

We're not going to publish a Sharpe number for a strategy that isn't live yet. The honest version: promising in-sample, paper trading in progress, live deployment pending. Numbers come when the track record does.

Field note · Look-ahead bias
The EPEX day-ahead auction closes at 12:00 CET. The NOAA GFS 12z weather forecast — the one most people think of as "today's forecast" — publishes at 16:30 UTC, four hours after gate closure. Using it in a live system after backtesting with the 00z cycle would have been a quietly fatal bug. Backtest PnL would look real; live PnL would be statistically real only because of look-ahead. We caught this in our own code. Backtest archive read CYCLE=0, live deployment script defaulted to CYCLE=12. Same author, same week, two different code paths. The lesson isn't "don't make mistakes." It's that you have to read your own code with suspicion before money sees it, especially the parts you wrote quickly.

Two structural constraints we've written down before deploying. The cross-zonal offpeak books aren't infinitely deep — slippage rises non-linearly past a certain size, so this strategy is capacity-constrained by design. And merit-order economics are robust to weather variability but fragile to structural changes in the supply stack: utility-scale battery storage, new nuclear capacity, or regulatory changes to cross-border allocation could each erode the chain. We've written down which signals would tell us to stop.

The mechanism is in the public economics literature. The implementation isn't.

Causal Systems  ·  CS/RES/02  ·  Data: EPEX SDAC, Energy-Charts (Fraunhofer), Open-Meteo, NOAA NOMADS
Push back, point out something we missed, or just say hi → hello@causalsystems.co
Continue reading
CS/RES/01
Fertilizer to food.
CS/RES/03
News sensitivity by asset class.
CS/RES/04
Cocoa, coffee, sugar.