I spent a month building a small version of the models that decide when Norway’s water becomes electricity. The model was wrong in the most useful way possible, and the biggest thing it taught me had nothing to do with rain.
Here is a question that sounds simple: if you own a full reservoir in southern Norway, should you run your turbines today?
The water is free. It fell from the sky. So you might think the answer is “yes, whenever the price is above zero.” But that’s wrong, and the reason it’s wrong is the most interesting idea in the Nordic power market.
Water you release today is water you can’t release in February, when it’s cold, demand is high and prices might be three times higher. Every drop in the reservoir is an option on a future price. The question is never “is today’s price good?” It’s “is today’s price better than what this water is worth if I wait?”
That number, what the water is worth if you wait, is called the water value. Almost all of Norway’s power comes from hydro, so water values set the price most of the time. They decide what you pay for electricity, when producers fill and empty their reservoirs, and whether a new turbine or battery is worth building.
The big producers calculate water values with large, industrial models. I wanted to understand those models from the inside, so I built a small one myself for NO2, the southern Norwegian bidding zone that sits on the cables to Germany, the Netherlands, Denmark and the UK.
Finding water that nobody publishes
I expected the maths to be the hard part. It wasn’t. The hard part was the data.
To value water, you need to know how much water arrives each week. That’s called inflow, and for NO2 it isn’t published. So I rebuilt it from a simple balance: water that arrives is water you store plus water you use. From NVE’s reservoir statistics I took the change in storage each week. From ENTSO-E I took what the hydro plants actually produced. Add them together and you get inflow.
The first sanity check was whether the result looked like Norway. It did. Average inflow came out at about 46 TWh a year. 2020 came out as the wettest year at about 55 TWh, and 2021 as the driest at about 34. Anyone who followed Nordic power prices in 2021 remembers that dry year.
Along the way the data fought back in ways I hadn’t planned for:
- Before October 2018, Germany and Austria were one price zone, so “the German price” has a different name before that date.
- Two new cables came online in the middle of my test period: NordLink to Germany in December 2020 and the North Sea Link to the UK in October 2021. A model that assumes today’s cables in 2019 is simply wrong.
- In 2025 the market moved from hourly to 15-minute prices, which quietly breaks anything that assumes 24 values per day.
None of this is glamorous. But it’s where a forecast becomes good or bad. I ended up with quality flags on every week of data and 18 tests, most of which check one boring, essential thing: that water never appears or disappears inside the model.
How the model thinks
The model works in two layers.
The first layer decides how much water to use each week. It looks at ten years of historical inflow as possible futures, and works backwards from the end of the year using stochastic dynamic programming. For every reservoir level and every week, it asks: what is one more unit of water worth if I keep it? That’s the water value.
Then it sets a price. If the cables to the continent have spare capacity, NO2 simply imports the German price. If the cables are full of exports, Norway is cut off and the price falls to the water value. If they’re full of imports, the price rises to it. And if there is genuinely not enough power, the price hits a scarcity ceiling.
The second layer zooms in to individual hours. It takes the weekly water budget from the first layer and decides, hour by hour, when a single plant should run its turbine, pump water back up, or charge a battery. That layer answers a different question: not “what will the price be?” but “what is a piece of flexible equipment worth?”
The miss that taught me the most
I tested the model properly. For each year from 2020 to 2025, I removed that year from the inflow scenarios, started the reservoir at its real level, and let the model run the year blind. No peeking.
The first version failed in a spectacular way. In 2022 it drained the reservoirs to 28% by the end of the year. In reality they ended at 63%.
It’s tempting to tune a few parameters until the numbers look nice. Instead I asked what producers know that my model didn’t. The answer is that real producers are afraid. A model that only maximises expected value happily runs the reservoir down in a crisis year, because on average it pays off. A real company can’t afford to be empty in March. It holds water back as insurance.
So I added that fear in the simplest way I could: a minimum filling curve taken from history, the level reservoirs very rarely go below, with a penalty for crossing it. I calibrated it on years before the test period, so the test stayed honest.
| Risk-neutral | With minimum curve | |
|---|---|---|
| Filling error, calibration years | 12.3 pp | 4.5 pp |
| Filling error, years the model never saw | 9.7 pp | 2.8 pp |
With that one change, the model got the annual price within about 5 EUR/MWh in five of six years. 2022 is still off by about 21 EUR, and I think that’s fair. 2022 was the year of the gas crisis, and a model with one reservoir and a single German price doesn’t know about European panic.
I also tried a more sophisticated form of risk aversion, a CVaR tilt that weights bad scenarios more heavily. It made the model hoard far too much water. Sometimes the simple fix is the right one.
What a turbine, a pump and a battery are worth
With the hourly layer, I could ask the question that keeps investment analysts busy: if you could add one thing to a large hydro plant, what should it be?
Using real prices from 2023 to 2025, I compared three options:
- 200 MW of extra turbine capacity earned about 100,000 EUR per MW per year.
- A 200 MW pump earned about 34,000 EUR per MW.
- A 100 MW, two-hour battery earned about 32,000 EUR per MW.
The extra turbine won by a factor of three, and the ranking held in all three years. The reason is that Nordic hourly prices are relatively flat. A battery or a pump earns money from the gap between cheap and expensive hours, and in Norway that gap is usually small. More turbine capacity earns money from something more valuable: being able to use the water in the best hours of the week.
These numbers are upper bounds, because the model sees prices perfectly in advance. And they miss something important: extra turbine capacity is also worth the water you no longer lose over the spillway during snowmelt. My weekly model doesn’t capture that yet. So if anything, the case for the turbine is understated.
The surprise: it’s not the rain
The last thing I built was a price fan: a five-year forecast for NO2 from 2027 to 2031, run across ten historical inflow paths and two scenarios for the German price.
Using current German forward prices, the median NO2 price came out at about 112 EUR/MWh in 2027 and about 89 from 2028 onwards. But the number itself wasn’t the interesting part. The interesting part was what moved it.
A change of about 16 EUR in the German price moved NO2 by about 14 EUR. The whole range of Norwegian hydrology, from the wettest year to the driest, moved it by less than half that.
I find that genuinely surprising. In a country built on water, it’s natural to think the weather decides the price. Over five years, my model says otherwise. Once the cables are in place, the assumptions you make about the continent matter more than the assumptions you make about the rain. If you want to know what Norwegian power will cost, you need to understand German gas, carbon and solar at least as well as Norwegian snow.
Why this matters
Most people in Norway have opened a power bill in the last few years and wondered why it looked the way it did. The answer runs through models like this one. Water values decide when reservoirs are emptied and filled, which decides the price, which decides your bill. The same models decide which turbines, pumps and batteries get built, and so which flexibility the system will have in ten years.
These models are usually invisible: large, proprietary and run by a small number of specialists. Building a small one myself didn’t make me an expert in the industrial versions. But it did teach me what they’re doing, where they can go wrong, and what questions to ask of them.
What the model doesn’t do
To be clear about the limits:
- It treats NO2 as one big reservoir. Real systems are cascades of linked reservoirs and plants.
- It uses a German price as given, rather than modelling the continent.
- It sees hourly prices perfectly in the investment layer, so the values are upper bounds.
- It doesn’t yet value spill, which understates the turbine case.
Those are the next things I’d fix. But the version that exists is honest about what it is, it’s tested, and it’s open.
The code, figures and documentation are on GitHub. If you work with water values for a living and think I’ve got something wrong, I’d genuinely like to hear it.





Leave a Reply