openenergy 4.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- openenergy-4.1.0/.gitignore +36 -0
- openenergy-4.1.0/CITATION.cff +24 -0
- openenergy-4.1.0/LICENSE.txt +21 -0
- openenergy-4.1.0/PKG-INFO +312 -0
- openenergy-4.1.0/README.md +275 -0
- openenergy-4.1.0/pyproject.toml +97 -0
- openenergy-4.1.0/src/openenergy/__init__.py +20 -0
- openenergy-4.1.0/src/openenergy/app/__init__.py +9 -0
- openenergy-4.1.0/src/openenergy/app/pages.py +379 -0
- openenergy-4.1.0/src/openenergy/app/results.py +176 -0
- openenergy-4.1.0/src/openenergy/app/runs.py +190 -0
- openenergy-4.1.0/src/openenergy/app/server.py +397 -0
- openenergy-4.1.0/src/openenergy/assets/__init__.py +19 -0
- openenergy-4.1.0/src/openenergy/assets/battery.py +184 -0
- openenergy-4.1.0/src/openenergy/assets/renewable.py +53 -0
- openenergy-4.1.0/src/openenergy/backtest/__init__.py +23 -0
- openenergy-4.1.0/src/openenergy/backtest/engine.py +550 -0
- openenergy-4.1.0/src/openenergy/backtest/response.py +147 -0
- openenergy-4.1.0/src/openenergy/cli.py +489 -0
- openenergy-4.1.0/src/openenergy/data/__init__.py +33 -0
- openenergy-4.1.0/src/openenergy/data/carbon.py +90 -0
- openenergy-4.1.0/src/openenergy/data/ember.py +109 -0
- openenergy-4.1.0/src/openenergy/data/fes.py +85 -0
- openenergy-4.1.0/src/openenergy/data/fleet.py +183 -0
- openenergy-4.1.0/src/openenergy/data/interconnectors.py +118 -0
- openenergy-4.1.0/src/openenergy/data/neso.py +71 -0
- openenergy-4.1.0/src/openenergy/data/opsd.py +116 -0
- openenergy-4.1.0/src/openenergy/data/quality.py +23 -0
- openenergy-4.1.0/src/openenergy/data/response.py +151 -0
- openenergy-4.1.0/src/openenergy/data/series.py +186 -0
- openenergy-4.1.0/src/openenergy/data/update.py +102 -0
- openenergy-4.1.0/src/openenergy/dispatch/__init__.py +20 -0
- openenergy-4.1.0/src/openenergy/dispatch/_milp.py +85 -0
- openenergy-4.1.0/src/openenergy/dispatch/arbitrage.py +331 -0
- openenergy-4.1.0/src/openenergy/dispatch/colocated.py +209 -0
- openenergy-4.1.0/src/openenergy/errors.py +21 -0
- openenergy-4.1.0/src/openenergy/forecast/__init__.py +10 -0
- openenergy-4.1.0/src/openenergy/forecast/baseline.py +77 -0
- openenergy-4.1.0/src/openenergy/forecast/ml.py +96 -0
- openenergy-4.1.0/src/openenergy/metrics/__init__.py +6 -0
- openenergy-4.1.0/src/openenergy/metrics/capture.py +80 -0
- openenergy-4.1.0/src/openenergy/metrics/summary.py +101 -0
- openenergy-4.1.0/src/openenergy/py.typed +0 -0
- openenergy-4.1.0/src/openenergy/report/__init__.py +21 -0
- openenergy-4.1.0/src/openenergy/report/document.py +294 -0
- openenergy-4.1.0/src/openenergy/report/figures.py +219 -0
- openenergy-4.1.0/src/openenergy/report/load.py +126 -0
- openenergy-4.1.0/src/openenergy/scenario.py +540 -0
- openenergy-4.1.0/src/openenergy/system/__init__.py +49 -0
- openenergy-4.1.0/src/openenergy/system/_pypsa.py +161 -0
- openenergy-4.1.0/src/openenergy/system/commitment.py +364 -0
- openenergy-4.1.0/src/openenergy/system/fleet.py +205 -0
- openenergy-4.1.0/src/openenergy/system/forward.py +143 -0
- openenergy-4.1.0/src/openenergy/system/merit.py +59 -0
- openenergy-4.1.0/src/openenergy/system/model.py +251 -0
- openenergy-4.1.0/src/openenergy/system/netload.py +157 -0
- openenergy-4.1.0/src/openenergy/system/scenario.py +475 -0
- openenergy-4.1.0/src/openenergy/system/storage.py +120 -0
- openenergy-4.1.0/src/openenergy/system/validate.py +227 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Jupyter Notebook checkpoints
|
|
2
|
+
**/*.ipynb_checkpoints
|
|
3
|
+
|
|
4
|
+
# Python cache and build output
|
|
5
|
+
**/__pycache__
|
|
6
|
+
.pytest_cache
|
|
7
|
+
.ruff_cache
|
|
8
|
+
.mypy_cache
|
|
9
|
+
.venv
|
|
10
|
+
dist
|
|
11
|
+
build
|
|
12
|
+
*.egg-info
|
|
13
|
+
|
|
14
|
+
# Coverage
|
|
15
|
+
.coverage
|
|
16
|
+
htmlcov
|
|
17
|
+
|
|
18
|
+
# Docs build
|
|
19
|
+
site
|
|
20
|
+
|
|
21
|
+
# Design notes are kept locally only
|
|
22
|
+
docs/design/
|
|
23
|
+
# Example report generated by the docs build
|
|
24
|
+
docs/reports/
|
|
25
|
+
|
|
26
|
+
# Run outputs; models/ holds untracked 1.x model files
|
|
27
|
+
outputs
|
|
28
|
+
models
|
|
29
|
+
|
|
30
|
+
# Development tools configurations
|
|
31
|
+
.vscode
|
|
32
|
+
|
|
33
|
+
# Miscellaneous
|
|
34
|
+
playground
|
|
35
|
+
_posts
|
|
36
|
+
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: "If you use OpenEnergy, please cite it as below, and credit the data sources each result lists."
|
|
3
|
+
type: software
|
|
4
|
+
title: "OpenEnergy: backtest battery storage and renewables against real power-market data"
|
|
5
|
+
version: 4.1.0
|
|
6
|
+
date-released: 2026-10-14
|
|
7
|
+
license: MIT
|
|
8
|
+
authors:
|
|
9
|
+
- family-names: Koul
|
|
10
|
+
given-names: Akhilesh
|
|
11
|
+
repository-code: "https://github.com/koulakhilesh/OpenEnergy"
|
|
12
|
+
url: "https://koulakhilesh.github.io/OpenEnergy/"
|
|
13
|
+
abstract: >-
|
|
14
|
+
Open-source Python toolkit and web app that backtests grid batteries against GB
|
|
15
|
+
day-ahead prices without lookahead, stacks frequency-response revenue, rebuilds GB
|
|
16
|
+
prices from plant, fuel and carbon data, and applies NESO Future Energy Scenarios with
|
|
17
|
+
price-taking interconnectors.
|
|
18
|
+
keywords:
|
|
19
|
+
- energy storage
|
|
20
|
+
- battery
|
|
21
|
+
- electricity markets
|
|
22
|
+
- backtesting
|
|
23
|
+
- power systems
|
|
24
|
+
- Great Britain
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023-2026 Akhilesh Koul
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: openenergy
|
|
3
|
+
Version: 4.1.0
|
|
4
|
+
Summary: Backtest battery storage and renewables against real power-market data.
|
|
5
|
+
Project-URL: Homepage, https://github.com/koulakhilesh/OpenEnergy
|
|
6
|
+
Project-URL: Documentation, https://koulakhilesh.github.io/OpenEnergy/
|
|
7
|
+
Project-URL: Issues, https://github.com/koulakhilesh/OpenEnergy/issues
|
|
8
|
+
Project-URL: App, https://open-energy-eight.vercel.app/
|
|
9
|
+
Author: Akhilesh Koul
|
|
10
|
+
License-Expression: MIT
|
|
11
|
+
License-File: LICENSE.txt
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: Science/Research
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
16
|
+
Classifier: Topic :: Scientific/Engineering
|
|
17
|
+
Classifier: Typing :: Typed
|
|
18
|
+
Requires-Python: >=3.14
|
|
19
|
+
Requires-Dist: highspy>=1.7
|
|
20
|
+
Requires-Dist: numpy>=1.26
|
|
21
|
+
Requires-Dist: pandas>=2.1
|
|
22
|
+
Requires-Dist: pydantic>=2.5
|
|
23
|
+
Requires-Dist: pyyaml>=6.0
|
|
24
|
+
Requires-Dist: typer>=0.12
|
|
25
|
+
Provides-Extra: app
|
|
26
|
+
Requires-Dist: fastapi>=0.115; extra == 'app'
|
|
27
|
+
Requires-Dist: plotly>=6.0; extra == 'app'
|
|
28
|
+
Requires-Dist: uvicorn>=0.30; extra == 'app'
|
|
29
|
+
Provides-Extra: forecast
|
|
30
|
+
Requires-Dist: scikit-learn>=1.4; extra == 'forecast'
|
|
31
|
+
Requires-Dist: threadpoolctl>=3.1; extra == 'forecast'
|
|
32
|
+
Provides-Extra: report
|
|
33
|
+
Requires-Dist: plotly>=6.0; extra == 'report'
|
|
34
|
+
Provides-Extra: system
|
|
35
|
+
Requires-Dist: pypsa>=1.4; extra == 'system'
|
|
36
|
+
Description-Content-Type: text/markdown
|
|
37
|
+
|
|
38
|
+
<div align="center">
|
|
39
|
+
<img src="https://raw.githubusercontent.com/koulakhilesh/OpenEnergy/master/docs/assets/logo.png" alt="OpenEnergy logo" width="80" height="80">
|
|
40
|
+
|
|
41
|
+
<h3>OpenEnergy</h3>
|
|
42
|
+
|
|
43
|
+
<p>Backtest battery storage against real power-market prices.</p>
|
|
44
|
+
|
|
45
|
+
<p>
|
|
46
|
+
<a href="https://koulakhilesh.github.io/OpenEnergy/"><strong>Documentation</strong></a>
|
|
47
|
+
·
|
|
48
|
+
<a href="https://github.com/koulakhilesh/OpenEnergy/issues">Issues</a>
|
|
49
|
+
</p>
|
|
50
|
+
|
|
51
|
+
[](https://github.com/koulakhilesh/OpenEnergy/actions/workflows/ci.yml)
|
|
52
|
+
[](https://koulakhilesh.github.io/OpenEnergy/)
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
## What it does
|
|
56
|
+
|
|
57
|
+
Describe a battery and a forecasting approach in a short YAML file. OpenEnergy plans each
|
|
58
|
+
day on the forecast, settles the plan at the prices that actually cleared, and reports
|
|
59
|
+
what the battery earned, how hard it worked, and how close it came to perfect foresight.
|
|
60
|
+
|
|
61
|
+
- **Battery physics**: power and energy ratings, charge/discharge efficiencies, SOC
|
|
62
|
+
window, cycle and calendar ageing.
|
|
63
|
+
- **Dispatch**: a daily mixed-integer optimisation solved with HiGHS, optionally planning
|
|
64
|
+
the following days too (`dispatch.lookahead_days`; one day adds 5–15% revenue).
|
|
65
|
+
- **Backtesting without lookahead**: forecasts see only data available at the decision
|
|
66
|
+
time; plans settle at actual prices.
|
|
67
|
+
- **Revenue stacking**: GB Dynamic Containment, Moderation and Regulation co-optimised with
|
|
68
|
+
day-ahead trading (`response` in a scenario). Adding Dynamic Containment raised a 2-hour
|
|
69
|
+
battery's revenue by 58–155% a year in 2022–2025 (`examples/gb-2025-stacked.yaml`).
|
|
70
|
+
- **Forecasters**: perfect foresight, last week's prices, noisy foresight and a
|
|
71
|
+
gradient-boosting model.
|
|
72
|
+
- **Renewables**: solar and wind plants from capacity-factor profiles, captured price and
|
|
73
|
+
capture rate by year (`openenergy capture`).
|
|
74
|
+
- **Co-located sites**: a plant and a battery behind one grid connection with export and
|
|
75
|
+
import limits and optional support payments, compared with separate connections.
|
|
76
|
+
- **System analysis**: net load, ramps and renewable surplus as wind and solar scale,
|
|
77
|
+
storage sizing for the system (`openenergy storage`) and for a site (`openenergy sweep`).
|
|
78
|
+
- **Emissions**: net emissions from GB carbon intensity and an optional carbon price that
|
|
79
|
+
steers dispatch, planned without lookahead.
|
|
80
|
+
- **GB system model**: CCGT, coal and peaking plant dispatched in merit order (optionally
|
|
81
|
+
with unit commitment) from fleet, fuel and carbon data, checked against 2015–2025 prices
|
|
82
|
+
and fuel use (`openenergy system validate`), with scenarios for renewables, storage,
|
|
83
|
+
fleet and carbon policy (`openenergy system run`); storage uses the optional PyPSA backend.
|
|
84
|
+
- **Forward scenarios**: NESO's Future Energy Scenarios pathways (2025–2035) applied to a
|
|
85
|
+
historic weather year, with GB's ten interconnectors trading at neighbouring markets'
|
|
86
|
+
actual prices (`system.fes`, `system.interconnectors: links`).
|
|
87
|
+
- **Web app**: value a battery on any GB year from 2017 or on a FES pathway's modelled
|
|
88
|
+
prices in the browser at [open-energy-eight.vercel.app](https://open-energy-eight.vercel.app/)
|
|
89
|
+
(`openenergy.app`, FastAPI on Vercel).
|
|
90
|
+
- **Data**: hourly GB day-ahead prices, demand and wind and solar output for 2015–2020
|
|
91
|
+
and capacity factors for 2015–2019 from Open Power System Data; GB hourly day-ahead
|
|
92
|
+
prices for mid-2016 to October 2026 from Ember; half-hourly GB carbon intensity for
|
|
93
|
+
2018 to October 2026 and generation by fuel for 2015–2025 from NESO; GB frequency-response auction
|
|
94
|
+
prices from September 2021 and monthly response utilisation from NESO; GB imbalance
|
|
95
|
+
prices for 2016 to October 2026 from Elexon; and GB fleet, fuel and carbon prices from DESNZ, HMRC,
|
|
96
|
+
the World Bank and the ECB, are bundled. So are NESO's Future Energy Scenarios tables,
|
|
97
|
+
its interconnector register, daily interconnector flows from Elexon and hourly
|
|
98
|
+
day-ahead prices in the six neighbouring markets from Ember.
|
|
99
|
+
`openenergy data update` downloads the latest prices.
|
|
100
|
+
- **Reports**: `openenergy report` turns saved runs, system scenarios, backcasts and sweeps
|
|
101
|
+
into one interactive HTML file of charts and tables (optional `report` extra, plotly).
|
|
102
|
+
|
|
103
|
+
## Quick start
|
|
104
|
+
|
|
105
|
+
Requires Python 3.14 and [uv](https://docs.astral.sh/uv/). The bundled data come with the
|
|
106
|
+
repository, so clone it:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
git clone https://github.com/koulakhilesh/OpenEnergy.git
|
|
110
|
+
cd OpenEnergy
|
|
111
|
+
uv sync --extra forecast
|
|
112
|
+
uv run openenergy compare examples/gb-2019-{naive,ml,perfect}.yaml
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
The library and command line are also on PyPI (`pip install openenergy`, with extras
|
|
116
|
+
`forecast`, `system`, `report` and `app`); the package carries no data, and
|
|
117
|
+
`openenergy data update` downloads the latest GB prices.
|
|
118
|
+
|
|
119
|
+
```text
|
|
120
|
+
scenario forecast days revenue per MW-yr capture cycles
|
|
121
|
+
gb-2019-perfect perfect_foresight 363 19,075 19,180 100.0% 464
|
|
122
|
+
gb-2019-ml gradient_boosting 363 14,086 14,164 73.8% 400
|
|
123
|
+
gb-2019-naive naive_last_week 363 13,918 13,995 73.0% 465
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
A 1 MW / 2 MWh battery trading GB day-ahead prices in 2019 would have earned about £14k
|
|
127
|
+
per MW-year planning on last week's prices: 73% of what perfect foresight allows. In the
|
|
128
|
+
2022 gas crisis the same battery would have earned about £77k
|
|
129
|
+
(`examples/gb-2022-naive.yaml`, on Ember prices).
|
|
130
|
+
|
|
131
|
+
Run one scenario and write its results to `outputs/<name>/`, then chart them:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
uv run openenergy run examples/gb-2019-naive.yaml
|
|
135
|
+
uv sync --extra report
|
|
136
|
+
uv run openenergy report outputs/gb-2019-naive -o outputs/report.html
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Rebuild GB prices from the plants behind them and compare with what happened:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
uv run openenergy system validate
|
|
143
|
+
uv sync --extra system # PyPSA, needed for scenarios with storage
|
|
144
|
+
uv run openenergy system run examples/gb-2019-wind3-storage.yaml
|
|
145
|
+
uv run openenergy system run examples/gb-2035-holistic.yaml # a FES pathway in 2035
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Run the web app locally (or use it at
|
|
149
|
+
[open-energy-eight.vercel.app](https://open-energy-eight.vercel.app/)):
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
uv run uvicorn openenergy.app:app
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
See the [documentation](https://koulakhilesh.github.io/OpenEnergy/) for the equations,
|
|
156
|
+
every scenario setting and the Python API.
|
|
157
|
+
|
|
158
|
+
## Development
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
uv sync --all-extras --group docs
|
|
162
|
+
uv run ruff check && uv run ruff format --check && uv run mypy && uv run pytest
|
|
163
|
+
uv run mkdocs serve
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Roadmap
|
|
167
|
+
|
|
168
|
+
**Released**
|
|
169
|
+
|
|
170
|
+
| Release | Scope |
|
|
171
|
+
|---------|-------|
|
|
172
|
+
| v2.0 | Battery arbitrage backtesting: physics, ageing, dispatch, forecasters, CLI |
|
|
173
|
+
| v2.1 | PV and wind assets, captured price, co-located storage |
|
|
174
|
+
| v2.2 | Net load, surplus, storage sizing, emissions |
|
|
175
|
+
| v3.0 | GB system dispatch with conventional generation via PyPSA, checked against 2015–2020 |
|
|
176
|
+
| v3.1 | Optional unit commitment (start-up costs, minimum stable output) and a start-cost price, re-checked against 2015–2020 without fitting to prices |
|
|
177
|
+
| v3.2 | Data to 2025: GB prices from Ember, NESO generation and carbon intensity, DUKES and fuel prices, UK ETS; `openenergy data update`; backcast of the gas crisis and coal exit |
|
|
178
|
+
| v3.3 | Multi-day planning horizon (`dispatch.lookahead_days`), and a measured answer on planning under price uncertainty: for day-ahead-only trading a scenario plan equals one forecast, and risk aversion costs revenue |
|
|
179
|
+
| v3.4 | Reports: `openenergy report` turns saved runs, system scenarios, backcasts and sweeps into one interactive HTML file; chart functions reusable from Python |
|
|
180
|
+
| v3.5 | Revenue stacking: GB Dynamic Containment, Moderation and Regulation co-optimised with day-ahead trading; a measured answer on balancing (imbalance prices are valuable only with a forecast open data does not give) and on stochastic planning (still no value) |
|
|
181
|
+
| v4.0 | Forward scenarios from NESO's Future Energy Scenarios on a historic weather year; GB's interconnectors as price-taking links to six neighbouring markets, checked against actual flows 2019–2025; a web app (FastAPI, Vercel) valuing a battery on history or a FES pathway |
|
|
182
|
+
| v4.1 | A usable [web app](https://open-energy-eight.vercel.app/): the answer first in plain words, instant results for common batteries, value by year and by FES pathway at a glance, side-by-side comparison with shareable links, explanations next to each term, CSV and scenario downloads, and a JSON API; `CITATION.cff` and PyPI release |
|
|
183
|
+
|
|
184
|
+
**Planned**
|
|
185
|
+
|
|
186
|
+
| Release | Scope |
|
|
187
|
+
|---------|-------|
|
|
188
|
+
| v4.2 | A more credible model: GB zones (Scotland, England and Wales) with the boundary between them; links that respond to neighbours' supply rather than taking their prices; why modelled daily spreads are about 60% of real ones, checked against history without fitting to prices |
|
|
189
|
+
| v5.0 | A React and TypeScript front end on the v4.1 JSON API, with the same Python back end |
|
|
190
|
+
|
|
191
|
+
Alongside releases: a Zenodo DOI and versioned docs; refresh and re-check the bundled data
|
|
192
|
+
every release; keep CI and its actions current; revisit stochastic planning if an open,
|
|
193
|
+
forecastable market price appears.
|
|
194
|
+
|
|
195
|
+
Ideas and bug reports are welcome in [issues](https://github.com/koulakhilesh/OpenEnergy/issues).
|
|
196
|
+
|
|
197
|
+
## Data
|
|
198
|
+
|
|
199
|
+
Prices, load and renewable generation come from Open Power System Data:
|
|
200
|
+
|
|
201
|
+
> Open Power System Data. 2020. Data Package Time series. Version 2020-10-06.
|
|
202
|
+
> https://doi.org/10.25832/time_series/2020-10-06. (Primary data from various sources,
|
|
203
|
+
> for a complete list see URL).
|
|
204
|
+
|
|
205
|
+
GB day-ahead prices after September 2020 come from Ember,
|
|
206
|
+
[European Wholesale Electricity Price Data](https://ember-energy.org/data/european-wholesale-electricity-price-data/)
|
|
207
|
+
(primary sources ENTSO-E and EMR Settlement), licensed under
|
|
208
|
+
[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), and are converted from EUR with
|
|
209
|
+
European Central Bank reference rates (source: ECB).
|
|
210
|
+
|
|
211
|
+
GB carbon intensity comes from the National Energy System Operator (NESO) Carbon Intensity
|
|
212
|
+
API, https://carbonintensity.org.uk/, licensed under
|
|
213
|
+
[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).
|
|
214
|
+
|
|
215
|
+
GB generation by fuel comes from NESO's
|
|
216
|
+
[historic generation mix](https://www.neso.energy/data-portal/historic-generation-mix),
|
|
217
|
+
licensed under the [NESO Open Data Licence v1.0](https://www.neso.energy/data-portal/neso-open-licence).
|
|
218
|
+
Supported by National Energy SO Open Data.
|
|
219
|
+
|
|
220
|
+
GB frequency-response clearing prices come from NESO's
|
|
221
|
+
[Dynamic Containment, Regulation and Moderation auction results](https://www.neso.energy/data-portal/dynamic-containment-data)
|
|
222
|
+
and [EAC auction results](https://www.neso.energy/data-portal/eac-auction-results), and
|
|
223
|
+
the energy each service moves is derived from NESO's
|
|
224
|
+
[system frequency data](https://www.neso.energy/data-portal/system-frequency-data) with
|
|
225
|
+
the delivery envelopes in NESO's Response Services Service Terms; all under the
|
|
226
|
+
[NESO Open Data Licence v1.0](https://www.neso.energy/data-portal/neso-open-licence),
|
|
227
|
+
accessed 13 October 2026. Supported by National Energy SO Open Data.
|
|
228
|
+
|
|
229
|
+
GB imbalance (system) prices come from Elexon's BMRS, reused under the
|
|
230
|
+
[BMRS data licence](https://www.elexon.co.uk/bsc/data/balancing-mechanism-reporting-agent/copyright-licence-bmrs-data/).
|
|
231
|
+
Contains BMRS data © Elexon Limited copyright and database right 2026.
|
|
232
|
+
|
|
233
|
+
Forward scenarios use NESO's Future Energy Scenarios 2025 and 2026 Ten Year Outlook
|
|
234
|
+
([ES1](https://www.neso.energy/data-portal/future-energy-scenario-electricity-supply-data-table-es1)
|
|
235
|
+
and [ED1](https://www.neso.energy/data-portal/fes-electricity-demand-summary-data-table-ed1)
|
|
236
|
+
tables) and its
|
|
237
|
+
[Interconnector Register](https://www.neso.energy/data-portal/interconnector-register),
|
|
238
|
+
under the [NESO Open Data Licence v1.0](https://www.neso.energy/data-portal/neso-open-licence),
|
|
239
|
+
accessed 13 October 2026; supported by National Energy SO Open Data. Interconnector flows
|
|
240
|
+
come from Elexon's BMRS (FUELHH), under the same BMRS data licence. Day-ahead prices in
|
|
241
|
+
France, the Netherlands, Belgium, Norway, Denmark and Ireland come from Ember's European
|
|
242
|
+
Wholesale Electricity Price Data (primary sources ENTSO-E and SEMOpx),
|
|
243
|
+
[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), converted with ECB rates.
|
|
244
|
+
|
|
245
|
+
Fleet capacity and efficiency (DUKES 5.8 and 5.10) and fuel prices (Quarterly Energy
|
|
246
|
+
Prices 3.2.1) come from the Department for Energy Security and Net Zero, the 2021 UK ETS
|
|
247
|
+
price from the UK ETS Authority's
|
|
248
|
+
[carbon price determination](https://www.gov.uk/government/publications/determinations-of-the-uk-ets-carbon-price),
|
|
249
|
+
and carbon price support rates from HM Revenue & Customs; they contain public sector
|
|
250
|
+
information licensed under the
|
|
251
|
+
[Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/).
|
|
252
|
+
EU ETS (to 2020) and UK ETS (from 2022) prices come from the World Bank
|
|
253
|
+
[Carbon Pricing Dashboard](https://carbonpricingdashboard.worldbank.org/compliance/price)
|
|
254
|
+
([CC BY 4.0](https://creativecommons.org/licenses/by/4.0/)), converted to GBP with a cross
|
|
255
|
+
rate OpenEnergy derives from euro reference rates (source: European Central Bank). Unit
|
|
256
|
+
sizes and minimum loads for unit commitment come from the Danish Energy Agency's
|
|
257
|
+
[Technology Data catalogue](https://ens.dk/en/analyses-and-statistics/technology-data-generation-electricity-and-district-heating)
|
|
258
|
+
([CC BY 4.0](https://creativecommons.org/licenses/by/4.0/)), and start-up costs from Kumar
|
|
259
|
+
et al., *Power Plant Cycling Costs*, NREL/SR-5500-55433, 2012, Table 1-1
|
|
260
|
+
(https://www.osti.gov/biblio/1046269), converted with 2011 ECB rates. All accessed
|
|
261
|
+
10 October 2026.
|
|
262
|
+
|
|
263
|
+
The optional storage backend uses PyPSA (Brown, Hörsch and Schlachtberger, *PyPSA: Python
|
|
264
|
+
for Power System Analysis*, Journal of Open Research Software 6(1), 2018,
|
|
265
|
+
https://doi.org/10.5334/jors.188).
|
|
266
|
+
|
|
267
|
+
See [data/time_series](data/time_series/README.md),
|
|
268
|
+
[data/prices](data/prices/README.md),
|
|
269
|
+
[data/carbon_intensity](data/carbon_intensity/README.md),
|
|
270
|
+
[data/system](data/system/README.md),
|
|
271
|
+
[data/fes](data/fes/README.md),
|
|
272
|
+
[data/scenarios](data/scenarios/README.md),
|
|
273
|
+
[data/app](data/app/README.md),
|
|
274
|
+
[data/response](data/response/README.md) and
|
|
275
|
+
[data/balancing](data/balancing/README.md) for sources, changes and known issues. OpenEnergy is
|
|
276
|
+
not affiliated with or endorsed by any data provider.
|
|
277
|
+
|
|
278
|
+
## License
|
|
279
|
+
|
|
280
|
+
The code is MIT licensed; see [LICENSE.txt](LICENSE.txt). The written documentation in
|
|
281
|
+
`docs/` (text, tables and findings) is licensed under
|
|
282
|
+
[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/). Bundled data is not covered by
|
|
283
|
+
either and keeps its own licence:
|
|
284
|
+
|
|
285
|
+
| Folder | Data | Licence |
|
|
286
|
+
|---|---|---|
|
|
287
|
+
| `data/time_series` | Open Power System Data time series (prices, load, renewables, to 2020) | Terms of the original sources; see the [OPSD package](https://doi.org/10.25832/time_series/2020-10-06) |
|
|
288
|
+
| `data/prices` | Ember GB and neighbouring-market day-ahead prices; ECB exchange rates | [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); ECB reuse terms |
|
|
289
|
+
| `data/carbon_intensity` | NESO Carbon Intensity API | [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) |
|
|
290
|
+
| `data/system` | NESO historic generation mix and Interconnector Register | [NESO Open Data Licence v1.0](https://www.neso.energy/data-portal/neso-open-licence) |
|
|
291
|
+
| `data/system` | DESNZ (DUKES, Quarterly Energy Prices, UK ETS 2021), HMRC | [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/) |
|
|
292
|
+
| `data/system` | World Bank Carbon Pricing Dashboard; Danish Energy Agency technology data | [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) |
|
|
293
|
+
| `data/system` | NREL Power Plant Cycling Costs (values recorded from the report) | US government-sponsored report |
|
|
294
|
+
| `data/system` | Elexon BMRS interconnector flows (daily totals) | [BMRS data licence](https://www.elexon.co.uk/bsc/data/balancing-mechanism-reporting-agent/copyright-licence-bmrs-data/) |
|
|
295
|
+
| `data/fes` | NESO Future Energy Scenarios tables (unchanged) | [NESO Open Data Licence v1.0](https://www.neso.energy/data-portal/neso-open-licence) |
|
|
296
|
+
| `data/scenarios` | OpenEnergy model output built from the sources above | Attribution of every source used; see its README |
|
|
297
|
+
| `data/app` | Precomputed web app results built from the sources above | Attribution of every source used; see its README |
|
|
298
|
+
| `data/response` | NESO response auction results and system frequency (derived monthly averages) | [NESO Open Data Licence v1.0](https://www.neso.energy/data-portal/neso-open-licence) |
|
|
299
|
+
| `data/balancing` | Elexon BMRS system prices | [BMRS data licence](https://www.elexon.co.uk/bsc/data/balancing-mechanism-reporting-agent/copyright-licence-bmrs-data/) |
|
|
300
|
+
|
|
301
|
+
Reuse of any of these requires the attribution given in the folder's `README.md`.
|
|
302
|
+
|
|
303
|
+
## Citing
|
|
304
|
+
|
|
305
|
+
If you use OpenEnergy, please cite it with the details in [CITATION.cff](CITATION.cff)
|
|
306
|
+
(GitHub's "Cite this repository" button reads it), and credit the data sources each
|
|
307
|
+
result lists.
|
|
308
|
+
|
|
309
|
+
## Contact
|
|
310
|
+
|
|
311
|
+
Akhilesh Koul · [koulakhilesh@gmail.com](mailto:koulakhilesh@gmail.com) ·
|
|
312
|
+
[LinkedIn](https://linkedin.com/in/akhilesh-koul)
|