DK1 battery trading: backtest

jacobazu.github.io← Live
Forecast
Share of perfect foresight (Ensemble)
94%
327 days
Earned in total, after costs
57,761 €
177 € a day, before costs 69,475 €
Days with a loss
11
Worst: -24 €
What the battery would have earned after costs, added up
Each forecast, the same battery
ForecastDaysAfter costsShare of perfectLoss daysvs ensemble, a day
Ensemble32757,761 €94%11
BMT-X32756,079 €91%16-5.1 € (p < 0.001)
LEAR-X32756,987 €92%13-2.4 € (p 0.008)
XGBoost-X32757,478 €93%12-0.9 € (p 0.363)

Difference to the ensemble per day, p: Newey-West, Holm for the three.

Share of perfect foresight by month (Ensemble)
Share of perfect foresight (BMT-X)
91%
327 days
Earned in total, after costs
56,079 €
171 € a day, before costs 67,984 €
Days with a loss
16
Worst: -62 €
What the battery would have earned after costs, added up
Each forecast, the same battery
ForecastDaysAfter costsShare of perfectLoss daysvs ensemble, a day
Ensemble32757,761 €94%11
BMT-X32756,079 €91%16-5.1 € (p < 0.001)
LEAR-X32756,987 €92%13-2.4 € (p 0.008)
XGBoost-X32757,478 €93%12-0.9 € (p 0.363)

Difference to the ensemble per day, p: Newey-West, Holm for the three.

Share of perfect foresight by month (BMT-X)
Share of perfect foresight (LEAR-X)
92%
327 days
Earned in total, after costs
56,987 €
174 € a day, before costs 68,724 €
Days with a loss
13
Worst: -35 €
What the battery would have earned after costs, added up
Each forecast, the same battery
ForecastDaysAfter costsShare of perfectLoss daysvs ensemble, a day
Ensemble32757,761 €94%11
BMT-X32756,079 €91%16-5.1 € (p < 0.001)
LEAR-X32756,987 €92%13-2.4 € (p 0.008)
XGBoost-X32757,478 €93%12-0.9 € (p 0.363)

Difference to the ensemble per day, p: Newey-West, Holm for the three.

Share of perfect foresight by month (LEAR-X)
Share of perfect foresight (XGBoost-X)
93%
327 days
Earned in total, after costs
57,478 €
176 € a day, before costs 69,061 €
Days with a loss
12
Worst: -23 €
What the battery would have earned after costs, added up
Each forecast, the same battery
ForecastDaysAfter costsShare of perfectLoss daysvs ensemble, a day
Ensemble32757,761 €94%11
BMT-X32756,079 €91%16-5.1 € (p < 0.001)
LEAR-X32756,987 €92%13-2.4 € (p 0.008)
XGBoost-X32757,478 €93%12-0.9 € (p 0.363)

Difference to the ensemble per day, p: Newey-West, Holm for the three.

Share of perfect foresight by month (XGBoost-X)
Days below the 1 in 20 floor (Ensemble)
7.3%
24 of 327 days, target 5%
Kupiec test
p = 0.07
Is the share of days below the floor 5%?
Average expected
165 €
Per day
Average earned
177 €
Per day
Expected revenue, the 1 in 20 floor and what the battery earned (red: below the floor)
Days below the 1 in 20 floor (BMT-X)
10.7%
35 of 327 days, target 5%
Kupiec test
p = 0.00
Is the share of days below the floor 5%?
Average expected
176 €
Per day
Average earned
171 €
Per day
Expected revenue, the 1 in 20 floor and what the battery earned (red: below the floor)
Days below the 1 in 20 floor (LEAR-X)
6.1%
20 of 327 days, target 5%
Kupiec test
p = 0.37
Is the share of days below the floor 5%?
Average expected
161 €
Per day
Average earned
174 €
Per day
Expected revenue, the 1 in 20 floor and what the battery earned (red: below the floor)
Days below the 1 in 20 floor (XGBoost-X)
10.1%
33 of 327 days, target 5%
Kupiec test
p = 0.00
Is the share of days below the floor 5%?
Average expected
169 €
Per day
Average earned
176 €
Per day
Expected revenue, the 1 in 20 floor and what the battery earned (red: below the floor)
Before costs
70,205 €
1.89 MWh sold a day
Costs
11,714 €
17% of the revenue
After costs
57,761 €
177 € a day
Days it doesn't trade
16
Loss days 22 → 11
Fees and wear, 18 Nov 2025 to 10 Oct 2026, ensemble plan
CostsPlanCostsAfter costsMWh sold a dayDays no tradeLoss daysIn the plan vs after (per day)
No costsno costs0 €70,205 €1.8902
Fee + wear 20 €/MWhafter the fact12,461 €57,745 €1.89022
Fee + wear 20 €/MWhin the plan11,714 €57,761 €1.781611+0.05 € (p 0.916)
Fee + wear 10 €/MWhafter the fact6,266 €63,939 €1.89010
Fee + wear 10 €/MWhin the plan6,161 €63,913 €1.8647-0.08 € (p 0.720)
Fee + wear 40 €/MWhafter the fact24,850 €45,356 €1.89068
Fee + wear 40 €/MWhin the plan20,664 €46,820 €1.585025+4.48 € (p 0.001)
Fee + wear 20 €/MWh + Energinet's tariffsafter the fact23,926 €46,279 €1.89064
Fee + wear 20 €/MWh + Energinet's tariffsin the plan20,085 €47,547 €1.594824+3.88 € (p 0.002)

After the fact: costs taken off afterwards. In the plan: it only trades when the spread pays for them. At 20 €/MWh wear the total is the same, but loss days halve. The higher the costs, the more it pays to plan with them. Wear is an assumption, sources in the README. p: Newey-West.

Revenue given up for each loss limit
Loss limit backtest, 18 Nov 2025 to 10 Oct 2026, ensemble plan
LimitDays it bindsRevenuepLoss daysWorst day
None0+0.0%2-22 €
100 €5-0.3%0.1922-22 €
50 €24-1.3%0.0172-22 €
25 €57-2.8%0.0012-14 €
0 €102-7.5%< 0.00100 €

The limit is on the average of the worst 5% of scenarios. It costs more than it saves: losses are rare, and the days it hits are the volatile ones, which pay the most. Before fees and wear.