Baltic Energy Market Model

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.

Scenario inputs

34.98 TWh+30%2025: 26.91 TWh

30 yrreinvestment period
Installed capacity
SourceCapacityPrice2025 (MW)
6,000 MW+80%3 340
8,000 MW+48%5 390
1,730 MW+0%1 730
70 MW+0%70
490 MW+0%490
0 MW-100%1 220
0 MW-100%80
160 MW+0%160
2,760 MW+0%2 760

200 MWnew 400 MWh
Charge / discharge logic€/MWh
from Wind/Solar surplus
sell to grid

Nuclear (BWRX-300 SMR | 315 MW, CF 92%)
€/MWh
No NPP — no maintenance scheduled
14-day maintenance window placed automatically in the period of maximum surplus.

Interconnectors
Each line bids into the merit order at its zone's hourly day-ahead price (ENTSO-E 2025). Annual mean shown next to capacity. Uncheck to disable.
Estlink 1 (EE↔FI)350 MWavg €40
Estlink 2 (EE↔FI)650 MWFI prices
+ Estlink 3 (planned ~2035)+1 000 MWFI prices
FI price × multiplier
LitPol Link (LT↔PL)500 MWavg €104
+ Harmony Link (LT↔PL, ~2030)+700 MWPL prices
PL price × multiplier
NordBalt (LT↔SE3)700 MWavg €46
+ NordBalt 2 (planned, hypothetical)+700 MWSE3 prices
SE3 price × multiplier
Total import capacity
2,200MW

When ON, Gas, Oil shale and Oil-shale gas (EE) may dispatch up to full installed capacity every hour, ignoring their 2025 CF profile cap. Biomass, Other and all must-run/VRE techs are unchanged. ON by default for the 2035 scenario; "Reset all to 2025 values" turns it OFF to show observed 2025 dispatch.

CAPEX cost & lifetime

Overnight unit cost (mln €/MW) and service life (years) per source. Cost is charged on capacity added over the 2025 base. Service life sets how many times that build repeats within the horizon N; repeat builds are discounted to present value.
%/yr
Sourcemln €/MWLife, yrtCO₂/MWh
Deficit hours
h/yr
Deficit energy
GWh
Peak deficit
MW
Import
GWh
Surplus
GWh
Avg price
€/MWh
Median price
€/MWh
New-build CAPEX
€bn
Lifecycle CAPEX (30yr)
€bn

Daily Average Generation vs Load (MW)

Daily averages by source (stacked area) and demand (black line). Nuclear includes scheduled maintenance. Click any day to inspect that day's merit order below.

Merit Order Curve (annual average)

Step plot of supply: each block = source capacity × availability factor, sorted by price. Dashed line = mean wholesale price.

Monthly wholesale price forecast (€/MWh)

Mean (bars) and median (line) hourly day-ahead price by month, derived from the Nord-Pool merit-order simulation.

Energy mix (TWh)

Monthly balance (GWh)

Load, generation and post-import deficit by month.

Deficit duration curve

Hours ordered by descending deficit (only hours > 0).

Hours by balance type

Core principle

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.

How the model is built

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.

Generation sources

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:

HourSystem stateClearing priceBattery actionSoC
02:00Night, only wind — covers load~€0 (surplus)Idle: no Wind/Solar surplus above load to spare0 / 400
11:00–13:00Solar peak, Wind+Solar > load€0 (< €40)Charge +200 MW/h from the VRE surplus0 → 400
14:00–17:00Still some surplus, but battery full€0Idle (full); surplus is exported instead400 / 400
19:00–20:00Solar gone, evening peak, gas + Polish import on the margin~€180 (> €140)Discharge −200 MW/h, shaving the dearest units400 → 0
22:00Peak over, wind covers load again~€60Idle: price below the €140 discharge trigger0 / 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.

Clearing the balance each hour

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.

What the sliders control

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).

Build cost (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.

Lifecycle CAPEX over N years

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.

Energy price — Merit Order logic

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.

Hourly market clearing

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:

F(h) = Σmr CFmr(h) · Pmr  +  Gnuclear(h)   [must-run = Wind, Solar, Hydro, Waste, Nuclear]
Gnuclear(h) = N · 301.36 MW   [outside maintenance window]
R(h) = L(h) − F(h)

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:

D(h) = max( 0,  R(h) − Σdisp Gmaxdisp(h) − Σzone Icapzone − disch(h) )

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.

Capacity-factor profiles

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:

CFt(h) = GBAL,t(h) / Pinst,2025t

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).

Load scaling

L2037(h) = L2025(h) · (1 + g)

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).

BWRX-300 maintenance placement

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:

Bpre(h) = Gtech(h) − L2037(h)
t* = argmaxt  Σh=tt+335 max(0, Bpre(h))

For two reactors the second window is chosen with a ±7-day exclusion buffer around the first, preventing simultaneous outages of both units.

Wind & Solar

NECP EE / LV / LT · 2023–2024

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 portal

Hydro, Biomass & Other

NECP · Elering · Litgrid

Run-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 Latvia

Fossil & Nuclear

NECP EE · GE Hitachi

Estonia’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-300

Electricity Demand

ENTSO-E TYNDP 2024

The 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 2024

Interconnections

Elering · AST · Litgrid · ENTSO-E

Default 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 projects

Data Sources

energy-charts.info · ENTSO-E

All 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