This is a comprehensive electricity market simulator that models day-ahead electricity markets with multiple utilities, diverse generation portfolios, and sophisticated bidding strategies. The simulator supports both short-term analysis and multi-year simulations using time-series profiles.
- Multi-utility competition with portfolio-based bidding
- Diverse generation mix: coal, gas, nuclear, wind, solar, hydro, storage
- Multiple bidding strategies: marginal cost, strategic, and optimization-based
- Profile-based simulation for multi-year analysis
- Policy modeling: carbon tax, renewable mandates, capacity payments
- Comprehensive analytics and visualization
- Day-ahead energy market with hourly resolution
- Merit-order dispatch with uniform pricing
- Market power analysis (HHI, Lerner index)
- Bilateral contracts support
- Utility Companies: Portfolio of generators with unified bidding
- Independent Generators: Single-unit participants
- Consumers: Price-elastic demand
- Storage: Battery systems with arbitrage
- Marginal Cost: Competitive bidding at production cost
- Strategic: Markup-based bidding with market power
- Optimal: Unit commitment with forward-looking optimization
- Hourly load profiles with seasonal patterns
- Renewable capacity factors (wind/solar)
- Fuel price time series
- Hydro availability curves
Python 3.8+
pandas >= 1.3.0
numpy >= 1.21.0
matplotlib >= 3.4.0
seaborn >= 0.11.0
pyyaml >= 5.4.0# Clone or download the project
cd electricity-market-simulator
# Create virtual environment (recommended)
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install pandas numpy matplotlib seaborn pyyaml# Run basic simulation with individual generators
python main.py
# Visualize results
python visualization.py# Run simulation with utility companies
python run_utility_simulation.py
# Results saved to: results/utility_simulation_results.csv
# Plots saved to: results/plots/# Run multi-year simulation with profiles
python run_profile_simulation.py
# This will:
# 1. Create example profiles if missing
# 2. Run simulation for profile duration
# 3. Generate comprehensive analysis- Core simulation engine
- Base classes:
Agent,Generator,Consumer,StorageUnit - Market clearing mechanism
- Policy implementations
UtilityAgent: Manages portfolio of generatorsGeneratorUnit: Detailed generator model- Bidding strategies:
MarginalCostBidding,StrategicBidding,OptimalBidding - Market power analysis tools
ExtendedSimulation: Handles utility agentsExtendedDayAheadMarket: Proper utility state updates- Fixed tracking and results generation
- Performance analysis functions
ProfileManager: Loads and manages CSV profilesProfileBasedUtilityAgent: Dynamic parameter updatesProfileBasedSimulation: Multi-year simulation engine- Automatic profile generation
Basic configuration for simple agents:
simulation:
time_periods: 168 # 1 week
generators:
- type: thermal
params:
capacity: 500
marginal_cost: 30Detailed utility portfolios:
utilities:
- id: "MegaPower_Corp"
strategy: "strategic"
markup: 0.15
generators:
- unit_id: "MP_Coal_1"
capacity: 600
marginal_cost: 28Profile-based configuration:
profiles:
- name: "load_profile"
file: "load_profile.csv"
- name: "fuel_prices"
file: "fuel_prices.csv"All in CSV format with timestamp column:
- load_profile.csv: Hourly demand for each consumer
- wind_cf.csv: Wind capacity factors (0-1)
- solar_cf.csv: Solar capacity factors by hour
- fuel_prices.csv: $/MMBtu for gas, coal, etc.
- hydro_availability.csv: Seasonal water availability
generators:
- unit_id: "unit_1"
unit_type: "gas"
capacity: 100 # MW
marginal_cost: 45 # $/MWh
min_output: 30 # MW
ramp_rate: 50 # MW/period
startup_cost: 5000 # $
efficiency: 0.55 # Heat rate = 1/efficiencyutilities:
- id: "UtilityName"
strategy: "strategic" # or "marginal_cost", "optimal"
markup: 0.10 # 10% markup for strategic
generators: [...] # List of unitsconsumers:
- agent_id: "city_load"
demand_profile: [800, 850, ...] # Or use profile reference
price_elasticity: -0.1 # Demand response# In Python
from main import Simulation, create_default_config
config = create_default_config()
sim = Simulation(config)
results = sim.run(168) # 1 week# Command line
python run_utility_simulation.py
# Or with custom config
python run_utility_simulation.py --config my_config.yaml# Auto-generates example profiles if missing
python run_profile_simulation.py
# Runs for entire profile duration (e.g., 2 years)-
CSV Results: Hourly market data
- Time period and timestamp
- Clearing prices
- Generation by unit and type
- Fuel prices (if profile-based)
-
Visualizations:
- Price duration curves
- Generation dispatch stacks
- Market share analysis
- Price vs fuel correlations
- Renewable penetration
-
Add Transmission Constraints
class NetworkConstraint: def __init__(self, from_zone, to_zone, limit): self.limit = limit
-
Implement Ancillary Services
class AncillaryMarket(Market): def __init__(self): self.products = ['regulation', 'spinning_reserve']
-
Add Forecasting
class PriceForecast: def predict(self, historical_data): # ML model for price prediction
-
Multi-Area Markets
- Define zones
- Add transmission limits
- Implement LMP calculation
- Kirschen & Strbac: Fundamentals of Power System Economics
- Wood & Wollenberg: Power Generation, Operation, and Control
- FERC market design documentation