Skip to content

Hydro modelled as zero-cost unlimited baseload #98

@dnssoftware

Description

@dnssoftware

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions