WattMarkets

Methodology

Model mercury-1.0.0 · calibrated on real ERCOT settled load. The call is never naked — here is every input and every coefficient.

What we predict

For each eligible day (June–September for 4CP) we estimate P(this day sets the month's coincident-peak). A day can only be the monthly peak if its load exceeds the month-to-date maximum — the Horizon. We publish two numbers: p_raw (the honest baseline, ERCOT forecast vs the Horizon) and p_final (net of our estimated demand response). Publishing both is the transparency feature.

The model, in math

A calibrated logistic regression over 5 features. z = intercept + Σ wᵢ·featureᵢ, P = 1/(1+e⁻ᶻ).

FeatureWeightMeaning
intercept-1.6553bias
margin_gw0.5394GW over the month-to-date max. Only a new max can be the month peak.
load_gw0.2257Absolute hotness. Peak days sit near seasonal maxima; prunes low-load early-month new maxima.
temp_anomaly_f0.12Heat above normal (prior-weighted for v1.0.0).
dow_factor-0.2202Weekday vs weekend/holiday.
days_remaining_norm-2.4296Fewer days left -> a new max is more likely to survive as the month peak. The strongest driver in the fit.

Calibrated on REAL ERCOT settled hourly load, seasons 2022-2024 (get_hourly_load_post_settlements). Fitted by class-weighted L2 logistic regression on the eligible-window daily maxima; label = day was the true monthly peak. Temperature coefficient is a documented prior (0.12/degF), not backtest-fitted, pending historical-weather ingestion (v1.1).

How it scored (backtest, 2022–2024, real settled load)

At the actionable WARNING threshold, WattMarkets reached 16.7% precision vs the naive “alert every new month max” baseline's 14.8% — at 60 false-alarm curtailment hours vs 138. The WATCH tier catches most monthly peaks a day ahead.

The baseline's recall of 100% is a ceiling it only reaches by flagging every new intra-month max. We publish our misses on the Scorecard.

Program config (ERCOT 4CP · 2026)

{
  "peaks": {
    "period": "month",
    "count": 1
  },
  "eligible_months": [
    6,
    7,
    8,
    9
  ],
  "interval_minutes": 15,
  "eligible_window_ct": [
    "13:00",
    "20:00"
  ],
  "levels": {
    "watch": 0.25,
    "warning": 0.5,
    "action_interval": 0.2
  }
}

Integrity

Every live call is written to an append-only, SHA-256 hash-chained log before its interval closes. Nightly we publish the terminal hash at /v1/scorecard/attestations — anyone can verify we never edited history.

Informational only; curtailment decisions and their outcomes are yours. WattMarkets is not a licensed advisor and makes no guarantee of accuracy.