Markets III: Commodities, Energy and Crypto · Markets
6Power Markets II: Trading
Forty-five minutes before four o’clock, a wind farm’s forecast for the next hour falls by a third. It sold 100 megawatt-hours for that hour in yesterday’s auction; now it expects to produce 70. It can buy the missing 30 on the continuous intraday market, at whatever price the order book shows, or deliver short and let the grid operator charge it the imbalance price, known only weeks later. Most of the time the difference is a few euros. On a tight evening it can be hundreds. Power trading after the day-ahead auction is the business of managing that difference: forecasts that move, a market that closes shortly before delivery, and a settlement that punishes whoever is wrong. This chapter covers the intraday market, imbalance settlement, the instruments that hedge congestion, the economics of renewable output and its long-term contracts, and batteries.
6.1 Continuous intraday markets
Definition 6.1 (Intraday market, gate closure)
An intraday market trades power for delivery later the same day or the next day, after the day-ahead auction, either continuously in an order book with price–time priority (One Quant Book 1, chapter 19) or in intraday auctions. Its gate closure for an MTU is the last moment at which that MTU can be traded; after it, deviations are settled as imbalances.
Intraday trading exists because forecasts improve as delivery approaches: a wind forecast a day ahead may be off by a fifth of the output, an hour ahead by much less. Each producer and supplier corrects its position as its forecast moves, and prices move with the aggregate forecast error of the zone.
As of September 2026 — European intraday coupling
The Single Intraday Coupling (SIDC), launched on 12–13 June 2018 in fifteen countries, lets orders in one zone match orders in another while cross-border capacity is free. Cross-zonal trading closed 60 minutes before the start of each MTU; a 30-minute cross-zonal gate closure has since gone live on some borders. Trading within a zone can continue closer to delivery, depending on the country.
6.2 Imbalance settlement and balancing responsibility
Definition 6.2 (Balancing responsible party)
A balancing responsible party (BRP) is a market participant, or its representative, that is financially responsible for the difference between the energy it scheduled and the energy it actually injected or withdrew, for a portfolio of connection points, in each imbalance settlement period.
Definition 6.3 (Imbalance volume, imbalance price)
The imbalance volume of a BRP in a settlement period is its metered net injection minus its scheduled net injection: positive when it is long (delivered more than it sold), negative when short. The imbalance price is the price at which the grid operator settles it, derived from the cost of the balancing energy the operator activated in that period.
Under a single price, a long BRP is paid the imbalance price for its surplus and a short one pays it for its deficit. When the system as a whole is short, the operator activates upward reserves and the imbalance price is high: being short then is expensive, and being long is rewarded. The imbalance price is therefore a penalty only for those who move in the same direction as the system, and a BRP whose error has the opposite sign earns from it. Most European systems settle imbalances per 15 minutes; Germany computes one uniform price per quarter-hour for all its balancing groups.
Example 6.4 (A wind farm’s afternoon)
A wind farm sells 80, 90, 100 and 100 MWh day-ahead for four hours at 62, 58, 55 and . Before the last hour its forecast falls by 30 MWh and it buys 30 back at intraday. It meters 82, 88, 101 and 55 MWh; the imbalance prices are 60, 75, 50 and . Its trading revenue is EUR 16 280 (the day-ahead sales less the buy-back), and its imbalances (, , and MWh) cost it EUR 3 580, nearly all in the last hour, when it was short while the system was short too: EUR 12 700 in all.
6.3 Transmission rights and virtual bids
In nodal markets a generator is paid its node’s price and a supplier pays its load’s, so congestion between them is a risk the market lets them hedge.
Definition 6.5 (Financial transmission right)
A financial transmission right (FTR) from node to node entitles its holder, for each hour of its term, to a quantity times the day-ahead congestion price at minus that at : a payment when the path is congested in the direction of the right, and, for an obligation, a charge when it is congested the other way. It is sold by the grid operator in auctions and funded by the congestion rents it collects.
A generator at selling to a load at at a fixed price owns the congestion risk between them; an FTR from to turns it into a fixed auction price.
Definition 6.6 (Virtual bid)
A virtual bid is a purely financial position in a two-settlement market: an offer to sell (an increment offer) or a bid to buy (a decrement bid) at a node in the day-ahead market, liquidated automatically at the real-time price, with no physical delivery.
A trader who expects real-time prices at a node to exceed day-ahead prices buys day-ahead with a decrement bid and is paid the difference; the market wants this, because it pulls the day-ahead price towards the expected real-time price. The same trades can manipulate: a virtual that loses money on its own but raises the value of the trader’s FTRs on the same path is the classic abuse, and PJM’s rules withhold FTR payments in such cases.
6.4 Renewable output, capture prices and power purchase agreements
A wind farm or a solar park does not choose when to produce. What it earns on the spot market is not the average price but the average weighted by its own output.
Definition 6.7 (Capture price)
The capture price of a generator over a period is the average of the market price weighted by its output, ; its capture rate is the capture price divided by the time-weighted average (baseload) price.
Solar parks in one zone all produce in the same hours, which are the hours they push the price down (Chapter 5): the more solar is built, the lower its capture rate. In the German data, solar’s capture price was in 2024 against a baseload average of (a capture rate of 59%), and against in 2025 (52%); onshore wind captured 82% and 87% (Figure 6.2).
Definition 6.8 (Power purchase agreement, shape risk)
A power purchase agreement (PPA) is a long-term contract under which a buyer, often a large consumer, buys a generator’s output (or a financial equivalent) at an agreed price for years. Shape risk is the risk that the profile of the delivered output differs in value from a baseload block of the same volume: in a pay-as-produced PPA it falls on the buyer, in a baseload PPA on the seller, who must buy in the hours it does not produce.
A pay-as-produced solar PPA at was a good hedge for a buyer in 2024 only if it valued the output at its capture price: at a capture price of 46, the buyer paid about EUR 14 a MWh above the market value of what it received.
As of September 2026 — How much is contracted and stored
Pexapark counted about 6.08 GW of renewable capacity contracted under PPAs in Europe in the first half of 2025, in 124 deals, 26% less than a year earlier. In Texas, a presentation to ERCOT’s Technology and Security Committee in February 2026 put installed and operating battery capacity at 15 712 MW, over 6 000 MW of it added in the previous year.
6.5 Batteries and flexible assets
Definition 6.9 (Round-trip efficiency)
The round-trip efficiency of a storage asset is the energy it returns divided by the energy it took to charge it; the rest is lost in conversion.
A battery buys cheap hours and sells dear ones. With perfect foresight of day-ahead prices, its best schedule each day is a small dynamic programme over its state of charge, a problem of the kind One Quant Book 4, chapter 9, treats in general.
Method 6.10 (Day-ahead arbitrage of a battery)
Discretise the state of charge in steps of one hour at full power. For each hour, from the first, keep for each reachable state (charge level, cycles used) the best cash so far; move by charging (pay the price for times the energy stored), discharging (receive the price for times the energy released) or idling; at the end of the day take the best empty state.
A 100 MW, 200 MWh battery with a round-trip efficiency of 88% and one full cycle a day (illustrative figures) would have earned, with perfect foresight of the German day-ahead prices, EUR 65 968 per MW in 2024 and EUR 74 546 per MW in 2025; allowing two cycles a day raises 2025 to EUR 88 688. Perfect foresight overstates what a real operator earns from the auction alone, while intraday markets and reserves add revenues this calculation omits.
6.6 Tutorial: settling a day and running a battery
Goal. Settle a producer’s day and schedule a battery against day-ahead prices. End state: Example 6.4, Figures 6.3 and 6.4 and the annual revenues per MW.
Settlement and capture.
def settle(volume: float, price_long: float, price_short: float | None = None) -> float: """Cash from the operator for an imbalance: a long position is bought by the operator at the long price, a short one is sold to the group at the short price (single price if one is given).""" p = price_long if volume >= 0 or price_short is None else price_short return volume * p def day_settlement(sales: dict[int, tuple[float, float]], metered: dict[int, float], imbalance_price: dict[int, float]) -> dict[str, float]: """A producer's day: `sales` maps MTU to (MWh sold, price), `metered` its actual output. Returns trading revenue, imbalance cash and the total.""" revenue = sum(q * p for q, p in sales.values()) imb = sum(settle(metered.get(m, 0.0) - sales.get(m, (0.0, 0.0))[0], imbalance_price[m]) for m in imbalance_price) return {"revenue": revenue, "imbalance": imb, "total": revenue + imb} def capture_price(prices: list[float], output: list[float]) -> float: """Output-weighted average price: what a producer with this profile earned per MWh on the spot.""" total = sum(output) if total <= 0: raise ValueError("no output") return sum(p * q for p, q in zip(prices, output, strict=True)) / totalListing 6.1. Imbalance settlement, a producer’s day and the capture price. code/firm/balancing/firm_balancing.py The battery. Method 6.10.
def battery_plan(prices: list[float], max_cycles: int = 1) -> tuple[float, list[int]]: """Best day-ahead arbitrage of the battery over one day with perfect foresight, and its actions (+1 charge, -1 discharge, 0 idle, one per hour). States of charge 0, 100, 200 MWh; one hour at full power moves 100 MWh; start and end empty; at most `max_cycles` full cycles (two charging hours each). Charging draws 100/sqrt(RTE) MWh; discharging delivers 100*sqrt(RTE) MWh.""" eta, step = math.sqrt(RTE), POWER_MW levels = int(ENERGY_MWH // step) best: dict[tuple[int, int], tuple[float, list[int]]] = {(0, 0): (0.0, [])} for p in prices: nxt: dict[tuple[int, int], tuple[float, list[int]]] = {} for (s, c), (v, path) in best.items(): for a in (-1, 0, 1): s2, c2 = s + a, c + (a == 1) if not 0 <= s2 <= levels or c2 > 2 * max_cycles: continue cash = -p * step / eta if a == 1 else p * step * eta if a == -1 else 0.0 if (s2, c2) not in nxt or v + cash > nxt[(s2, c2)][0]: nxt[(s2, c2)] = (v + cash, path + [a]) best = nxt return max((vp for (s, _), vp in best.items() if s == 0), key=lambda vp: vp[0])Listing 6.2. Best day-ahead schedule of a battery by dynamic programming. code/markets-3/06-power-markets-trading/python/m3_trading.py - Run
m3_trading.wind_day(),capture(2025),battery_year(2025)andfig_trading.py.
What to change next. Replace perfect foresight by yesterday’s prices as the forecast and measure the revenue lost; let the battery bid 15-minute products in the auction from October 2025.
6.7 Build: the balancing-group keeper
Purpose. The miniature firm runs a balancing group for its wind, solar and battery assets: it must know, per MTU, what it has scheduled, what it metered, what it owes the grid operator, and what its output was worth on the spot market.
Interface. BalancingGroup.trade(mtu, qty, price), schedule_production, schedule(mtu); imbalance; settle(volume, price_long, price_short); day_settlement(sales, metered, imbalance_price); capture_price(prices, output).
Rules. Positive quantities are energy into the group; a long imbalance is sold to the operator, a short one bought from it, at a single price unless two are given; capture price is undefined without output.
Acceptance tests. code/firm/balancing/tests/: a balanced producer; the signs of imbalances and their cash; a day’s settlement; a capture price.
Stretch. Quarter-hour MTUs; dual imbalance pricing; the nominations of Chapter 13 built from this keeper.
Sources and further reading
- ENTSO-E, Single Intraday Coupling; Austrian Power Grid, “SIDC: successful go-live of the 30-minute gate closure time in cross-zonal intraday trading”.
- German TSOs, Description of the balancing process and the balancing markets in Germany; netztransparenz.de, uniform imbalance price (reBAP).
- PJM, Financial Transmission Rights; PJM Manual 06 and the FTR forfeiture rule.
- Bundesnetzagentur | SMARD.de, hourly prices and generation 2024–2025.
- Pexapark, “Unpacking H1 Deal Flow” (2025); M. Stover (TSSA), “Understanding Battery Energy Storage Systems — Current and Future”, presentation to the ERCOT Technology and Security Committee, 9 February 2026.
6.8 Exercises
Exercise 6.1 ★
A solar park produces 10, 40, 40 and 10 MWh in four hours priced 80, 20, 10 and . Give its capture price, the baseload price and its capture rate.
Exercise 6.2 ★
A BRP is 20 MWh short in a quarter-hour whose imbalance price is . What does it pay? What would it have received had it been 20 MWh long?
Solution
Solution of Exercise 6.2.
It pays EUR 6 000. Long by 20 MWh it would have received EUR 6 000 under a single price.
Exercise 6.3 ★
Why does intraday trading exist at all, if the day-ahead auction already sets a price for every hour?
Solution
Solution of Exercise 6.3.
Positions are set a day ahead on forecasts that keep changing: wind, solar, demand and plant outages. Intraday trading lets each party correct its position as its forecast improves, instead of paying imbalance prices for the whole error.
Exercise 6.4 ★★
An FTR of 50 MW from node to node is held for one day. The day-ahead congestion prices are at and at in 10 hours, and equal otherwise. What does it pay?
Solution
Solution of Exercise 6.4.
EUR 10 000.
Exercise 6.5 ★★
In the battery of the text, what is the revenue of one day on which the two cheapest hours cost and the two dearest pay , with the dearest after the cheapest?
Solution
Solution of Exercise 6.5.
It draws MWh at , paying EUR 4 264, and delivers MWh at , receiving EUR 22 514: EUR 18 250.
Exercise 6.6 ★★
A buyer signs a pay-as-produced solar PPA at for 100 GWh a year. Using the 2025 capture price, what does the PPA cost it above the spot value of the output?
Solution
Solution of Exercise 6.6.
EUR 1.39 million a year.
Exercise 6.7 ★★★
Coding. With battery_year, give the annual revenue per MW for 2024 and 2025 with one cycle a day, and for 2025 with two.
Solution
Solution of Exercise 6.7.
EUR 65 968 per MW in 2024 and EUR 74 546 in 2025 with one cycle a day; EUR 88 688 in 2025 with two.
Exercise 6.8 ★★★
Find the flaw. “Our backtest shows the battery earns EUR 75 000 per MW a year on day-ahead prices; that is what we will earn.”
Solution
Solution of Exercise 6.8.
The backtest assumes perfect foresight of the day’s prices, a price-taking battery that does not move the auction, and no degradation, outages or fees; real operators forecast, and their own bids narrow the spreads they trade. It also ignores the intraday and reserve revenues that may matter more. Treat it as an upper bound on day-ahead revenue.
6.9 Problem: A Battery’s Year
Problem 6.1
Weekend problem — 100 MW / 200 MWh in the German day-ahead market
An investor considers a 100 MW, 200 MWh battery with a round-trip efficiency of 88%, allowed one full cycle a day, trading only the German day-ahead auction with perfect foresight.
Part I — One day.
- On 18 June 2025, when does it charge and discharge, and why then?
- How much energy does it draw from the grid, and how much does it deliver?
- What does it earn that day?
- Why does it charge at negative prices rather than at zero?
- What would a second cycle have added?
Part II — The year.
- Give the revenue per MW in 2024 and in 2025.
- Why was 2025 better?
- What does a second daily cycle add in 2025?
- Why does revenue concentrate in some months?
- What does the efficiency cost, roughly, on a day like 18 June?
Part III — Realism.
- Why does perfect foresight overstate revenue?
- What revenues does the calculation leave out?
- What happens to these spreads when many batteries are built?
- How do cycles limit the battery’s life, and why cap them?
- What would a 15-minute market change?
Part IV — Judgement.
- Why do solar capture rates and battery revenues move together?
- Who else competes for the midday cheap hours?
- Is the day-ahead spread a durable revenue?
- State the named result: the battery’s day-ahead arbitrage revenue per MW-year.
- In one sentence: what does a battery sell?
Solution
Solution of Problem 6.1.
1. It charges from 14:00 to 16:00 (prices and ) and discharges from 20:00 to 22:00 (140.99 and 175.32): the cheapest pair of hours followed by the dearest pair. 2. It draws 213.2 MWh and delivers 187.6 MWh. 3. EUR 30 149. 4. At a negative price it is paid to charge; the lowest prices were negative that afternoon. 5. EUR 760 more: the second-best spread that day was small. 6. EUR 65 968 in 2024 and EUR 74 546 in 2025 per MW. 7. More negative and near-zero midday hours as solar grew, and high evening prices: the daily spread widened. 8. EUR 14 142 per MW. 9. Spreads are widest when solar is high and evenings are tight (spring and summer) and in volatile winter weeks. 10. Without losses it would have earned EUR 32 078 on 18 June: the 12% loss costs about EUR 1 929. 11. Real schedules are made on forecasts; a price-maker’s bids also move the prices it trades. 12. Intraday arbitrage, balancing reserves (capacity payments), imbalance optimisation for a portfolio, and grid services. 13. They narrow: more buyers at midday raise the cheap prices, more sellers in the evening lower the dear ones. 14. Each cycle wears the cells; capping cycles trades revenue today against capacity later. 15. More, shorter price steps to arbitrage, and a better match to the battery’s fast response. 16. Both come from the same midday price collapse: what lowers solar’s capture price widens the spread batteries trade. 17. Other batteries, pumped hydro, flexible industrial demand, electrolysers and exporters. 18. Only while solar keeps outgrowing flexibility; it erodes as storage is built. 19. Named result: EUR 74 546 per MW in 2025 (EUR 65 968 in 2024), one cycle a day, perfect foresight. 20. Moving energy in time: it buys the hours others cannot use and sells the hours they cannot serve.
6.10 Interview questions
Interview question 6.1 ★ trader
What is an imbalance price, and when is being short cheap?
Solution
Solution of Interview question 6.1.
The price at which the grid operator settles a party’s deviation from its schedule, derived from the balancing energy it activated. Being short is cheap when the system is long: the imbalance price is then low (even negative), so buying the missing energy from the operator costs little.
What the interviewer is looking for: system direction drives the price; the sign of your error relative to the system’s.
Interview question 6.2 ★ trader, researcher
Why is the capture price of solar lower than the baseload price, and why does it keep falling?
Solution
Solution of Interview question 6.2.
Solar produces in the same hours as all other solar, and those hours’ prices fall as solar output rises; the output-weighted price is therefore below the time average. Each new solar park deepens the midday price fall, so the capture rate keeps falling unless storage or demand absorbs it.
What the interviewer is looking for: self-cannibalisation.
Interview question 6.3 ★★ researcher
How would you value a ten-year pay-as-produced wind PPA?
Solution
Solution of Interview question 6.3.
Forecast the hourly output profile (weather, degradation, curtailment) and the hourly price curve for ten years (fundamental or scenario models); value the output at its capture price, not the baseload; add imbalance and shape costs; discount; compare with the PPA price; stress the price scenarios and the correlation between output and price.
What the interviewer is looking for: capture price, profile and correlation, scenarios.
Interview question 6.4 ★★ trader
Explain a virtual bid, and how it could be used to manipulate.
Solution
Solution of Interview question 6.4.
A financial day-ahead position at a node, settled at the real-time price: it arbitrages the day-ahead/real-time spread and aligns the two. It can be used to move day-ahead congestion to benefit a trader’s FTRs, losing on the virtual and gaining more on the rights; rules withhold FTR payments when that pattern appears.
What the interviewer is looking for: convergence role, and the FTR cross-product manipulation.
Interview question 6.5 ★★ risk
A wind portfolio’s forecast error is 10% of output. What determines its expected imbalance cost?
Solution
Solution of Interview question 6.5.
The error’s size and, more, its correlation with the system’s imbalance and hence with the imbalance price: an error in the system’s direction is costly, one against it is rewarded. A portfolio whose errors correlate with the zone’s (all wind forecasts wrong together) pays most.
What the interviewer is looking for: correlation with the system, not only variance.
Interview question 6.6 ★★★ developer, researcher
Design the optimiser that bids a battery in the day-ahead auction, the intraday market and a reserve market at once.
Solution
Solution of Interview question 6.6.
A stochastic optimisation over price scenarios for the three markets, with the battery’s power, energy, efficiency and cycle constraints, reserve capacity commitments that remove headroom, and sequential decisions (day-ahead first, intraday and reserves later): a two-stage or rolling model, solved as a linear programme per scenario set, with degradation cost per cycle.
What the interviewer is looking for: co-optimisation, sequential markets, constraints and uncertainty.