Introduction
In one of our last blog posts, we explored how battery energy storage systems (BESS) can be strategically optimized within the spot market, leveraging price fluctuations in Day-Ahead, Intraday Auction, and Intraday Continuous markets to generate revenue. This optimization, often referred to as energy arbitrage, involves buying electricity when prices are low (e.g., during periods of high renewable generation and/or low demand) and selling it when prices are high (e.g., during peak demand and/or low generation). The agility and responsiveness of modern battery systems make them ideal for these rapid trading opportunities, contributing to a more efficient and flexible energy system.
However, the value proposition of battery storage extends far beyond mere wholesale energy arbitrage. To truly unlock the full economic potential of these assets and maximize their contribution to grid stability, it is crucial to consider their participation in ancillary services markets. These markets are indispensable for maintaining the delicate balance and reliability of the electricity grid. They provide essential functions to ensure that the frequency remains stable, and the voltage stays within safe limits. By participating in these markets, battery owners can ‘stack’ different revenue streams, a strategy known as value stacking, significantly enhancing the profitability and overall utility of their assets.
We optimize & trade your battery energy storage system (BESS)
Our track record in the optimization and trading of flex and renewables assets, combined with the longest trading experience on German short-term markets, guarantees you maximum revenues through unique trading strategies.
Unlocking Additional Revenue: The Ancillary Services Markets in Detail
To illustrate how battery storage can generate additional revenue streams from ancillary services, let’s consider an example which builds upon the one discussed in the blog post cross-market arbitrage in wholesale markets.
It’s important to note that this is a simplified illustration, designed to convey the underlying logic, and not reflective of a real-trading day where our continuously optimizing algorithms participate in these markets simultaneously. This is mainly because, in real trading, the constant and recurring calculation of opportunity costs while participating in both wholesale and ancillary services markets makes for a highly complex process, which is difficult to replicate in a simple and easy-to-follow manner.
If you read the previous blog, you probably remember that in wholesale markets we effectively do a piecewise calculation where we move from one market to the other and assess whether a better trade (higher sell position or lower buy position) can be executed. This means that we start by taking a position in the Day-Ahead Auction, then move on to the Intraday Auction and check whether there are better prices and trade in and out of positions accordingly. Overall, we stay within the same wholesale market.
However, when participating in ancillary services, we must reserve capacity for frequency containment and restoration, regardless of whether we are actually called upon to deliver or offtake energy. As a result, partaking in these markets then becomes a calculation of opportunity costs.
Let us understand this with an example.
Let’s say that on a given day we want to participate in Frequency Containment Reserve (FCR) with a battery that can trade sufficiently in both directions (we will come to the requirements for FCR participation later in the blog, but they are not relevant here). We bid 1 MW at a price of 20 EUR/MW/h from 8:00-12:00 (one can only participate in FCR in 4-hour time slices). This results in a revenue of 80 EUR for the entire time slice. However, participating in FCR means that we don’t trade in wholesale markets for these 4 hours. Let’s say that the average IDC (Intraday Continuous) price on the wholesale market in these four hours is 25 EUR/MWh. If we discharge 1 MW for 4 hours (or 4 MWh), we stand to make 100 EUR. Therefore, the opportunity cost of not trading in wholesale markets is 100 EUR and the added (or lost) revenue from making this choice is 80-100 = -20 EUR, suggesting that whole market participation is the better option. However, if we were to get an FCR price of 30 EUR/MW/h, we would then make a profit of 20 EUR from participating in FCR and should do that over wholesale.
This example should be easy to follow so far. However, the complexity arises from the fact that participation in ancillary services markets is possible over multiple time slices. Hypothetically, a battery could participate in FCR and/or aFRR (Automatic Frequency Restoration Reserve) for all 24 hours. This increases the number of possible combinations significantly, such as participating in TS (time slice) 1, TS 1 and 2, TS 1, 2, and 6, TS 3, 4, 5, and 6 and so on, resulting in 64 combinations for FCR alone. When we also factor in participation in aFRR capacity (also in 4-hour time slices), the number of combinations grows drastically, making it impractical to illustrate this calculation in a simple example.
Therefore, to simplify things and return to our original example, we consider a sample day - 18 June 2025 - since no extraordinary market events occurred on that day, and make the following assumptions:
Assumptions
01
We have a battery with the following specifications:
- 1 MW
- 2 MWh
- 2 cycles / day
- 100% RTE (round-trip efficiency)
- 0-100% SOC Range
- 50% (1 MWh) starting SOC (so that we can do FCR, aFRR positive, and aFRR negative in any order - charge and discharge are both possible at the beginning of the day)
- 1 MW FCR bid size (it must be 80% of the power capacity, i.e. 0.8 MW, but the minimum bid size is 1 MW, so we stick to it for simplicity)
- 1 MW aFRR bid size
02
We assume perfect foresight of prices for the example day. This foresight is revealed gradually, market by market, in line with the sequence of their gate closures:
- FCR (Frequency Containment Reserve): At D–1, 08:00, we know the FCR prices for the day.
- aFRR capacity (automatic Frequency Restoration Reserve): At D–1, 09:00, we know the aFRR capacity prices.
- Day-Ahead market: At D–1, 12:00, we know the Day-Ahead prices.
- Intraday Average (IDA): At D–1, 15:00, we know the IDA prices.
- Intraday Continuous (IDC): After that, we know the ID1 prices (used as a proxy for IDC) for all quarters of the day.
03
On average, we generate higher revenues in ancillary services markets compared to wholesale markets. As a result, we develop a trading strategy that prioritizes participation in all ancillary services markets first and then takes wholesale positions around these commitments. The ancillary services markets in question are as follows:
- FCR capacity (gate closure D - 1 8:00)
- aFRR capacity positive (gate closure D - 1, 9:00)
- aFRR capacity negative (gate closure D - 1, 9:00)
- aFRR energy positive (gate closure D, Q - 25 minutes)
- aFRR energy negative (gate closure D, Q - 25 minutes)
04
There is negligible “drift” (SOC deviation in one direction) in FCR participation. Since FCR is a symmetric ancillary service, the State-of-Charge (SOC) of a battery remains, on average, the same. However, on a day-to-day basis, there may be a little drift in one direction resulting in an overall SOC increase or decrease, which must be adjusted with SOC management. For simplicity, we assume zero drift.
05
ID1 prices are a reasonable proxy for Intraday Continuous prices.
07
There are no additional trading fees.
Trading Strategy
Frequency Containment Reserve (FCR) - @ D-1. 8:00am
FCR, also known as primary control reserve, is the fastest-acting ancillary service. Its purpose is to immediately counteract sudden frequency deviations in the grid, acting as the grid’s first line of defense. Providers of FCR are compensated for making their capacity available to respond within seconds to stabilize the frequency. The payment is primarily for the readiness to provide the service, rather than the actual energy exchanged.
The requirements for a battery asset participating in FCR are:
- The battery should be able to bid capacity in 4-hour time slices (0-4, 4-8, 8-12, 12-16, 16-20, 20-24)
- The battery should be able to deliver the full bid instantaneously and for at least 15 minutes in the “Alert” (worst-case) mode. In our example, this means that there should be at least 0.25 MWh available.
Let us assume that at D-1 (the day before delivery) at 8:00am, our battery secures a contract to provide FCR. With perfect foresight, the highest price for FCR capacity is identified for TS 3, i.e. 8:00 to 12:00 at 31.41 €/MW/h. The battery commits 1 MW of its capacity to this service. The revenue generated from this capacity reservation is calculated as 1 MW * 31.41 €/MW/h * 4h = 126.04 €.
Crucially, as discussed above, for FCR, the battery must maintain a certain state of charge (SoC) to be able to deliver its full committed power for a specified duration if called upon. While actual FCR delivery might involve minor SoC changes, for simplicity, we assume a negligible drift in SoC during FCR provision. This means the battery’s energy level remains largely unaffected, allowing it to participate in other markets later in the day.

Automatic Frequency Restoration Reserve (aFRR) - @ D-1, 9:00am
aFRR, or secondary control reserve, acts as the next layer of defense after FCR. It works to restore the grid frequency to its nominal value and relieve the primary reserves. Unlike FCR, aFRR involves both capacity payments (for making the capacity available) and energy payments (for the actual energy activated to restore frequency).
The two types of aFRR responses for a battery are positive (injecting power when frequency is low) and negative (absorbing power when frequency is high).
The requirements for a battery asset participating in aFRR are:
The battery should be able to bid capacity in 4-hour time slices (0-4, 4-8, 8-12, 12-16, 16-20, 20-24)
The battery should be able to deliver the full bid within five minutes and for at least 60 minutes. In our example, this means that there should be at least 1 MWh available.
aFRR Positive
At D-1 at 9:00am, our battery identifies an opportunity in the aFRR positive market. The most lucrative time slice for capacity is from 20:00 to 24:00 at 40.95 €/MW/h. The battery commits 1 MW of capacity. The capacity revenue for this period is calculated as 1 MW * 40.95 €/MW/h * 4h = 163.80 €.
In addition to capacity, the battery also earns revenue from energy activation. This means that when the grid needs power (due to a frequency drop), the battery discharges. For simplicity, we assume the battery experiences 25% energy activation, which is distributed across the four quarter-hours with the highest energy prices. In other words, the four highest-priced quarters are fully activated (0.25 MWh discharged in each). The average price for the four highest priced quarters is 207.04 €/MWh. The energy revenue is then calculated as 0.25 MWh * 4qh * 207.04 €/MWh, resulting in 207.04 €.


aFRR Negative
Similarly, for aFRR negative, the battery secures a contract for the time slice 12:00 to 16:00 PM, at the highest capacity price of 71.63 €/MW/h. This yields a capacity revenue of 1 MW * 71.63 €/MW/h * 4h = 286.52 €.
For aFRR negative, the battery charges when the grid has excess power (frequency increase) and pays to take the energy. In this example, we also assume 25% energy activation, which is distributed across the four quarter-hours with the lowest energy prices. The energy revenue (cost) is calculated as the negative of the energy absorbed multiplied by the average energy price for the period. The average price for the four lowest priced quarters is -18.98 €/MWh, resulting in an energy revenue of – (0.25 MWh * 4qh * -18.98 €/MWh) = 18.98 € (a cost reduction or revenue from absorbing excess power).
These examples demonstrate how batteries can generate revenues from ancillary services by providing essential grid stability functions. The ability to participate in both FCR and aFRR markets, earning both capacity and energy payments, forms a crucial part of the value stacking strategy.


Day-Ahead Auction - @ D-1, 12:00pm
After securing FCR and aFRR contracts, we move on to the wholesale markets. Our battery looks to the Day-Ahead market (D-1 at 12:00 PM) to optimize its remaining capacity. The challenge here is to find the most profitable buy and sell opportunities while respecting the commitments made to ancillary services and the physical limitations of the battery (e.g., state of charge).
To achieve this, we sort the prices from highest to lowest and eliminate all hours that come within the existing time slices for FCR (8:00 – 12:00) and aFRR in the same direction as the desired Day-Ahead bid. This means that aFRR positive time slice 20:00 – 24:00 is excluded when identifying the most expensive hour to sell and aFRR negative time slice 12:00 – 16:00 is excluded when identifying the cheapest hour to buy. This is because, we can charge in wholesale markets without managing the SoC when participating in aFRR positive, but we cannot discharge in both simultaneously, and vice versa.
Additionally, even if a cheap buying opportunity exists, it might be infeasible to take advantage of it because of already existing positions in ancillary services markets. In such cases, we select the next best option that aligns with the battery’s physical state and existing commitments. Similarly, when selling, we must ensure that discharging does not interfere with our ability to fulfill our ancillary service obligations or lead to an empty battery when it needs to be full for a subsequent charge cycle.
Through this process, we arrive at the cheapest price of 95.84 €/MWh in hour 02:00-03:00 for buying 1 MWh and the most expensive price of 114.9 €/MWh for selling it later in hour 06:00-07:00. This yields a profit of 19.06 € from this specific Day-Ahead trade.

For the extra curious: Here’s how we arrived at the DA trading decisions
When evaluating the cheapest hours for buying in Day-Ahead, we exclude time slices with FCR and aFRR participation. The lowest prices are:
- 16:00-17:00: 74 €/MWh
- 02:00-03:00: 95.84 €/MWh
- 03:00-04:00: 97.01 €/MWh
SOC is 1.0 MWh at 08:00 and stays the same till 12:00 (FCR, no drift) By 16:00, SOC reaches 2.0 MWh and stays at this level through the rest of the day (aFRR negative) At 24:00, SOC drops back to 1.0 MWh (aFRR positive)
For selling at peak prices, 19:00 emerges as the most expensive period, priced at 140.99 €/MWh. However, the SOC schedule presents a challenge:
At 02:00: SOC is 1.0 MWh At 03:00: SOC increases to its maximum 2.0 MWh, remaining at this level until 12:00 (FCR, no drift)
Buy at 02:00-03:00 for 95.84 €/MWh Sell at 06:00-07:00 for 114.9 €/MWh
Intraday Auction
The Intraday Auction (taking place D-1 at 3:00pm) is characterized by higher volatility and more granular trading periods (quarter-hours) and allows for further refinement of the battery’s schedule. At this stage, the goal is to identify and exploit arbitrage opportunities that can improve the overall profit and loss (PNL) of the battery. This involves looking for significant price differences within the Intraday Market itself, or between the Intraday Market and previously committed positions in the Day-Ahead market or ancillary services.
We sort IDA prices from highest to lowest and then find the four cheapest and four most expensive quarter-hours each that are feasible given SOC restrictions. The average of the four most expensive hours is higher than Day-Ahead at 142.94 €/MWh and the average of the cheapest four prices is much lower at 8.90 €/MWh. Thus, it makes sense to buy back existing sell positions and sell back existing buy positions taken on Day-Ahead on the Intraday Action Market.
Once Day-Ahead positions are neutralized, the decision about which new positions to buy and sell in the Intraday Auction becomes complex as the battery must constantly consider its state of charge and its commitments to ancillary services. A trade that looks profitable on paper might be infeasible if it compromises the battery’s ability to provide FCR or aFRR.
Ultimately, we finalise a schedule where we sell three expensive quarters in the morning before FCR at 8:00 and buy three cheap quarters after the end of aFRR negative at 16:00. To complete one full cycle of wholesale, we find another combination of expensive followed by cheap quarters ultimately locking in a spread of 119.38 €.

For the extra curious: Here’s how we arrived at the IDA trading decisions
The cheapest feasible quarters are:
- 16:00-16:15 at -17.35 €/MWh
- 16:15-16:30 at -2.01 €/MWh
- 16:30-16:45 at 22.36 €/MWh
- 17:00-17:15 at 32.60 €/MWh
The most expensive quarters are:
- 19:45-20:00 at 156 €/MWh
- 18:45-19:00 at 142.44 €/MWh
- 07:00-07:15 at 141.90 €/MWh
- 0:00-00:15 at 125.87 €/MWh
The average price of the four most expensive hours is higher than Day-Ahead at 142.94 €/MWh and the average of the cheapest four prices is lower at 8.90 €/MWh. This creates an opportunity to buy back existing sell positions and sell existing buy positions to achieve bigger profits.
We sell the existing buy position (2:00-03:00) at prices of 112.9, 107.63, 101.05, 96.43 €/MWh respectively for 2q1, 2q2, 2q3, and 2q4. This earns us a profit of 8.67 €.
We buy the existing sell position (06:00-07:00) at 112.69, 115.06, 115.36, 114.56 €/MWh making a profit of 0.48 €.
Going back to SOC feasibility, as of the current schedule we have 2.0 MWh at 16:00, which means we must discharge. However, the cheapest prices are available right after 16:00 at which we should ideally charge. A possible workaround is that we sell in the morning before the FCR time slice - we see at least 2 quarters before 8:00 within which we can sell at high prices. We check the ordered price list further and find 7:15-7:30 at 120.12 €/MWh.
We then sell three expensive quarters in the morning (i.e. 0q1, 7q1 and 7q2) to achieve the following SOC changes:
- 0:00: SOC = 1.0 MWh
- After 0q1: SOC = 0.75 MWh
- After 7q1: SOC = 0.50 MWh
- After 7q2: SOC = 0.25 MWh (minimum required for FCR)
- At 12:00, SOC remains 0.25 (FCR, no drift)
- At 16:00, SOC increases to 1.25 MWh (aFRR negative)
This allows us to charge three quarters from 16:00 to 16:45 bringing the SOC back to 2 MWh.
To complete one full cycle, we find the next combination of expensive followed by cheap quarter hours with the biggest spread – selling 18:45-19:00 at 142.44 €/MWh and buying 19:00-19:15 at 86.42 €/MWh.
The final revenues from IDA trading are calculated as:
8.67 €
+ 0.48 €
+ (125.87 €/MWh + 141.90 €/MWh + 120.12 €/MWh + 142.44 €/MWh) * 0.25 MWh
- (-17.35 €/MWh - 2.01 €/MWh + 22.36 €/MWh + 86.42 €/MWh) * 0.25 MWh
= 119,38 €
Continuous Intraday Market
After D - 1 15:00, the Intraday Continuous Market (IDC) for D becomes tradable and provides the ultimate flexibility. The IDC market operates continuously, with trades happening up to five minutes before delivery. It is highly liquid and volatile, offering constant opportunities for batteries to react to real-time price signals and grid conditions.
In our example, we repeat the process as in IDA and find the cheapest and most expensive quarter hours using the ID1 prices as proxy for the IDC prices. Again, the battery’s state of charge and its ancillary service commitments are paramount. We simplify the Intraday Market here with only one price index, the ID1. In reality, the Intraday moves in real time and creates much more trading opportunities as the price structure in the market keeps evolving.
In the Intraday Continuous Market, it is normal to find some overlap with the Intraday Auction in the cheapest and most expensive quarters. We exclude these overlapping quarters (because we cannot buy / sell the same quarter twice) and look for other arbitrage opportunities. The total revenue from the IDC market on the exemplar day amounts to 12.13 € which adds to the profits from our previous trades on ancillary and IDA markets.

For the extra curious: Here’s how we arrived at the IDC trading decisions
Four cheapest quarters:
- 16:00-16:15 at 11.13 €/MWh
- 16:15-16:30 at 13.66 €/MWh
- 17:00-17:15 at 39.31 €/MWh
- 18:00 –18:15 at 57.59 €/MWh
- 17:15-17:30 at 59.10 €/MWh
Of these, we have already bought 16q1 and 16q2 in the IDA market. We traded 16q3 at a lower price than the cheapest quarters in IDC (excluding the ones we already bought in IDA), so no profitable arbitrage opportunity exists here. The last quarter bought in the IDA market is 19q1 at 86.42 €/MWh, which is higher than the prices of the four cheapest quarters and presents a profit-making possibility.
However, the SOC caveat here is that at 16:45, SOC is already at its max at 2 MWh, meaning the battery must be discharged before it can be charged again to complete one full trading cycle. Therefore, the buy position must come after the sell position. We now look for the best combination from the most expensive quarters.
Four most expensive quarters:
- 7:00 – 7:15 at 159.12 €/MWh
- 7:15-7:30 at 135.59 €/MWh
- 19:45-20:00 at 132.17 €/MWh
- 01:00-01:15 at 124.35 €/MWh
Of these, we have already sold 7q1 and 7q2 in the IDA market. The next highest price is at 19:45 but selling at that time doesn’t work because it would be the last discharge before the aFRR negative period begins at 20:00, leaving no room to charge the battery for completing a full cycle. The next highest price is 01:00, which offers a potential arbitrage opportunity.
To execute this trade and arrive at the minimum required SOC before FCR, we must buy back our position at 00:00 (traded at 116.98 €/MWh). Buying back at this price results in a profit of 2.22 € at 0q1 and then we sell 1 MW at 01:00 for 124.35 €/MWh.
If we go further down the ordered list of prices looking for an arbitrage opportunity for the last quarter we sold in IDA, i.e., 18:45-19:00, we find that the prices are lower than what we sold at in IDA, and hence we don’t trade that quarter further.
This leaves us with a window of 19:00 – 20:00 to keep the existing buy position at 19q1 or find a cheaper one to complete the full cycle. The cheapest quarter after 18q4 is 19q2 at 85.45 €/MWh. If we buy this, we must sell 19q1, priced at 87.13€/MWh. The effective profit from this trade is 0.18 €, a small gain that we choose to execute only on the assumption of no trading fees.
The final revenues from IDC trading are calculated as:
2,22€
+ 124.35€/MWh * 0.25MWh
+ 0.18€
- 85.45 €/MWh * 0.25MWh
= 12,13 €
The Power of Value Stacking
Let’s summarize the revenue generated in our simplified example:
- FCR Capacity Revenue: 126.04 €
- aFRR Positive Capacity Revenue: 163.80 €
- aFRR Positive Energy Revenue: 207.04 €
- aFRR Negative Capacity Revenue: 286.52 €
- aFRR Negative Energy Revenue: 18.98 €
- Day-Ahead Revenue: 19.06 €
- Intraday Auction Revenue: 119.38 €
- Continuous Intraday Revenue: 12.13 €
Total Profit and Loss (PNL) for the day: 952.95 €

This total revenue of 952.95 € for a single day highlights the substantial financial benefits of a comprehensive market participation strategy. Optimizing the same battery configuration solely within the wholesale market, we would have arrived at a revenue of 502.48 €. This exhibits an almost 90% increase in revenue, thanks to value stacking across multiple market segments.
Our assumptions and simplifications for this example notwithstanding, it is still worth noting that if we are able to calculate the opportunity cost of participating in ancillary services markets with even a 30-35% accuracy, we stand to make a potential additional revenue of 30% on top. This difference underscores why sophisticated market optimization, encompassing all available revenue streams, is crucial for maximizing the return on investment for battery storage assets.

If you have followed through this entire example, you can imagine, that no human can make all these optimizations and calculations in real time, which is why AI powered optimizers and execution engines are used for this task. Building and improving these is what BESS traders do to generate the highest revenues for their customers.

