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.
Files changed (59) hide show
  1. openenergy-4.1.0/.gitignore +36 -0
  2. openenergy-4.1.0/CITATION.cff +24 -0
  3. openenergy-4.1.0/LICENSE.txt +21 -0
  4. openenergy-4.1.0/PKG-INFO +312 -0
  5. openenergy-4.1.0/README.md +275 -0
  6. openenergy-4.1.0/pyproject.toml +97 -0
  7. openenergy-4.1.0/src/openenergy/__init__.py +20 -0
  8. openenergy-4.1.0/src/openenergy/app/__init__.py +9 -0
  9. openenergy-4.1.0/src/openenergy/app/pages.py +379 -0
  10. openenergy-4.1.0/src/openenergy/app/results.py +176 -0
  11. openenergy-4.1.0/src/openenergy/app/runs.py +190 -0
  12. openenergy-4.1.0/src/openenergy/app/server.py +397 -0
  13. openenergy-4.1.0/src/openenergy/assets/__init__.py +19 -0
  14. openenergy-4.1.0/src/openenergy/assets/battery.py +184 -0
  15. openenergy-4.1.0/src/openenergy/assets/renewable.py +53 -0
  16. openenergy-4.1.0/src/openenergy/backtest/__init__.py +23 -0
  17. openenergy-4.1.0/src/openenergy/backtest/engine.py +550 -0
  18. openenergy-4.1.0/src/openenergy/backtest/response.py +147 -0
  19. openenergy-4.1.0/src/openenergy/cli.py +489 -0
  20. openenergy-4.1.0/src/openenergy/data/__init__.py +33 -0
  21. openenergy-4.1.0/src/openenergy/data/carbon.py +90 -0
  22. openenergy-4.1.0/src/openenergy/data/ember.py +109 -0
  23. openenergy-4.1.0/src/openenergy/data/fes.py +85 -0
  24. openenergy-4.1.0/src/openenergy/data/fleet.py +183 -0
  25. openenergy-4.1.0/src/openenergy/data/interconnectors.py +118 -0
  26. openenergy-4.1.0/src/openenergy/data/neso.py +71 -0
  27. openenergy-4.1.0/src/openenergy/data/opsd.py +116 -0
  28. openenergy-4.1.0/src/openenergy/data/quality.py +23 -0
  29. openenergy-4.1.0/src/openenergy/data/response.py +151 -0
  30. openenergy-4.1.0/src/openenergy/data/series.py +186 -0
  31. openenergy-4.1.0/src/openenergy/data/update.py +102 -0
  32. openenergy-4.1.0/src/openenergy/dispatch/__init__.py +20 -0
  33. openenergy-4.1.0/src/openenergy/dispatch/_milp.py +85 -0
  34. openenergy-4.1.0/src/openenergy/dispatch/arbitrage.py +331 -0
  35. openenergy-4.1.0/src/openenergy/dispatch/colocated.py +209 -0
  36. openenergy-4.1.0/src/openenergy/errors.py +21 -0
  37. openenergy-4.1.0/src/openenergy/forecast/__init__.py +10 -0
  38. openenergy-4.1.0/src/openenergy/forecast/baseline.py +77 -0
  39. openenergy-4.1.0/src/openenergy/forecast/ml.py +96 -0
  40. openenergy-4.1.0/src/openenergy/metrics/__init__.py +6 -0
  41. openenergy-4.1.0/src/openenergy/metrics/capture.py +80 -0
  42. openenergy-4.1.0/src/openenergy/metrics/summary.py +101 -0
  43. openenergy-4.1.0/src/openenergy/py.typed +0 -0
  44. openenergy-4.1.0/src/openenergy/report/__init__.py +21 -0
  45. openenergy-4.1.0/src/openenergy/report/document.py +294 -0
  46. openenergy-4.1.0/src/openenergy/report/figures.py +219 -0
  47. openenergy-4.1.0/src/openenergy/report/load.py +126 -0
  48. openenergy-4.1.0/src/openenergy/scenario.py +540 -0
  49. openenergy-4.1.0/src/openenergy/system/__init__.py +49 -0
  50. openenergy-4.1.0/src/openenergy/system/_pypsa.py +161 -0
  51. openenergy-4.1.0/src/openenergy/system/commitment.py +364 -0
  52. openenergy-4.1.0/src/openenergy/system/fleet.py +205 -0
  53. openenergy-4.1.0/src/openenergy/system/forward.py +143 -0
  54. openenergy-4.1.0/src/openenergy/system/merit.py +59 -0
  55. openenergy-4.1.0/src/openenergy/system/model.py +251 -0
  56. openenergy-4.1.0/src/openenergy/system/netload.py +157 -0
  57. openenergy-4.1.0/src/openenergy/system/scenario.py +475 -0
  58. openenergy-4.1.0/src/openenergy/system/storage.py +120 -0
  59. 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
+ [![CI](https://github.com/koulakhilesh/OpenEnergy/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/koulakhilesh/OpenEnergy/actions/workflows/ci.yml)
52
+ [![Docs](https://github.com/koulakhilesh/OpenEnergy/actions/workflows/docs.yml/badge.svg?branch=master)](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)