A mid-Columbia public utility forecasts wholesale revenue the way the region's utilities do: average water, current forward curve, one number per year. This page keeps that number exactly where it is and draws the ten thousand plausible years around it. Then it shows what you can decide once you can see them.
Disclaimer. This page was built from public documents and public data, using a quantitative and probabilistic modelling view, and reflects SignalPop's best understanding of how the forecast and the forward book are built today. It is not a statement of the utility's actual practice, which is not fully public, and the utility has not reviewed it. Where a rule is assumed, the page says so and names the document it is inferred from.
The forecast is a product of two inputs: how much water comes down the Columbia, and what the market pays for a megawatt-hour. Every rule the desk uses today — the budget number, the haircut on what is sold forward, the share left for the spot market — is a point on a distribution nobody has drawn. History gives each input an average and a spread, and gives the pair a lean: dry years arrive with high prices attached, because the whole region is short at once[3][4]. Five numbers in total. Draw from them ten thousand times and every draw is one plausible year.
The haircut sells the same block every year because the dot it works from is the same every year. Suppose instead that, at the time of commitment, a forecaster had already resolved part of this year's water uncertainty — from snowpack, soil moisture, the river forecast centre's outlook — and the block were sized from that distribution at a tolerance the board chose. Drag the skill slider to see what the difference is worth on the same ten thousand years. The comparison is tolerance-matched, so at zero skill the two rules are identical and every dollar of difference is the forecaster's; the value grows with skill, and the walk-forward backtest in Step 3 is what measures the skill honestly.
The method is the regional convention, and it is documented. Retail-side budgets and multi-year forecasts across the Northwest are stated on average or normal water: the utility's own budget assumption reads, two years running, "Average water, current forward energy and carbon price curves"[16][17]; Seattle City Light's financial forecasts "are based on average water years in the future"[18]; Idaho Power states its annual generation "under median water conditions"[19]; and the Council defines "average energy" as what the hydro system can be expected to produce in a typical year[5]. Bonneville is the instructive nuance: its hydro simulator runs every historical water year as equally likely — a distribution, not a dot — but the rate case then passes only the mean of the resulting secondary sales into the rate model[1][2]. Nothing here says that is wrong. It says that it produces one number, and that the number is the median this model has to reproduce before it is allowed to say anything else.
"Average water, current forward energy and carbon price curves."The wholesale revenue assumption as stated in the utility's 2025 and 2026 budget kickoff presentations[16][17]. The same convention Seattle City Light and Idaho Power state for their own forecasts[18][19], and the one Bonneville's rate model collapses its simulation to[1][2].
Where the current forecast method's number sits in the sorted list. A forecast that lands near the median of the cloud is mutually validating: the model reproduces the current forecast method and adds the range around it. If it sat at the 60th percentile, the planning number would be mildly optimistic, beaten in four years of ten. Either answer is useful, and neither is "your number is wrong."
The cloud is drawn from ninety years of climatology, so it says the same thing every October regardless of what the mountain looks like. A Temporal Fusion Transformer[6] is trained on the real record only — snowpack, weather, flows, gas and power prices, and what happened next — and emits quantiles, not a point. It does two things the cloud cannot: it moves the centre with this year's conditions, and it narrows the water band through spring as the runoff becomes knowable. The price band never closes, because price uncertainty does not resolve with snowpack. The forecaster feeds the simulation; it is never trained on it.
Additive, not a replacement. The baseline is the current forecast method — average water × forward curve — and it stays exactly where it is. Each layer below is added on top of it and is scored against it; nothing is subtracted.
The value of the forecaster is measured the only honest way: the same forecast made from 1 January of each past year using only what was knowable then, scored against what happened, side by side with the ninety-year average as the naive baseline[7]. The gain is the difference. If the backtest shows none, the baseline stands and the cloud alone still carries the decision.
Why the forecaster is the part that matters — and the part that is hard. The cloud is honest, but anyone with a statistics package can draw it, and the utility's own forward-transactions resolution shows a probabilistic surplus model already exists on the desk[20]. What no one on the river has is the conditioned dot: a forecast of this year's water and price, at every horizon from a week to eighteen months, that carries its own calibrated width and can say what drove it. That is a different kind of object. It has to learn from many related series at once (snowpack at a dozen SNOTEL sites, soil moisture, temperature outlooks, gas, the river forecast centre's own numbers) while respecting inputs that are known in advance (calendar, scheduled outages, contract step-dates); it has to emit quantiles rather than a point so it can be scored; it has to be tested walk-forward with no leakage from revised datasets; and it has to attribute its forecast to inputs a commissioner can repeat. The Temporal Fusion Transformer was designed for exactly that combination[6]. SignalPop implemented it natively in its own deep-learning framework in 2023 and runs transformer-based probabilistic forecasters in production on live financial data, where a mis-stated width costs money the same afternoon. The slider in Step 1 puts a dollar figure on whatever skill the backtest proves; building the thing that earns the skill is the work.
The working arrangement. The spreadsheet stays. The forecaster sits beside it, and its median must reproduce the published line before anything is added. What gets added is width — a credible range, the water–price lean, and a split chosen against a downside floor rather than a target percentage. Nobody is asked to concede that a point forecast is inaccurate, because that is not the claim: the claim is that it is conditioned on long-run averages, and a walk-forward backtest against the naive baseline shows whether conditioning on this year's information helped historically. If it did not, that is learned cheaply and honestly.
Three decisions change once the forecast has width. How much of the energy that has come free to lock into multi-year contracts; how much of this year's expected runoff to sell forward month by month; and how much capacity to hold back for the Western Resource Adequacy Program, which becomes binding for every participant from the winter 2027–28 season (1 November 2027; summer 2027 is an optional early binding season)[13]. That obligation is stated in megawatts of qualifying capacity in the program's critical hours, not in annual energy: what counts toward it depends on qualifying resources, qualifying contracts and transmission rights, and a fixed-volume forward block can constrain what the utility is able to show. All three depend on the same two things: how wide the band is right now, and whether water and price still lean against each other.
What this page does not do. It does not touch dispatch, trading or any operational system; it is advisory and reads exports. It does not claim a result: the spreads and the correlation are placeholders, the volumes are reconstructed, and the fleet is one machine. What is real is the arithmetic, the published lines it reproduces, and the shape of the decision. The pilot's job is to replace every amber tag on this page with a fitted number and a backtest, and to hand the working model to the people whose spreadsheet it sits beside.
Four kinds of number appear above. Published figures are the utility's own, copied to the decimal. Public feed figures come from USGS, EIA, BPA or NRCS; on this page the USGS flow record loads in the browser when the page is hosted, and the price history arrives with the pilot. Reconstructed figures are derived from published ones through a stated calculation. Placeholders are illustrative values chosen to be in the right neighbourhood; each is a pilot task that replaces it with a fitted, backtested number.
| Quantity | Value used | Kind | Source / how it is replaced |
|---|---|---|---|
| Revenue lines 2026–2030 (service, contracts, market, other) | as tabulated in Step 2 | Published | Q2 2026 quarterly financial review, five-year outlook [15] |
| Forecast method: "average water, current forward energy and carbon price curves" | quoted | Published | The utility's 2025 and 2026 budget kickoff presentations [16][17]; Q2 2026 review appendix [15] |
| Average annual generation | 9.0M MWh | Published | Utility fast facts ("9 million megawatt hours a year"); EIA-923 for the plant-level series (plant IDs 3883, 6200 and 6424) [11] |
| Retail load | 2.6M MWh, held constant | Reconstructed | Clean Energy Implementation Plan compliance-period forecast ÷ 4; pilot models retail as a third correlated variable |
| Cost-based contract volume | 3.6M MWh at normal water, scaling as a slice | Reconstructed | Chosen so $218.4M ÷ 3.6M = $60.7/MWh; first item on the data request |
| Market volume and implied price | 2.8M MWh; $39.3/MWh | Reconstructed | 9.0 − 2.6 − 3.6; $109.9M ÷ 2.8M MWh. Cross-check: EIA Mid-C 2010–2025 mean ≈ $43 [11] |
| Water spread σw | 0.22 (slider 0.12–0.32) | Placeholder | Fit on USGS 12462600 water-year discharge and EIA-923 generation [10][11]; proxy-vs-actual exhibit quantifies spill |
| Price spread σp | 0.35 (slider 0.20–0.50) | Placeholder | Fit on EIA/ICE Mid-C annual averages [11]; flat average, no on-peak weighting (a floor) |
| Water–price correlation ρ | −0.45 (slider −0.70–0) | Placeholder | Fit on the deseasonalised monthly record with a confidence interval and rolling windows [9]; direction supported by BPA and the Council [3][4] |
| Distribution shape | lognormal, 2×2 Cholesky; published dot at the median | Method | Glasserman §2.3 [8]; fat tails and negative prices not generated; mean sits σ²/2 above the median (2.4% water, 6.3% price) — pilot fits mean-corrected or empirical marginals and a price process with negative prices; the historical replay against today's book is the pilot's companion exhibit |
| The water years in Step 2 | seeded synthetic record until the feed loads | Placeholder | USGS 12462600 daily discharge (June 1961 on) aggregated to water years, fetched in the browser when hosted; 12453690 has no discharge record (stage and reservoir elevation only) [10]; the pilot uses EIA-923 generation and the 2020 Level Modified Streamflow record. The Step 4 rolling-correlation record stays synthetic until a price history is paired with it |
| Knowledge schedule (how fast the water band narrows Oct→Jul) | 0% → 96% resolved | Placeholder | Replaced by the forecaster's own walk-forward quantiles, scored for calibration [7]; inputs from SNOTEL and NWRFC [12] |
| Year types in Step 3 | ±15% centre shift by July | Placeholder | Stylised; the model's conditional forecast replaces it |
| Variable importance, calibration curve | illustrative | Placeholder | Produced by the trained model's attribution (variable-selection weights) and its backtest [6][7]; attribution is an interpretability aid, not a causal claim |
| Forward-book rule of thumb (haircut) | sell forward the merchant volume at P25 water (slider P5–P50) | Assumption | Regional convention documented at P10 (BPA firm), P25 (Tacoma), and the utility's P50 cap from its own probabilistic surplus model [20]–[24]; replaced by whatever the desk actually uses |
| Forecaster skill at commitment | 50% of water variance resolved (slider 0–90%) | placeholder | Produced by the walk-forward backtest against the ninety-year average; the page shows the value of whatever skill is proven |
| Freed energy available to re-allocate | 0.9M MWh/yr by 2029 | Reconstructed | Roll-off of contracts expiring end-2026 and end-2028 as a share of output; pilot uses actual contract terms |
| Fixed-price discount; shaping premium | 5%; 6% | Placeholder | Measured against actual captured price vs flat Mid-C average; applied only to flexibility actually controlled after fish, flow and coordination constraints |
| Fleet, resolution | one machine; annual | Simplification | Unit-level history and outage log; monthly correlated draw (12 means, 12 spreads, one correlation table) for the reserve and forward-book questions |
| WRAP binding season; Markets+ timing | winter 2027–28 for all participants (summer 2027 optional); October 2028 | Public | WRAP Business Practice Manual 109, transition plan; SPP Markets+ [13] |