First time user of the package. After temporary fixing some missing rows for Loy Yang, I ran the software for 2026.
I can't tell if I have set things up wrong myself or if there's an issue.
Happy to provide whatever information needed.
Hydro plants are represented as standard Generator components with
marginal_cost = 0.0 and no energy-budget or inflow limit. As a
result, they can dispatch at 100% capacity indefinitely at zero
short-run cost, producing implausibly high annual output and
suppressing regional marginal prices in hydro-heavy regions (VIC, TAS).
Inspecting operational.nc after a successful FY26 Progressive Change run:
pythonimport pypsa
n = pypsa.Network()
n.import_from_netcdf("ispypsa_runs//outputs/operational.nc")
30 "Water" generators, all at zero marginal cost
water = n.generators[n.generators.carrier == 'Water']
len=30, total p_nom=6,928 MW
Tumut 3 (1500 MW), Upper Tumut (616), Gordon (432), Poatina (300), Reece (231)...
All have marginal_cost = 0.0
No hydro in storage_units — all storage is Battery
n.storage_units.carrier.unique()
array(['Battery'], dtype=object)
No inflow series populated
n.storage_units_t.inflow.empty
True
Over the 4 representative weeks (weeks 1, 13, 26, 39 of FY26) the
operational model dispatched:
Water 35,109 GWh 27.9% <-- 6,928 MW at ~100% CF for full period
Wind 32,736 GWh 26.0%
Black Coal 22,809 GWh 18.1%
Solar 19,556 GWh 15.6%
Brown Coal 9,756 GWh 7.8%
Gas 5,741 GWh 4.6%
The Water 35,109 GWh scales (4 representative weeks × weighting
back to annual) to approximately 456 TWh/year — vs AEMO's actual
NEM-wide hydro annual generation of ~15-20 TWh/year. That's ~25×
higher than reality.
Because hydro has zero marginal cost and no budget constraint, it
sets the marginal price for most hours in VIC and TAS:
Bus Mean Median P10 P90 Max Notes
VIC $ 9.26 $ 8.58 $ 7.21 $14.02 $15.23 Hydro/brown coal setting
TAS $ 8.24 $ 8.58 $ 8.58 $ 8.58 $ 8.58 Entirely hydro-set
CNSW $29.39 $23.50 $19.74 $44.32 $171.11 Black coal setting
NNSW $29.39 $23.50 $19.74 $44.32 $171.11
For reference, FY25 NEMOSIS realised VIC annual average was
approximately $80-95/MWh — the model is pricing VIC ~90% below actuals
primarily because of unconstrained hydro.
Reproduction
yaml# ispypsa_config.yaml
scenario: Progressive Change
filter_by_nem_regions: [VIC, NSW, SA, TAS]
temporal:
range:
start_year: 2026
end_year: 2026
capacity_expansion.aggregation.representative_weeks: [1, 13, 26, 39]
operational.aggregation.representative_weeks: [1, 13, 26, 39]
trace_data:
dataset_type: full
unserved_energy:
cost: 20300.0 # FY26 MPC
ispypsa config=ispypsa_config.yaml cache_required_iasr_workbook_tables
ispypsa config=ispypsa_config.yaml create_ispypsa_inputs
[Apply Loy Yang A coal_prices.csv workaround per Issue X]
ispypsa config=ispypsa_config.yaml create_pypsa_friendly_inputs
ispypsa config=ispypsa_config.yaml create_and_run_capacity_expansion_model
ispypsa config=ispypsa_config.yaml create_and_run_operational_model
First time user of the package. After temporary fixing some missing rows for Loy Yang, I ran the software for 2026.
I can't tell if I have set things up wrong myself or if there's an issue.
Happy to provide whatever information needed.
Hydro plants are represented as standard Generator components with
marginal_cost = 0.0 and no energy-budget or inflow limit. As a
result, they can dispatch at 100% capacity indefinitely at zero
short-run cost, producing implausibly high annual output and
suppressing regional marginal prices in hydro-heavy regions (VIC, TAS).
Inspecting operational.nc after a successful FY26 Progressive Change run:
pythonimport pypsa
n = pypsa.Network()
n.import_from_netcdf("ispypsa_runs//outputs/operational.nc")
30 "Water" generators, all at zero marginal cost
water = n.generators[n.generators.carrier == 'Water']
len=30, total p_nom=6,928 MW
Tumut 3 (1500 MW), Upper Tumut (616), Gordon (432), Poatina (300), Reece (231)...
All have marginal_cost = 0.0
No hydro in storage_units — all storage is Battery
n.storage_units.carrier.unique()
array(['Battery'], dtype=object)
No inflow series populated
n.storage_units_t.inflow.empty
True
Over the 4 representative weeks (weeks 1, 13, 26, 39 of FY26) the
operational model dispatched:
Water 35,109 GWh 27.9% <-- 6,928 MW at ~100% CF for full period
Wind 32,736 GWh 26.0%
Black Coal 22,809 GWh 18.1%
Solar 19,556 GWh 15.6%
Brown Coal 9,756 GWh 7.8%
Gas 5,741 GWh 4.6%
The Water 35,109 GWh scales (4 representative weeks × weighting
back to annual) to approximately 456 TWh/year — vs AEMO's actual
NEM-wide hydro annual generation of ~15-20 TWh/year. That's ~25×
higher than reality.
Because hydro has zero marginal cost and no budget constraint, it
sets the marginal price for most hours in VIC and TAS:
Bus Mean Median P10 P90 Max Notes
VIC $ 9.26 $ 8.58 $ 7.21 $14.02 $15.23 Hydro/brown coal setting
TAS $ 8.24 $ 8.58 $ 8.58 $ 8.58 $ 8.58 Entirely hydro-set
CNSW $29.39 $23.50 $19.74 $44.32 $171.11 Black coal setting
NNSW $29.39 $23.50 $19.74 $44.32 $171.11
For reference, FY25 NEMOSIS realised VIC annual average was
approximately $80-95/MWh — the model is pricing VIC ~90% below actuals
primarily because of unconstrained hydro.
Reproduction
yaml# ispypsa_config.yaml
scenario: Progressive Change
filter_by_nem_regions: [VIC, NSW, SA, TAS]
temporal:
range:
start_year: 2026
end_year: 2026
capacity_expansion.aggregation.representative_weeks: [1, 13, 26, 39]
operational.aggregation.representative_weeks: [1, 13, 26, 39]
trace_data:
dataset_type: full
unserved_energy:
cost: 20300.0 # FY26 MPC
ispypsa config=ispypsa_config.yaml cache_required_iasr_workbook_tables
ispypsa config=ispypsa_config.yaml create_ispypsa_inputs
[Apply Loy Yang A coal_prices.csv workaround per Issue X]
ispypsa config=ispypsa_config.yaml create_pypsa_friendly_inputs
ispypsa config=ispypsa_config.yaml create_and_run_capacity_expansion_model
ispypsa config=ispypsa_config.yaml create_and_run_operational_model