§ A data investigation

The grid doesn't publish a map.
So I built one from the prices.

PJM prices out 14,450 points on the New Jersey grid every five minutes, and publishes no diagram of how any of them connect. This is what happened when I reconstructed that map from the numbers alone — then used it to chase a heat wave through four public agencies that have no reason to agree with each other.

start → 01
BUS 01

Building the map nobody publishes

PJM's real-time price feed gives every node's price every five minutes, but the price itself hides a locational signal. Split it into its two parts — system_energy_price, which is identical at every node at a given moment, and congestion + losses, which is not — and what's left is a fingerprint of the actual electrical distance between points on the grid: nodes whose congestion moves together are electrically close; nodes that diverge sit on opposite sides of a constraint.

Turn that correlation into a proper distance metric, run a minimum spanning tree over it, and the tree is a real answer to a question PJM doesn't publish an answer to: which point on the grid connects to which.

Checking it against reality A neighborhood with no name in any city database — just an unlabeled cluster in the network — converged in the reconstruction right next to its actual nearest real-world neighbor, not a more distant town it was also weakly connected to. The map wasn't guessing.

PJM doesn't publish coordinates either, but substation names embed a location in a fixed-width prefix — an undocumented convention, reverse-engineered by inspection. Match the confidently-named nodes to real municipal boundaries, then let every other node's position fall out of the network itself: each unplaced node settles at the average of its already-placed neighbors, solved to convergence. Exact on a tree.

769 PSEG-zone nodes — reconstructed backbone (lines) over real geography (dots colored by average price, blue=cheap to red=expensive). Solid outline = anchored to a real municipality by name; faint = inferred purely from the network.
BUS 02

A heat wave shows up

Once the map existed, an anomaly was hard to miss: prices across the whole region spiked hard on July 1st. Price alone isn't proof of anything — it can't testify to its own cause — so before trusting the story, it needed a witness that had nothing to do with the price feed.

The National Weather Service had issued an Extreme Heat Warning for that exact day. PJM's own metered-demand feed — actual measured megawatts, not a price proxy — independently confirmed it:

9,848 MW peak demand across the whole pulled window — 7 pm EDT, July 1st, dead center of the warning
BUS 03

Chasing it across a border

If this is really regional weather and not some artifact specific to how PJM prices its market, it shouldn't stop at PJM's border. NYISO — a different grid operator entirely, its own market design, no shared infrastructure with PJM beyond a couple of physical tie lines — should show the same spike independently. It did, and reacted harder:

ZoneOperatorJul 1 avgJul 1 peak
PSEGPJM$147$1,236
Hudson ValleyNYISO$270$2,318

Two agencies, no shared data system, same day — independent cross-validation of the heat-driven story, not a one-source coincidence.

Two honest dead ends A World Cup match drew roughly 80,000 people to MetLife Stadium during this same window. Checked for a local price bump around the stadium's own grid node — there wasn't one; a single stadium's draw is a rounding error against a multi-thousand-megawatt zone. Separately, tested whether congestion visibly propagates from node to node over time, the way a constraint might be expected to ripple outward. It doesn't — PJM computes each five-minute interval's price as one simultaneous system-wide solve, so a binding constraint shows up everywhere it affects, all at once, not phased in over subsequent intervals. Both checked and reported honestly rather than quietly dropped.
BUS 04

Into the pipes

New Jersey's marginal power plants are mostly gas-fired, so the next question was whether the pipeline feeding the region shows the same stress. Transco — the interstate gas line running from the Gulf Coast to New York City — publishes daily operational data, but nothing resembling an API: the public page is a JS-rendered shell around a form that has to be POSTed to set up a server-side session before a second request will render the actual report. Reverse-engineered that two-step flow, pulled the Zone 6 (NY/NJ/CT) delivery data, and found a real relationship:

r = 0.64 Zone 6 gas pipeline deliveries vs. PSEG electricity price, daily, over the full window

The relationship generalizes — consistently across every NJ utility sharing that gas zone (PSEG, JCPL, AECO, all within 0.01 of each other), and, weaker but real, across the Mid-Atlantic utilities one zone further south (DOM, PEPCO, BGE, AEP, all around r = 0.45) — except one, Delmarva, which shows essentially zero correlation despite sitting in the same nominal gas zone. Flagged as an open question, not explained away. And it shows up more strongly still in NYISO's downstate zones (r = 0.70–0.73) — the same pipeline feeds both grids, and New York City's generation mix leans on gas even harder than New Jersey's.

BUS 05

Which specific points feel it?

The natural next question: not just that the region's price responds to gas pipeline stress, but where, specifically, on the grid. The first attempt — correlating each of 776 nodes' own price against gas deliveries — came back completely flat. Every single node showed almost the identical number, for a reason worth sitting with rather than working around: the fuel-cost component of price is literally identical at every node on the grid at a given moment, so there was no location left in the metric to map.

The real locational signal lives in congestion, not total price — and correlating that against gas deliveries produced real structure:

Hope Creek & Salem the grid's two largest nuclear units, top the list of most gas-sensitive nodes

A plant that runs at fixed output regardless of demand becomes a friction point when everything flexible around it — the gas peakers ramping to meet a heat wave — has to be routed around a block that can't move. It's not a coincidence these are the same two units already flagged, independently, as the grid's most congestion-volatile in general.

Same 769 nodes, now colored by how strongly each one's congestion correlates with Transco Zone 6 gas deliveries (blue=insensitive to red=sensitive). The gold-outlined cluster is Hope Creek / Salem.
BUS 06

Full circle

The question this whole investigation actually grew out of was mundane: which utility serves a specific town near the New York border, when the local NJ utility (RECO) is a small subsidiary of a company that's mostly on the other grid entirely. Direct comparison, RECO (PJM) against Hudson Valley (NYISO):

MetricResult
Overall correlationr = 0.901
Average price, RECO$63.18/MWh
Average price, Hudson Valley$64.65/MWh
Jul 1 (heat peak)NYISO spiked first, +$122
Jul 2 (next day)PJM spiked harder, +$196

The strongest correlation found anywhere in this whole project — two markets that share weather but nothing else, moving together almost every day. And yet the single sharpest divergence in the entire window happened exactly in the middle of the most extreme event in it, with the spike shifting from one grid to the other one day apart. Closely related and not interchangeable, both at once, and the data says exactly where the line is.

BUS 07

Was it ever the gas?

Everything in BUS 04 is a correlation, and correlation was never enough to close that case. A heat wave pushes gas-fired power plants and the pipeline feeding them at the same time it pushes everything else on the grid — so before r = 0.64 could be trusted as gas specifically moving price, rather than gas and price both just independently tracking the same afternoon, it needed a design that could tell those two apart.

The test: treat PSEG, JCPL, AECO, and RECO — the utilities actually served by Transco Zone 6 — as one group, and a set of PJM zones with no plausible connection to that pipeline (Illinois, Ohio, West Virginia) as a control group with no reason to feel it at all. Compare how each group's congestion moves on high-gas-stress days versus low ones, after subtracting out whatever every zone has in common on a given day — including a shared heat wave. If Zone 6 stress is doing something to price on top of the weather, the served zones should move differently from the unserved ones. If it's just weather wearing a gas pipeline's clothes, they shouldn't.

Negative every version of that comparison came back with the wrong sign for a causal gas effect — served zones moved less, not more, once the shared-weather days were accounted for
What this doesn't prove Fifty-four days is one summer, not enough independent heat events to rule out a real, smaller gas-specific effect underneath the noise — this is underpowered, not a debunking. And its single most "significant" reading pits four NJ zones against exactly one control zone (Delmarva again, picked for its own near-zero gas correlation), a comparison one zone's own noise can swing on its own. Reported as inconclusive-leaning-no, in the same spirit as the Delmarva outlier itself — not explained away.

There was a more direct way to check the rival explanation than statistics alone: measure the actual weather. NOAA's own historical archives hadn't published this year's data yet — they finalize a year or more behind — so this pulled hourly readings for Newark Liberty airport, the geographic center of the Zone 6 utilities, from the near-real-time mirror of the same station network that utilities themselves lean on to fill that exact annual gap.

r = 0.82 cooling-degree-days at Newark airport vs. Transco Zone 6 gas deliveries, the same 54 days as everything above

Two supposedly independent explanations for the same price pattern turn out to barely be independent at all. Measured temperature alone correlates with congestion almost as strongly as gas deliveries do, in every one of the four served zones:

ZoneTemperature vs. congestionGas delivery vs. congestion
AECOr = 0.58r = 0.65
JCPLr = 0.56r = 0.62
PSEGr = 0.55r = 0.61
RECOr = 0.55r = 0.57

BUS 04's headline number is real and it isn't going anywhere — gas deliveries and PSEG-area prices really did move together, all summer. Whether that's gas moving price, specifically, on top of what a thermometer already explains, is on the evidence collected here unresolved and leaning no. A hot afternoon turns on every air conditioner and every gas peaker at once; a pipeline gauge and a thermometer spent this whole project mostly describing the same thing.

BUS 08

A node appears

Bergen Generating Station — a 1,229 MW gas combined-cycle plant, same PSEG zone as everything above — was a natural check on the flexible-unit idea from BUS 05: if Hope Creek and Salem's inflexibility is what makes them gas-sensitive, a big, flexible gas peaker sitting right next to them in the same zone should show the opposite pattern. It does.

6th–8th percentile where Bergen's own nodes rank on PSEG's 776-node gas-sensitivity ladder — the opposite end from Hope Creek and Salem, up at the 97th–99th

Re-running that full 776-node ranking to place Bergen surfaced something that had nothing to do with Bergen. Tied for 2nd and 3rd — a hair behind the single most gas-sensitive point on the entire grid — sat two nodes named ONYX. Not a coincidence worth ignoring: Onyx is the real-estate owner of the NEST campus in Kenilworth, the exact site from BUS 04 through BUS 07's gas story, where a 250 MW AI data center is now under construction. Both nodes carry an effective date of June 10 — eight days into this project's own pull window. The site wasn't in the price data at the start of this investigation. It showed up in the middle of it, already ranked among the most gas-reactive points on the whole PSEG grid.

Not independently confirmed PJM's pnode names aren't a verified address book, and "ONYX" could in principle be an unrelated coincidence. But a load bus named after the exact company from the news research, in the right zone, appearing at the right time, ranking 2nd of 776 — is a lot of coincidence to wave off without a better explanation on hand.

A node appearing mid-window is also a natural experiment: did anything nearby actually change when it showed up? Ranked every other PSEG node by how closely its own congestion tracked ONYX's after June 10 — the same electrical-distance proxy from BUS 01 — and split into the 25 most-correlated and 25 least. The method has no access to a map. It found one anyway:

GroupSubstations
25 nearest by correlationSpringfield, Fanwood, Westfield, Aldene/Roselle Park — the towns around Kenilworth
25 furthest by correlationBergenfield, Hillsdale, Maywood, New Milford, Waldwick — Bergen County, 20+ miles north

Comparing how each group's congestion moved before versus after June 10, net of whatever both groups had in common on any given day (the same difference-in-differences shape as BUS 07, just with a date instead of a gas-stress measure):

+$0.54/MWh how much more the near-Kenilworth nodes' congestion rose after ONYX appeared, vs. the far group — about 2.3% over a ~$23.50 baseline, p < 0.0000001 even clustering conservatively by substation rather than by individual bus
What this doesn't prove Eight days of pre-event baseline is thin, and one volatile day (June 5) does a lot of the work in it. The "near" group was picked using ONYX's own post-event data, since it has no pre-event history to pick from independently — a real selection concern, flagged rather than hidden. And this is early, likely construction-phase load, months before the actual 250 MW substation is even built. Small, real, early — not a preview of what a finished site will do.

None of this went looking for Kenilworth specifically. It fell out of checking a hypothesis about an unrelated plant twenty miles away. The map built in BUS 01 to find electrical neighbors, and the sensitivity metric built in BUS 05 to find outliers, found the data center's construction site before anyone thought to ask them to.

BUS 09

Two plants, one address

Linden, NJ hosts two large, separately-owned gas plants at roughly the same site: an independent ~974 MW cogeneration facility, physically wired via a 315 MW GE merchant transmission tie straight under the Arthur Kill to Con Edison's Goethals substation on Staten Island — and PSEG's own, separate Linden Generating Station next door. Two different companies sharing an address raised the obvious question: could the two be told apart in the price data, the way Bergen and Hope Creek/Salem (BUS 05) or Bergen and ONYX (BUS 08) could?

Twenty-some PSEG-zone pnodes carry a LINDEN prefix, splitting cleanly into two internally-consistent clusters by naming pattern — steam/combustion-turbine buses at 18 kV, and numbered UNIT buses at 13 kV. One cluster confirmed real and coherent on its own: the 13 kV group's price series is byte-identical to a separate aggregate node, LINDEN A, to fifteen significant figures — not similar, the same settlement. The obvious next guess was that the two clusters were the two different owners. It was wrong.

1,740.0 MW PSEG's actual Linden Generating Station capacity, summed straight from EIA-860's own generator-level records — and its generator IDs (1101 CT, 1201 CT, 5 GT, 6 GT...) match both LINDEN pnode clusters, not one each

Both clusters are PSEG's — the steam/CT trains and the numbered units alike. The independent cogeneration plant, the one actually wired to Staten Island, doesn't appear under any findable name in this project's own pnode table at all: not LINDEN, not COGEN, not the EIA-860 generator prefixes (GTG, STG) it actually uses on its own filings. Whether that's a naming convention this project hasn't found yet, or a plant PJM simply doesn't expose at individual-generator granularity, is an open question here, not a resolved one.

Same standard as everywhere else in this piece Price behavior alone can't recover a company name — two plants at the same site, same fuel, same grid operator, are expected to look statistically similar by construction, regardless of who owns them. What actually resolved this wasn't a cleverer statistical test, it was EIA-860's plant table: real generator IDs, cross-referenced, not inferred from price alone. Worth remembering before trusting the next name-based guess in this project as far as this one was trusted.
BUS 10

The other tie

Bergen Generating Station's hometown, Ridgefield NJ, turns out to host a second line to New York — not a repeat of BUS 09, structurally. Hudson Transmission Partners (HTP) is a 660 MW HVDC cable, not a VFT, running from a Ridgefield converter station straight to Con Edison's West 49th Street substation in Manhattan — a different borough than Linden's Staten Island tie, a different technology entirely, the same PJM zone. One real caveat this one carries that Linden's doesn't: NYPA holds 495 MW of the 660 MW under a long-term contract, so only 165 MW is genuinely merchant, price-driven flow — price data alone can't speak for the contracted majority.

MetricLinden VFT (Staten Island)Hudson TP (Manhattan)
NYC side higher85.0% of intervals84.5% of intervals
Mean spread (PJM − NYC)−$7.29/MWh−$6.41/MWh
Correlation with NYC pricer = 0.500r = 0.500

Same direction, same rough magnitude, same correlation with the NY side to three decimal places — on two ties that don't share a technology, a converter station, or a borough. Checking whether that's a coincidence or the same underlying signal twice:

r = 0.9989 correlation between Hudson TP's and Linden VFT's PJM-side prices — not literally identical (only 0.02% of intervals match exactly, so it's not a data artifact), but as close as two genuinely different assets get

This is BUS 01's central fact showing up a third time from a new angle: system_energy_price is uniform across every PJM node at a given moment, so any PJM-side interface — whichever converter station, whichever NYC substation it actually terminates at — mostly just reflects the same underlying PJM system price. The specific location of the tie barely matters; which grid it's rooted in is almost the whole story.

BUS 11

What would 250 more megawatts do

Back to the question BUS 08 and BUS 09 never actually answered: what does CoreWeave's 250 MW Kenilworth request do to PSEG's price, once it's fully online? Not a production-cost model — the reduced-form version, fit directly against what's already in this dataset: PSEG's own hourly zone-average price regressed against PS-zone metered load, then evaluated at load-plus-250.

A quadratic fit beats linear decisively (R2 0.25 → 0.51) — real convexity, the textbook merit-order signature: cheap units cover typical load, progressively more expensive peakers get called in as load climbs toward the zone's own peak. That single fact matters more than any specific dollar figure below, because it means the price impact of new load isn't one number — it depends entirely on what the rest of the system is doing when that load shows up.

Specificationat average loadat P90 loadat peak load
Full sample+$7.37/MWh+$39.10/MWh+$90.74/MWh
Excluding top 1% of hours+$5.44/MWh+$16.70/MWh+$32.06/MWh
Log-linear (level-free)+$3.11/MWh+$12.60/MWh+$219.24/MWh
The spread is the answer, not a problem with it Three reasonable specifications, three different peak-load numbers ranging from $32 to $219 — dropping just the most extreme 1% of hours roughly halves the full-sample estimate, confirming the curvature is real but genuinely sensitive to a handful of scarcity events, not a single settled figure. What's stable across all three: the impact at typical load is modest (roughly $3–7 per MWh), and 5–20× larger at peak — which is exactly when a data center's own draw is most likely to land.

One more split worth having: congestion-specific impact tops out around +$6–9/MWh at peak across specifications, far below the total-price numbers above. Most of the price effect of new load shows up as a system-wide shift, not a local congestion one — the same uniform-system-energy-price fact from BUS 01 and BUS 10, reappearing as the reason a single new load in Kenilworth mostly raises everyone's price a little, rather than raising Kenilworth's price a lot.

BUS 12

The tails nobody had checked

Everything on this page up to here is a mean, a correlation, or a regression coefficient — every one of them describing the middle of a distribution. None of it says anything about how violently these prices can move, or whether the wild moments cluster in time or scatter randomly. Ran that check, finally, across four series already central to this page: the PSEG zone average, ONYX, Bergen, and the Linden VFT interface.

SeriesExcess kurtosisSkewTop-1% tail share
PSEG zone average115.7+9.7127.5%
ONYX92.7+8.7926.0%
Bergen116.1+9.6827.2%
Linden VFT116.1+9.7027.4%

Excess kurtosis over 90 everywhere — a normal distribution scores zero — and a Ljung-Box test rejects independent volatility outright for all four (p < 0.0000001, no exceptions): big price moves cluster in time rather than scattering randomly, consistent with real grid-stress events unfolding over sustained stretches, not isolated five-minute blips. Roughly a quarter of all price movement, measured as share of total deviation from the mean, is concentrated in the single most extreme 1% of five-minute intervals.

Nearly identical how similar all four series' tail shape is, despite wildly different mean-level stories (gas-sensitive ONYX, gas-insensitive Bergen, an actively arbitraged interface)

That's the finding, not the individual numbers: where a node sits changes its average congestion sensitivity — Bergen and Hope Creek/Salem (BUS 05), Bergen and ONYX (BUS 08) sit at opposite ends of that ranking. It doesn't change how violently the tails behave. The fat tails and the volatility clustering come from shared, system-wide scarcity events — the same uniform system_energy_price fact this page keeps rediscovering, one more time, from the one angle nothing so far had actually checked.

BUS 13

One relationship that wouldn't collapse

Every gas number on this page so far has been Zone 6, aggregated to one total. The pull actually holds 566 distinct locations across all 8 Transco zones — 223 delivery points, 249 receipt points, 92 transit segments — so the aggregate view was always throwing most of it away. Correlating each named location's own volume against PSEG's price, the same way BUS 05 ranked price nodes, turned up something PSE&G's own delivery meter didn't show: PUBLIC SERVICE E&G's own point correlates at a middling r = 0.44 — whatever's driving PSEG's stress most isn't most visible at PSEG's own meter.

Three upstream candidates got the harder test — not just correlation, but correlation checked against every confound available: Zone 1 (South Texas, closest this pipeline gets to Henry Hub), Zone 5 (the DMV corridor), and Leidy (the receipt points exchanging gas with the Leidy hub storage complex in Clinton County, PA) — run against all 23 PJM zones in this pull, not just PSEG, to see whether a relationship concentrates where Transco actually goes or scatters evenly everywhere.

Upstream seriesCDD-controlled pattern across 23 zones
Zone 1 (Henry-Hub-ward)Nothing anywhere — best p = 0.12
Zone 5 (DMV)Inverted — strongest in COMED/AEP/OVEC (Illinois, Ohio), weakest in PSEG/JCPL/AECO
LeidyConcentrated exactly where the pipeline goes — AECO/PECO/JCPL/PSEG/RECO on top, Midwest zones falling off

Zone 5's pattern is worse than confounded — it's backwards. Its strongest correlation with PSEG stress runs through zones with no physical Transco connection at all. It isn't tracking anything PSEG-specific; it's a broad PJM-wide pattern that happens to show up hardest exactly where the pipeline isn't. Leidy is the opposite: a real geographic gradient, falling off toward the zones it has no reason to touch.

Leidy got pushed harder to see if it would break under the same scrutiny that killed the original Zone 6 claim (BUS 07):

Controls on Leidy vs. PSEGPartial rp
CDD, Newark0.440.0008
CDD (Newark) + Zone 6 delivery + weekend0.300.025
CDD, Newark + CDD, State College (38 miles from Leidy)0.330.014
All four at once0.320.018
Why the second weather station isn't just belt-and-braces Newark and State College CDD correlate at r = 0.81 — the same broad weather system, but not redundant. Adding the closer station does pull Leidy's estimate down (0.44 to 0.32) — some of the original relationship really was regional weather a single Newark reading couldn't see. Just not all of it.
Still standing running Zone 5 through this exact same two-station test drops it to partial r = 0.16, p = 0.24 — not significant. The method isn't lenient across the board; it kills Zone 5 again while Leidy keeps surviving.

Of every upstream-flow relationship tested against PJM price on this page — the original Zone 6 claim, the difference-in-differences test, Zone 1, Zone 5 — Leidy is the first that hasn't collapsed under a real confound check. Still correlational, still one summer, still 54 days, and surviving four specific controls isn't the same as ruling out every possible one. But it's the first result in this whole investigation that isn't just the weather again.