European Network for Long-term Insights on Grid prices, Hedging & Trends
Multi-year electricity market forecast model simulating market clearing across all European bidding zones using solver-based optimization.
- Models all European bidding zones with multi-year foresight
- Reproduces market clearing using optimization (Gurobi/HiGHS)
- Easy scenario configuration via Excel and YAML
- Flexible yearly or weekly simulation modes
- Comprehensive output: prices, dispatch, flows, curtailment
Clone the repository via:
git clone https://github.com/marco-saretta/enlight.gitThen proceed to create the virtual environment ro run enlight.
- Installing with conda:
cd <enlight_directory>/enlight # Set the enlight directory
conda env create -f environment.yaml # Create the environment via .yaml file
conda activate enlight-env # Activate the environment- Installing with uv:
cd <enlight_directory>/enlight # Set the enlight directory
uv sync # Create the virtual environment with uv from .toml file
uv run main.py # Run main.py scriptNote: id uv is not installed, please run the following in powershell. Please refer to the uv installation guide.
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" # Optional: install uv1. Configure scenarios in config/scenarios_config.xlsx
Define technology capacities, costs, and constraints for each scenario.
2. Set simulation parameters in config/config.yaml
scenario_list:
- scenario_1:
run_mode: "yearly" # Full year optimization
year: 2030
plant_aggregation: false
- scenario_2:
run_mode: "weekly" # Week-by-week optimization
year: 2040
plant_aggregation: true
week_range:
start_week: 10
end_week: 20
solver_name: "gurobi" # Options: "gurobi", "highs"
bidding_zones: # Select zones to model
- AT
- DELU
- FR
# ...3. Run simulations
python main.py# main.py
from enlight.runner import EnlightRunner
from pathlib import Path
if __name__ == "__main__":
root_path = Path(__file__).parent.resolve()
r = EnlightRunner(root_path=root_path)
r.run_scenario('scenario_1')
r.run_scenario('scenario_2')Each scenario execution follows an automated pipeline:
Transforms raw data into model-ready formats. Processes generation profiles, demand, network topology, and validates consistency. Saves to simulations/<scenario_name>/data/.
Loads preprocessed data into memory as structured objects (DataFrames, arrays). Organizes by time period (yearly: 8760h, weekly: 168h). Accessible for debugging.
Solves market clearing optimization (maximize social welfare subject to power balance, generation limits, transmission capacity, storage dynamics). Outputs dispatch schedules, prices, and flows.
Extracts solutions, calculates metrics, saves results to simulations/<scenario_name>/results/. For weekly mode, combines individual weeks into annual summaries.
Yearly: Single optimization over 8760 hours. Captures seasonal patterns and long-term storage. Higher memory requirement.
Weekly: Sequential optimization of individual weeks. Lower memory footprint, suitable for large systems. May not capture multi-week storage strategies.
simulations/<scenario_name>/
├── data/ # Preprocessed inputs
└── results/ # Model outputs
├── electricity_prices.csv
├── generation_schedules.csv
├── lineflows.csv
├── demand_served.csv
├── curtailment.csv
└── marginal_generator.csv
Execution logs with timing saved to logs/enlight.log:
2024-11-24 10:30:00 - enlight - INFO - Starting: Data preprocessing
2024-11-24 10:30:05 - enlight - INFO - Completed: Data preprocessing in 5.23 seconds
2024-11-24 10:30:05 - enlight - INFO - Starting: Model execution
2024-11-24 10:45:12 - enlight - INFO - Completed: Model execution in 904.56 seconds
.
├── main.py # Entry point
├── config/
│ ├── config.yaml # Simulation settings
│ └── scenarios_config.xlsx # Scenario parameters
├── data/ # Base input datasets
├── enlight/
│ ├── data_ops/ # Preprocessing, loading, export
│ ├── model/ # Optimization model
│ ├── runner/ # Pipeline orchestration
│ └── utils/ # Logging, timing, helpers
├── simulations/ # Scenario outputs
└── logs/ # Execution logs
See docs/ for detailed guides on configuration, architecture, API reference, and troubleshooting.
pytest tests/GPL-3.0 license.
Marco Saretta | Collaborator: Viktor Johnsen
@software{enlight2024,
author = {Saretta, Marco and Johnsen, Viktor},
title = {ENLIGHT: European Network for Long-term Insights on Grid prices, Hedging \& Trends},
year = {2024},
url = {https://github.com/marco-saretta/enlight}
}