EE + LV + LT as a single energy market. Generation and load profile — 2025 hourly data (energy-charts.info, ENTSO-E). All formulas described in methodology section.
The model simulates the power balance of the combined Baltic system (Estonia + Latvia + Lithuania) for every hour of the year — all 8,760 hours. Each hour is cleared independently, like a real day-ahead electricity market.
It starts from a historical base. The model is anchored on real 2025 data from energy-charts.info (Fraunhofer ISE / ENTSO-E Transparency).
It projects demand into the future. The 2025 hourly load curve is scaled proportionally — a +30% growth assumption multiplies every hour of 2025 by 1.3. The daily and seasonal shape is unchanged; only the amplitude grows.
It recomputes generation by source group, as described below.
Group 1 — Must-run renewables: Wind, Solar, Hydro, Waste. These four are locked to their 2025 behaviour and always dispatch at full available output (price-takers). The model takes the historical hourly capacity factor (CF) — if solar produced 60% of maximum at noon on 15 May 2025, it multiplies that 60% by the new capacity you set with the slider. Their output shape repeats the historical year exactly; only the magnitude scales. Biomass is not in this group — although renewable, it behaves as a dispatchable plant.
Group 2 — Dispatchable plants: Natural gas, Oil shale, Oil-shale gas, Biomass, Other. These do not run on a fixed profile. They bid into the merit order at a price per MWh and switch on only to cover a shortfall, cheapest first. Their CF profile is a ceiling on availability, not their actual output — in a low-demand hour a plant produces 0 even if its 2025 profile was positive.
The three fossil plants (Natural gas, Oil shale, Oil-shale gas) have two modes. With Peaker mode OFF their hourly ceiling is the 2025 CF × new capacity. With Peaker mode ON the ceiling is lifted and they may ramp to 100% of installed capacity. The dashboard opens with Peaker mode ON (base 2035 scenario); it auto-enables on any scenario change and is forced OFF only by “Reset all to 2025 values”. Peaker mode affects only those three fossil plants — Biomass, Other and all must-run sources are unchanged.
Nuclear — BWRX-300 SMR. Each enabled reactor outputs a flat 301.36 MW during operating hours, as a must-run price-taker. Each needs 14 days/year of maintenance (0 MW); a scheduler places the outage in the 14-day window of largest must-run surplus to minimise lost value. With two reactors the two outages do not overlap. The operating-hours output is scaled (315 MW × 92% CF × 8760/8424) so that the annual capacity factor — including the 336-hour outage at 0 MW — equals exactly 92%.
Batteries. Energy capacity is fixed at 2 hours of power (a 200 MW slider = 200 MW / 400 MWh). The battery charges only from Wind/Solar surplus when the price is below the charge threshold (default €40), and discharges only when the price is above the discharge threshold (default €140). Per hour it delivers at most its rated power — a 200 MW / 400 MWh unit gives up to 200 MWh that hour, not the full 400. State of charge starts at 0 on 1 January; round-trip losses are not modelled. The logic is pure price arbitrage: buy cheap solar at noon, sell it back into the expensive evening peak. It never charges from gas or imports, and it discharges only when the market is genuinely tight.
A spring day, 200 MW / 400 MWh battery (charge <€40, discharge >€140). A clear, breezy April day is exactly when the battery earns its keep:
| Hour | System state | Clearing price | Battery action | SoC |
|---|---|---|---|---|
| 02:00 | Night, only wind — covers load | ~€0 (surplus) | Idle: no Wind/Solar surplus above load to spare | 0 / 400 |
| 11:00–13:00 | Solar peak, Wind+Solar > load | €0 (< €40) | Charge +200 MW/h from the VRE surplus | 0 → 400 |
| 14:00–17:00 | Still some surplus, but battery full | €0 | Idle (full); surplus is exported instead | 400 / 400 |
| 19:00–20:00 | Solar gone, evening peak, gas + Polish import on the margin | ~€180 (> €140) | Discharge −200 MW/h, shaving the dearest units | 400 → 0 |
| 22:00 | Peak over, wind covers load again | ~€60 | Idle: price below the €140 discharge trigger | 0 / 400 |
Net result: 400 MWh bought at ~€0 and sold at ~€180, and two evening-peak hours where the battery replaced gas/import — trimming both the clearing price and the deficit risk in the hardest hours of the day.
A December day — why the battery barely helps in the deficit season. On a short, dark winter day solar is near zero and load is high all afternoon, so there is rarely any Wind/Solar surplus and the midday price sits at ~€70–90 (gas/import on the margin) — above the €40 charge threshold. The battery never charges, so it has nothing to discharge into the 17:00–20:00 peak. This is deliberate and important: deficit hours cluster in winter evenings, exactly when the battery is empty. A 200 MW / 400 MWh unit removes a handful of summer-evening price spikes but does not close the winter deficit — that is what dispatchable gas, imports and nuclear are for.
Interconnectors — import. Cables to Finland, Sweden and Poland are merit-order participants, each bidding at the real 2025 hourly day-ahead price of its zone. They are not a last resort: cheap Finnish power (~€40) is dispatched before expensive domestic gas (€200). Import is capped by cable capacity — if 2,200 MW of cables are available but the system is short 3,000 MW, 2,200 MW is imported and the remaining 800 MW is recorded as deficit. Checkboxes add planned links to raise the ceiling.
For each of the 8,760 hours the model asks: do we have enough?
1. Must-run sources (wind, solar, hydro, waste, plus nuclear) dispatch first at full output.
2. Surplus (must-run ≥ load): the excess charges the battery (subject to threshold) and the rest is exported.
3. Shortfall: one merit order is built from all dispatchable plants and all import cables, sorted cheapest-first. The battery discharges ahead of this fill if the provisional price exceeds the discharge threshold, then the remaining gap is filled cheapest unit first.
4. Uncovered: any gap the full merit order cannot close is recorded as deficit — hours when the system fails and load shedding could occur.
The sliders are your investment and planning tool. Moving them virtually builds new plants and retires old ones (e.g. oil shale). Each change instantly recomputes the whole year and answers two questions: how many deficit hours occur and which plants set the market, and what the investment costs (CAPEX).
New build only. Only capacity added after 2025 is charged — keeping capacity flat or reducing it costs €0 (max(0, cap2037 − cap2025)).
Price per MW. Added MW × a fixed unit cost — e.g. ~€0.62 mln/MW for wind or solar, ~€1.00 mln/MW for natural gas, ~€6.35 mln/MW for nuclear (BWRX-300).
System total. These sum to the New-build CAPEX figure (€bn). Unit costs are editable via the CAPEX button. The figure is indicative overnight cost only — it does not affect the physical dispatch or the wholesale price.
Why it differs from new-build. Each technology has a finite service life, after which the plant must be rebuilt — a repeated investment. The CAPEX horizon (N) slider (5–60 years) sets the planning window; the Lifecycle CAPEX KPI accumulates every rebuild that falls inside it.
How it is counted. The number of builds is m = ceil(N ÷ life) — whole rebuild cycles (a build at year 0, then every life years). Each repeat build is discounted to present value at the editable real discount rate (default 5 %/yr): cost × Σk=0..m−1 (1+r)−k·life. With r = 0 this is the plain nominal sum (m × cost); when N ≤ life there is a single build and Lifecycle CAPEX equals New-build CAPEX.
Default service lives (editable, years): wind 25, solar 30, natural gas 30, battery 15, biomass 25, oil shale 35, waste 30, hydro 80, nuclear 60. Like New-build CAPEX, only capacity added over the 2025 base is charged, and the figure does not feed the physical dispatch or the wholesale price.
Each hour the algorithm clears supply against demand like a power exchange, stacking sources cheapest to most expensive.
Price-takers go in first: Wind and Solar (marginal cost €0), plus Nuclear, Hydro and Waste — they always dispatch and accept whatever price clears, even below their own bid.
Surplus hours: the price is set by the most expensive must-run unit still needed to reach load. If zero-cost Wind + Solar already cover demand the price is €0; otherwise priced must-run (hydro, waste or nuclear) sets it.
Deficit hours — the auction: domestic dispatchables (e.g. biomass €100, gas €200) and import cables (each at its real 2025 hourly zone price) queue together by price. The last unit needed to meet demand sets the clearing price for everyone that hour.
Value of Lost Load (VOLL): if everything is exhausted — all plants at 100%, battery empty, every cable full — the remaining gap is a physical deficit, and the clearing price is set to €3,000/MWh (a placeholder; the true Baltic VOLL is ~€10,000/MWh), triggering the dashboard’s red VOLL alert.
Each of the 8 760 hours is cleared independently as a Nord-Pool-style merit order in which domestic generation and imports compete on equal footing. Let the forced must-run output and the residual to be covered be:
Surplus hour (R ≤ 0): must-run alone covers load. The clearing price is the dearest must-run bid still needed to reach load (€0 if zero-cost Wind + Solar already suffice). The battery may charge from VRE surplus; the remainder is exported with no capacity cap.
Deficit hour (R > 0): the dispatchables (Biomass, Oil shale, Oil-shale gas, Other, Gas — each at its hourly ceiling CF·P, or full P under Peaker mode) and the three import zones (each bidding its real 2025 hourly day-ahead price) are stacked cheapest-first until R is met. The marginal dispatched unit sets the clearing price for everyone.
Deficit D(h) is the residual left uncovered after the full merit order, all checked import cables and any battery discharge:
Uncovered energy is priced at a €3 000/MWh value-of-lost-load proxy and raises the VOLL alert. Because imports clear on price rather than as a last resort, modelled import volumes follow economics, not the 2025 physical flows.
For each scalable technology the 2025 hourly CF profile is built from ENTSO-E generation data (energy-charts.info / Fraunhofer ISE) and the installed capacity for that year:
In 2037 the same profile shape is retained; only the installed-capacity slider changes. This preserves hourly wind and solar variability as observed in 2025. CF is not clipped to 1.0 — solar can briefly exceed nameplate due to DC oversizing. Oil-shale gas (EE, 80 MW in 2025) is retort gas — a by-product of oil shale processing — and is exposed as its own slider with an annual CF ≈ 67% (much higher than the dispatchable Natural gas fleet at ≈14% CF, hence the separate bucket).
The demand-growth factor g (slider 0–100%) scales every hour uniformly, preserving the daily and seasonal shape of the 2025 profile. Baltic aggregate load 2025: 26.91 TWh (EE 7.94 / LV 7.20 / LT 11.77).
Each reactor runs at 301.36 MW during operating hours (315 MW nameplate × 92% CF × 8760/8424) except during one 14-day (336 h) planned outage per year at 0 MW. The operating-hours output is scaled up so that the annual average including the outage equals exactly 92% CF (2 538 GWh/reactor) — without the scaling the outage would drag the realised CF down to 88.5%. The outage window is placed automatically in the period of maximum pre-nuclear surplus, minimising lost generation value:
For two reactors the second window is chosen with a ±7-day exclusion buffer around the first, preventing simultaneous outages of both units.
Estonia targets ~4 GW onshore wind by 2030 and up to 1 GW offshore (Saare-Liivi zone). Latvia plans ~0.8 GW onshore wind. Lithuania has tendered 1.4 GW offshore and targets ~5 GW solar by 2030. The model default of 6 GW wind / 8 GW solar by 2037 is a moderate extrapolation of these national targets, consistent with the ENTSO-E National Trends scenario.
↗ European Commission — NECP portalRun-of-river hydro is effectively capped at ~1.73 GW (dominated by Latvia’s Daugava cascade); no major new capacity is planned. Biomass CHP is held near its 2025 level (~490 MW) in the base case, adjustable upward as district-heating plants expand co-firing. The Kruonis pumped-storage plant (900 MW, LT) retains its 2025 dispatch profile. The “Other” bucket covers Lithuanian district-heating and small generators (~160 MW base); adjustable via slider.
↗ Elering ↗ Litgrid ↗ AST LatviaEstonia’s oil-shale fleet (1.22 GW in 2025) is committed to full phase-out under climate-neutrality policy; the slider default is 0 MW by 2037. Coal-derived gas (80 MW, EE) is locked at 2025 output. Natural gas capacity is held near its 2025 ~2.76 GW and runs as a peaker (Peaker mode on by default). BWRX-300 SMRs (315 MW net, 92% CF) are modelled as optional additions; no Baltic country has made a final investment decision as of May 2026.
↗ GE Hitachi BWRX-300The ENTSO-E Ten-Year Network Development Plan 2024 projects Baltic consumption growing from ~27 TWh (2025) to 34–40 TWh by 2037, driven by transport electrification, heat pumps replacing gas boilers, and data-centre load growth in Estonia and Lithuania. The model default of +30% (34.98 TWh) sits at the lower end of this range; raise to +50% to stress-test the system against the higher TYNDP scenario.
↗ ENTSO-E TYNDP 2024Default Imax = 2 200 MW — the existing portfolio: Estlink 1 (350 MW) + Estlink 2 (650 MW) to Finland; LitPol Link (500 MW) to Poland; NordBalt (700 MW) to Sweden. Planned links are opt-in checkboxes that raise the ceiling: Harmony Link (~700 MW, EE–LV–PL submarine cable, target 2028–2030), Estlink 3 (+1 000 MW to FI) and NordBalt 2 (+700 MW to SE3). All cables are assumed simultaneously available — a best-case assumption; real simultaneous availability is lower.
↗ Harmony Link ↗ TYNDP grid projectsAll 2025 generation and load profiles come from energy-charts.info (Fraunhofer ISE), which republishes ENTSO-E Transparency Platform data. Installed capacity figures are ENTSO-E net installed capacity for 2025. Approximately 3.5 TWh/yr of Baltic generation is absent from ENTSO-E data (primarily Lithuanian district-heating CHP), creating a structural coverage gap that makes baseline deficit hours appear slightly higher than actually observed in 2025.
↗ energy-charts.info ↗ ENTSO-E Transparency