Skip to content

Scenarios

A scenario is a YAML file describing the data, the battery, the forecast and the dispatch settings. Unknown keys and invalid values are rejected with the setting named.

name: gb-2019-naive            # letters, digits, ".", "_", "-"; used as the output folder
data:
  path: ../data/time_series/time_series_60min_singleindex_filtered.csv
  zone: GB_GBN
  start: 2019-01-01
  end: 2019-12-31
battery:
  power_mw: 1
  energy_mwh: 2
  eta_charge: 0.95
  eta_discharge: 0.95
  cycle_fade: 0.00002
  calendar_fade: 0.01
forecast: naive_last_week
dispatch:
  degradation_cost: 5

data

Key Default Meaning
source opsd opsd (OPSD time series, to September 2020) or ember (GB hourly prices from June 2016, converted to GBP at ECB daily rates)
path required Price CSV; relative paths resolve against the scenario file
zone GB_GBN Bidding zone (see openenergy data info); ember covers GB only
start, end whole file First and last UTC day to simulate, inclusive
max_gap_hours 2 Interior price gaps up to this length are linearly interpolated

When start is set, the 14 days before it are loaded as forecaster history only. Co-located assets need OPSD's capacity-factor profiles, so they require source: opsd. examples/gb-2022-naive.yaml backtests a battery on 2022 prices from the bundled Ember file; openenergy data update downloads the latest months.

battery

Key Default Meaning
power_mw required Charge and discharge power rating
energy_mwh required Rated energy capacity
eta_charge, eta_discharge 0.95 One-way efficiencies in (0, 1]
soc_min, soc_max 0, 1 State-of-charge window, as fractions of usable energy
initial_soc 0.5 Starting state of charge
cycle_fade 0 Fraction of capacity lost per equivalent full cycle
calendar_fade 0 Fraction of capacity lost per year

forecast

Either a method name, or a mapping with method and its options.

Method Options
naive_last_week (default) none
perfect_foresight none
noisy_foresight error_std (required, currency/MWh), seed
gradient_boosting train_start, train_end (required, before data.start), seed

dispatch

Key Default Meaning
end_soc start energy End-of-day state of charge, as a fraction of usable energy
degradation_cost 0 Cost per MWh of throughput, in the price currency
max_cycles none Cap on equivalent full cycles per day
mip_rel_gap 1e-6 Solver optimality tolerance
lookahead_days 0 Also plan this many following days (0–6) on forecasts made at the same decision time; only the first day is settled. The perfect-foresight benchmark uses the same lookahead. See Concepts

Other keys

Key Default Meaning
lead_hours 12 Hours before each UTC day that the plan is fixed

assets (co-located sites)

Optional. Adds renewable plants that share the battery's grid connection.

assets:
  pv: {capacity_mw: 10, degradation_per_year: 0.005}
  wind: {capacity_mw: 5, technology: wind_offshore}
grid:
  export_limit_mw: 12
Key Default Meaning
pv, wind none At least one plant
capacity_mw required Installed capacity
degradation_per_year 0 Fraction of output lost per year, compounding
technology solar / wind OPSD profile: solar, wind, wind_onshore, wind_offshore

OPSD capacity factors end on 29 December 2019, so site scenarios must end by then.

grid

Only valid with assets.

Key Default Meaning
export_limit_mw total plant capacity Shared export limit
import_limit_mw export limit Grid charging limit; 0 forbids grid charging
premium_per_mwh 0 Support paid per MWh of renewable output delivered

carbon

Optional. Reports net emissions and can steer dispatch with a carbon price.

carbon:
  path: ../data/carbon_intensity/gb_national.csv
  price_per_t: 50
  planning: last_week
Key Default Meaning
path required NESO carbon-intensity CSV; relative to the scenario file
price_per_t 0 Carbon price in currency per tCO2 added to planning prices
planning last_week Intensity dispatch plans on: last_week (no lookahead) or actual (upper bound)

Carbon intensity covers 2018 to 2025. Days without complete intensity are skipped.

response

Optional, battery-only scenarios. Sells GB dynamic frequency response alongside trading; see Revenue stacking for the model and results.

response:
  path: ../data/response/gb_dynamic_response.csv
  services: [DCL, DCH]
  forecast: previous_day
  energy: unpaid
Key Default Meaning
path required Response clearing-price CSV; relative to the scenario file
utilisation_path gb_response_utilisation.csv next to path Monthly energy each service moves per MW
services required Any of DCL, DCH, DML, DMH, DRL, DRH (Dynamic Containment, Moderation, Regulation; low and high)
forecast previous_day Response price planned on: the latest earlier block at the same UK time whose result was public at the decision time, or actual (upper bound)
energy unpaid Energy delivered by response: unpaid (NESO's ABSVD adjustment) or day_ahead (bought and sold at the trading price)

Response prices start on 16 September 2021 (DM and DR on 26 March 2022). Days with a block lacking a clearing price for a chosen service are skipped.

System scenarios

A file with a system: section instead of data: describes one GB year for the system model: scaled renewables and fixed profiles, thermal capacity, fuel and carbon prices, added storage, and optionally a battery valued on the modelled prices. Run it with openenergy system run; the full reference is on that page.

Outputs

openenergy run writes to outputs/<name>/ unless --out is given:

  • intervals.csv: price, forecast, charge, discharge, stored energy and revenue per interval; sites add available output, plant to grid, plant to battery, curtailment, grid charging, net export and premium;
  • daily.csv: revenue, expected revenue, energy charged and discharged, cycles, SOH and end-of-day energy; sites add premium, available and curtailed energy;
  • benchmark_daily.csv: the same daily columns for the perfect-foresight benchmark, when the scenario is not perfect foresight itself;
  • summary.json: the headline metrics, skipped days with reasons, the number of interpolated intervals, the full validated configuration, the package version and the data attribution; sites add the co-location comparison, the plant's capture metrics, the number of clipped capacity factors and the upper-bound note; carbon runs add emissions_t, the NESO attribution, rejected intensity values and the average-intensity caveat; response runs add response_revenue, the NESO attribution and a note on what the response model leaves out.

With response, intervals.csv and daily.csv also hold energy_revenue and response_revenue (their sum is revenue), and intervals.csv the MW held for each service (dcl_mw, ...).

openenergy report outputs/<name> turns these files into an HTML page of charts; see Reports.