Constraint Shift Factors (Estimated)
Estimated sensitivity of every CAISO pricing location's price to every binding transmission constraint: one row per constraint, contingency, and location, recomputed nightly over a rolling 60-day window.
Overview
This is what answers 'which nodes drive this constraint' and 'which constraints is this node exposed to'. Covers CAISO's INTERTIE AND NOMOGRAM constraints, not internal transmission branches, over roughly 19,400 pricing nodes. CAISO publishes no contingency or terminal names on this feed, so contingency_name, from_station and to_station are always empty. shift_factor is in the ISO's orientation — POSITIVE means an incremental MW injected at that node increases loading on the constraint and the node is paid below system lambda while it binds; NEGATIVE means generation there relieves the constraint and earns a premium. These are ESTIMATES recovered from the price identity LMP = energy - sum(shift_factor x shadow_price), not a published PTDF matrix. They are measured RELATIVE TO THE MARKET'S REFERENCE — the identity yields SF(node) - SF(reference), so a single absolute value should be quoted as 'relative to the system reference' rather than as the node's PTDF, while DIFFERENCES between nodes are exact because the reference term cancels. Three further differences from a published matrix: they describe a NODE (a generator at that node inherits its location's value, and two units at one node are indistinguishable), they reflect the topology actually in effect across the window including outages rather than a stated base case, and every one carries a std_error from a 200-draw block bootstrap that resamples whole days. Read std_error before quoting shift_factor: an estimate whose absolute value is not at least twice its standard error is not distinguishable from zero. estimation_status says why a row has no number — 'thin_support' (in the fit, so it is controlled for, but under 12 binding intervals or under 3 distinct binding days), 'no_support' (under 3 binding intervals; not a regressor), or 'collinear' (it bound in lockstep with another constraint, so the two cannot be separated). Where from_station and to_station are populated they identify the monitored element and are NOT the constrained direction — the sign of shift_factor is what says which way. Every read must pin computed_at to one run, and must resolve that run through the companion atg.<iso>_constraint_sensitivity_runs ledger rather than off max(computed_at) here — rows are written in blocks that all carry the new timestamp, so an unfinished or abandoned run would otherwise look like the newest. Mixing runs averages a node across different network topologies.
Query contract
Analysis rules
Related analysis
Interpretation
Schema20
computed_atDateTime64(3, 'UTC')run_idStringconstraint_nameLowCardinality(String)contingency_nameLowCardinality(String)location_idLowCardinality(String)shift_factorNullable(Float64)std_errorNullable(Float64)estimation_statusLowCardinality(String)n_intervalsUInt32n_binding_intervalsUInt32n_binding_daysUInt16n_resamplesUInt16node_r2Nullable(Float64)node_residual_rms_usd_mwhNullable(Float64)window_startDateTime64(3, 'UTC')window_endDateTime64(3, 'UTC')from_stationLowCardinality(String)to_stationLowCardinality(String)shadow_feed_interval_coverageFloat32method_versionLowCardinality(String)Sample data
No preview available.
Coverage
No time-indexed data — coverage isn’t applicable to this dataset.