Methodology

Obsessively transparent.

Every formula, source, and selection rule. If you disagree with the screen, you should be able to point at the line you disagree with.

PUBLIC INPUTS · REPRODUCIBLE

01 · Data sources

All inputs are public. Generation data is real (EIA Form 923, 2023-2024). Hail data from NOAA SPC reports. Irradiance from Open-Meteo Historical Archive. Owner names from EIA 860 Schedule 4.

  • Plant identity, COD, AC/DC capacity: EIA Form 860 (annual) + Form 923 (monthly)
  • Hourly/monthly generation: EIA-923 schedule 3, ERCOT 60-day disclosure reports
  • Hail events & stone size: NOAA NWS Storm Events Database, geocoded to county centroid then matched to plants within 50 km radius
  • PPA term assumptions: typical 15–18 yr from COD; not asset-specific

02 · Peer cohorting

Each plant is grouped with TX utility-scale PV peers sharing all of:

  • COD within ±2 years
  • DC:AC ratio within ±0.15×
  • Same NREL solar resource band (GHI within ±5%)

Minimum cohort size 6. The peer-median 12-month capacity factor is used as the expected reference.

03 · Gap calculation

Capacity factor and gap are computed as:

CF_plant = MWh_actual_12mo / (MW_AC × 8760) CF_peer_med = median( CF_i ) for i in peer cohort gap_pct = (CF_plant − CF_peer_med) / CF_peer_med × 100

Monthly comparison normalizes each month against the peer cohort's monthly median to control for weather-shape effects.

04 · Hail signal

A plant is flagged on hail if any of the following hold over the trailing 12 months:

  • ≥1 reportable event with stone diameter ≥1.5″ within 50 km
  • ≥3 events with stone diameter ≥0.75″ within 50 km

05 · Vintage flag

Plants with COD in 2016–2018 are flagged for PPA roll-off in the typical 2031–2036 window. This is a structural signal, not asset-specific.

06 · Selection rules: how the 20 were picked

From the population of TX utility-scale PV plants:

  • Filter to plants with capacity-factor gap ≤ −10% over trailing 12 months and at least one of {hail flag, vintage flag}
  • Drop plants with curtailment estimates > 4% of expected MWh (per ERCOT congestion data)
  • Drop plants with < 18 months of operating history
  • Rank remaining by absolute MWh underperformance; take the top 20

Selection is fully reproducible. Code & frozen inputs are published on GitHub.

07 · Gap decomposition

A single capacity-factor gap number conflates very different underlying causes. We split each plant's trailing-12mo gap into named, rule-based components: what is plausibly attributable to known explanators, and what is left unexplained. The unexplained residual is the closest signal to fixable underperformance an acquirer can extract from public data.

gap_pct_12mo = curtailment + hail + vintage + hybrid + residual curtailment = −7% if curtailment_suspect (ERCOT West, lon < −101.5°) else 0 hail = clamp( −1.0% × events_≥2.0″_24mo −0.3% × events_1.5–2.0″_24mo, [−8%, 0]) vintage = clamp( −0.5% × max(0, current_year − cod_year − 1), [−5%, 0]) hybrid = −4% if project_type = "Hybrid PV+BESS" else 0 residual = gap_pct_12mo − (sum of the above)

Coefficient sources:

  • −7% curtailment baseline: ERCOT West congestion has documented 5–10% generation loss for high-saturation zones; mid-range chosen.
  • −1% per ≥2.0″ event, −0.3% per 1.5–2.0″ event, capped at −8%: rule of thumb for module damage probability. Conservative; real values are insurer-specific.
  • −0.5%/year vintage drift, capped at −5%: industry-standard healthy module degradation rate is 0.5–0.8%/yr; we use the low end.
  • −4% hybrid baseline: average effect of co-located BESS charging from on-site solar on reported net generation.

Bounded total.If the explanators sum to more negative than the actual gap, components are proportionally scaled down so they cannot "over-explain"; residual is then zero, not positive.

Residual flag. A plant fires the RESIDUAL flag when both gap_pct_12mo ≤ −10% AND residual ≤ −10%: meaningful gap that can't be attributed to known explanators. Of the current top 20, ~5 fire this flag.

08 · Caveats

  • Capacity-factor gaps reflect observable underperformance and may have benign causes (commissioning ramps, planned outages, intentional curtailment).
  • Hail event-to-damage mapping is probabilistic. A 2″ stone within 50 km is not a confirmed module break.
  • Peer median is a noisy estimator with cohorts as small as 6. Wide confidence intervals.
  • PPA assumptions are generic. Real terms vary by counterparty and regulatory vintage.
  • Generation data has a 60–90 day lag; most recent months are preliminary EIA estimates.
  • Hybrid PV+BESS plants (flagged with HYBRID in the Type column) report net generation in EIA Form 923. When the co-located BESS is being charged from on-site solar, net export is reduced, making the plant look underperforming relative to a PV-only peer cohort even when irradiance-to-DC performance is fine. Read those gaps with caution; co-located storage MW is shown in the per-plant detail card.

09 · Language & legal

This work uses the terms underperformance signal and screening flag. It does not use the terms “distress score,” “default risk,” or any equivalent. No claim is made that any named plant will fail, default, or be sold.

This page is a screening artifact for acquirer outreach, not investment advice.