Every formula, source, and selection rule. If you disagree with the screen, you should be able to point at the line you disagree with.
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.
Each plant is grouped with TX utility-scale PV peers sharing all of:
Minimum cohort size 6. The peer-median 12-month capacity factor is used as the expected reference.
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 × 100Monthly comparison normalizes each month against the peer cohort's monthly median to control for weather-shape effects.
A plant is flagged on hail if any of the following hold over the trailing 12 months:
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.
From the population of TX utility-scale PV plants:
Selection is fully reproducible. Code & frozen inputs are published on GitHub.
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:
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.
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.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.