Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions reports/ny_hp_rates/_quarto.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ project:
- notebooks/gold_book_peaks.qmd
- notebooks/cost_of_service_by_subclass.qmd
- notebooks/investigate_household_savings.qmd
- notebooks/fair_default_feasible_line.qmd
- index.qmd
manuscript:
article: index.qmd
Expand Down
134 changes: 131 additions & 3 deletions reports/ny_hp_rates/index.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -1625,7 +1625,7 @@ The cost composition of each side is very different. The vast majority of genera

The delivery side is the opposite. As we saw above, the vast majority of transmission and distribution costs are {{< glossary "Embedded costs" display="embedded" >}} — the infrastructure is already built and has to be paid for regardless of what customers do. Only a small fraction of delivery costs are marginal: the next wave of capacity upgrades triggered by rising peak demand. A customer's delivery cost of service, and the delivery side of the bill that is supposed to collect it, is therefore dominated by their "fair share" of embedded costs, with marginal T&D costs adding a relatively small amount on top.

## Rates
## Rates {#sec-rates}

Bills _attempt_ to recover each customer's cost of service — but they rarely succeed accurately, because bills are calculated using {{< glossary "Rates" display="rates" >}}, and rates are imperfect proxies for costs.

Expand Down Expand Up @@ -1750,8 +1750,56 @@ But it is possible to design rates that are both {{< glossary "Fairness problem"

In fact, meeting the state's building electrification goals hinges on doing so: cost-based rates would lower heat pump bills by paying for _already built_ infrastructure more fairly, while cost-reflective rates could lower heat pump bills further by allowing customers to pre-cool and pre-heat their homes when electrons are cheap — while also reducing the amount of infrastructure the state will need to build as it electrifies, thereby limiting bill growth for all.

# Appendix 2: Eliminating cross-subsidy by updating default rates

# Appendix 2: Which households save when they switch to heat pumps? {#sec-savings}
The {< glossary "Cost-based rate" display="cost-based" >} rates we analyzed in this report eliminate the {< glossary "Cross-subsidy" display="cross-subsidy" >} by creating rates that would only be available to heat pump customers (designs 1 and 3), and electric heating customers as a whole (design 2).

But there is another approach: redesigning the default delivery rates that the vast majority of customers are already enrolled in.

In this approach, there are two levers to pull: making the volumetric rate seasonal, and increasing the fixed charge. We analyze both approaches below.

## Default delivery rates today
Four of New York's utilities offer default delivery rates with {< glossary "Flat volumetric rates" display="flat volumetric charges" >} — the same price per kWh in every hour and every season (@tbl-elec-default-tariffs-flat-app2).

::::: {.column-body-outset-right}
{{< embed notebooks/analysis.qmd#tbl-elec-default-tariffs-flat-app2 >}}
:::::

The three remaining utilities already use **seasonal default rates**: PSEG-LI offers a seasonal time-of-use rate as its default, and ConEd and O&R offer seasonal increasing-block rates with a 250 kWh/month threshold (@tbl-elec-default-tariffs-seasonal-app2).

::::: {.column-body-outset-right}
{{< embed notebooks/analysis.qmd#tbl-elec-default-tariffs-seasonal-app2 >}}
:::::

This appendix focuses only on the four utilities with flat default delivery rates.

## Seasonal volumetric rates

When customers adopt heat pumps, the vast majority of their new electricity use occurs during the winter. Lowering the volumetric delivery rate in winter would therefore lower the average delivery bill of heat pump customers, reduce their overpayment and therefore reduce the cross-subsidy.

However, every decrease in the default volumetric delivery rate in winter would require a corresponding increase in that rate during the summer, in order to avoid revenue shortfalls. @fig-rev-sufficient-rates shows the summer volumetric delivery rate would need to increase as the winter rate is lowered from the current flat rate, in order to keep each utility revenue-sufficient.

::::: {.column-page-inset-right}
{{< embed notebooks/fair_default_feasible_line.qmd#fig-rev-sufficient-rates >}}
:::::

As the winter delivery rate is lowered (and the summer rate is raised), to what extent would the cross-subsidy from heat pump to non-heat pump customers decrease? @fig-rev-sufficient-cross-subsidy has the answer.

::::: {.column-page-inset-right}
{{< embed notebooks/fair_default_feasible_line.qmd#fig-rev-sufficient-cross-subsidy >}}
:::::

Halving the volumetric delivery rates in winter would reduce the cross-subsidy by TK% to TK%, depending on the utility. Even making winter delivery rates $0/kWh (which would require making summer delivery rates between TK and TK, depending on the utility) would only reduce the cross-subsidy by TK% to TK%.

In other words: it is impossible to eliminate the cross-subsidy caused by default delivery rates by simply making them seasonal. The fixed charge must be increased as well.

## Increasing the fixed charge

In essence, utilities overcharge heat pump customers because they rely on volumetric rates to collect the vast majority of their delivery revenue. Volumetric rates assume that total electricity _usage_ drives infrastructure costs: that the more a household consumes, the more delivery costs they cause, and the more they should pay. As explained in @sec-rates, this assumption is false.

Fixed delivery charges charge all customers the same amount infrastructure costs, regardless of how much electricity they consume. Raising each utility's fixed change will therefore have the effect of decreasing heat pump customer overpayments and reducing the cross-subsidy.

# Appendix 3: Which households save when they switch to heat pumps? {#sec-savings}

Under default rates, `{python} pct(v.pct_natgas_save_default_lmi40)` of gas-heated households would save on their annual energy bills after switching to a heat pump. What distinguishes these households from the rest? Two building characteristics stand out: the efficiency of the existing furnace or boiler, and whether the home already has air conditioning.

Expand All @@ -1761,7 +1809,7 @@ Homes with less efficient fossil heating systems — older furnaces and boilers
{{< embed notebooks/investigate_household_savings.qmd#fig-natgas-afue-cooling-pct-save-heatmap >}}
:::

# Appendix 3: Findings by utility
# Appendix 4: Findings by utility


## Number of households
Expand Down Expand Up @@ -3195,6 +3243,86 @@ For our distribution marginal cost input, we use the **Sub-TX + Distribution** i
Sub-transmission lines and stations (69–115kV) deliver power to the distribution substations that serve customers —
their costs are local delivery costs, not NYISO bulk system costs, and load growth drives investment at both levels.

---

## How we derived the feasible fair-default seasonal rates {#sec-methods-fair-default-feasible}

The fair-default rate design (@sec-seasonal-rate) replaces the flat default delivery rate with a **monthly fixed charge** $F$ plus **two seasonal volumetric rates** — a winter rate $r_w$ and a summer rate $r_s$ — that apply to every residential customer, HP and non-HP alike. The rate has to do two things at once: collect the same total delivery revenue the utility collects today, _and_ leave HP customers paying their fair share. Those two requirements are the constraints below. They pin down a one-parameter family of solutions: for every choice of $F$, there is exactly one $(r_w, r_s)$ pair that satisfies both. The feasible-line plots trace that family.

### The two constraints

The inputs to the calculation are the per-group totals already produced by the BAT run (see @sec-methods-bat) and the monthly ResStock loads:

- $N_{\text{class}}$, $N_{\text{HP}}$ — weighted customer counts for the full residential class and the HP subclass.
- $B_{\text{class}}$, $B_{\text{HP}}$ — current annual delivery bills for each group under today's default rate.
- $Q^{w}_{\text{class}}$, $Q^{s}_{\text{class}}$, $Q^{w}_{\text{HP}}$, $Q^{s}_{\text{HP}}$ — total winter and summer kWh for each group, summed from `load_curve_monthly`.
- $\Delta_{\text{HP}}$ — the HP subclass cross-subsidy from the BAT (per-customer × $N_{\text{HP}}$).

**C1 — class revenue requirement.** Total delivery revenue collected from the residential class under the new rate equals the revenue collected today (this is the {{< glossary "revenue requirement" >}} the utility has to recover):

$$12 \cdot F \cdot N_{\text{class}} \;+\; r_w \cdot Q^{w}_{\text{class}} \;+\; r_s \cdot Q^{s}_{\text{class}} \;=\; B_{\text{class}}$$

**C2 — HP subclass fair revenue.** Total delivery revenue collected from the HP subclass equals their **fair bill** — what they would pay if their cross-subsidy were eliminated. The fair bill is the current bill minus the cross-subsidy:

$$12 \cdot F \cdot N_{\text{HP}} \;+\; r_w \cdot Q^{w}_{\text{HP}} \;+\; r_s \cdot Q^{s}_{\text{HP}} \;=\; B_{\text{HP}} - \Delta_{\text{HP}}$$

By construction, if C2 holds, the post-rate HP cross-subsidy is zero. C1 ensures the utility stays whole.

### Solving for the seasonal rates at each fixed charge

C1 and C2 are two linear equations in three unknowns $(F, r_w, r_s)$. Treat $F$ as the policy lever and the system becomes 2-by-2 in $(r_w, r_s)$. Subtracting fixed-charge revenue from each side moves the system into the volumetric variables, and solving by elimination gives a closed-form solution that is **affine in $F$**:[^script-fair-default-feasible]

$$r_w(F) = a_w + b_w \cdot F, \qquad r_s(F) = a_s + b_s \cdot F$$

The intercepts $a_w, a_s$ and slopes $b_w, b_s$ are pinned entirely by the eight inputs above. Each utility has its own coefficients because each utility has its own customer counts, bills, and seasonal kWh. The two seasonal lines for each utility — $r_w(F)$ in winter and $r_s(F)$ in summer — are what the feasible-line plots show (@fig-feasible-lines-delivery).

[^script-fair-default-feasible]: Closed-form derivation and feasibility computation in [`utils/mid/compute_fair_default_inputs.py`](https://github.com/switchbox-data/rate-design-platform/blob/1a57bfc481e915fdb8a615c49bcea0001861b364/utils/mid/compute_fair_default_inputs.py) (`fixed_charge_feasibility` and `_seasonal_rates_at_fixed_charge`).

:::{.column-page-inset-right}
{{< embed notebooks/fair_default_feasible_line.qmd#fig-feasible-lines-delivery >}}
:::

### What the feasibility range means

A solution to C1 and C2 exists for any $F$, but a _usable_ rate also requires both volumetric rates to be non-negative. Each constraint $r_w(F) \geq 0$ and $r_s(F) \geq 0$ is linear in $F$, so each carves out a half-line; their intersection is the **feasible fixed-charge range** $[F_{\min}, F_{\max}]$ — the green band in the plots. Inside this band, the utility is whole, the HP cross-subsidy is zero, and both rates are non-negative. Outside it, one rate would have to flip negative — winter at low $F$, summer at high $F$.

The lower bound $F_{\min}$ — the smallest fixed charge that makes the rate feasible — is the practically relevant one. It is what we call the **minimum feasible fixed charge** for that utility (@fig-feasible-fixed-charge-ranges-delivery).

:::{.column-page-inset-right}
{{< embed notebooks/fair_default_feasible_line.qmd#fig-feasible-fixed-charge-ranges-delivery >}}
:::

### Why the minimum feasible fixed charge has to be so high

HP customers consume disproportionately in winter, so eliminating their cross-subsidy pushes the winter rate down and the summer rate up. The lower we hold $F$, the more of the cross-subsidy correction has to come through the volumetric rates alone — and at some point the winter rate would have to go negative. Raising $F$ shifts revenue collection into the fixed channel, which falls equally on every customer regardless of when they consume. That widens the room for a non-negative winter rate. The minimum feasible $F$ is just the breakeven point where the winter rate is exactly zero — any lower and you would be paying customers to use electricity in winter.[^min-feasible-floor]

[^min-feasible-floor]: For most NY utilities, $F_{\min}$ is several times the current fixed charge — often `$30`–`$60` per month, against today's `$15`–`$25`. This is why the fair-default rate design pairs a sharply seasonal volumetric rate with a substantially higher fixed charge.

### Loosening C2: the revenue-sufficient sweep

The feasible line above keeps both constraints active and asks: _what rates eliminate the cross-subsidy?_ If we instead drop C2 and keep only C1, we get a much larger family of rates — every $(F, r_w, r_s)$ that simply keeps the utility whole. This is the **revenue-sufficient sweep**.

With only C1, fix any $F$ and any $r_w$, and the summer rate is uniquely pinned:

$$r_s(r_w, F) \;=\; \frac{B_{\text{class}} - 12 \cdot F \cdot N_{\text{class}} - r_w \cdot Q^{w}_{\text{class}}}{Q^{s}_{\text{class}}}$$

When $r_w = r_s$, this reduces to the **flat rate** at fixed charge $F$ — the rate the class would pay if there were no seasonal differentiation. Sweeping $r_w$ down from the flat rate, $r_s$ rises monotonically. Because C2 is no longer enforced, the HP subclass generally still cross-subsidizes — but by how much?

We measure that residual directly. At each $(F, r_w)$ pair, plug the C1-implied $r_s$ back into the HP bill formula and subtract the HP fair bill:

$$\Delta_{\text{HP}}^{\text{post}}(F, r_w) \;=\; \big[ 12 F N_{\text{HP}} + r_w Q^{w}_{\text{HP}} + r_s(r_w, F) \cdot Q^{s}_{\text{HP}} \big] - \big( B_{\text{HP}} - \Delta_{\text{HP}} \big)$$

Positive values mean HP customers are still overpaying; zero means we have landed on the feasible line. We sweep this for four representative fixed charges — the current charge, the minimum feasible charge, and two levels in between — and plot both the rate pairs (@fig-rev-sufficient-rates) and the residual HP cross-subsidy per customer (@fig-rev-sufficient-cross-subsidy).

:::{.column-page-inset-right}
{{< embed notebooks/fair_default_feasible_line.qmd#fig-rev-sufficient-rates >}}
:::

:::{.column-page-inset-right}
{{< embed notebooks/fair_default_feasible_line.qmd#fig-rev-sufficient-cross-subsidy >}}
:::

The takeaway: at the current fixed charge, no choice of seasonal rates eliminates the cross-subsidy — at most we can chip away at it. The cross-subsidy only goes to zero when $F$ reaches the minimum feasible charge _and_ the seasonal rates land exactly on the feasible line. That is the upper-left corner of the green band in the feasible-line plots.

# References

Expand Down
55 changes: 55 additions & 0 deletions reports/ny_hp_rates/notebooks/analysis.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -3132,6 +3132,61 @@ _default_gt = (
display_gt(_default_gt)
```

```{python}
#| label: app2-default-tariff-splits

_flat_rows_app2 = [
{
"Utility": r["Utility"],
"Fixed charge ($/mo)": r["Fixed charge ($/mo)"],
"Delivery (¢/kWh)": r["Delivery (¢/kWh)"],
}
for r in _default_rows
if r["Season"] == "Monthly"
]
_flat_default_df_app2 = pl.DataFrame(_flat_rows_app2)

_fixed_lookup_app2 = {
r["Utility"]: r["Fixed charge ($/mo)"]
for r in _default_rows
if r["Fixed charge ($/mo)"]
}
_seasonal_rows_app2 = [
{
"Utility": r["Utility"],
"Season": r["Season"],
"Fixed charge ($/mo)": _fixed_lookup_app2.get(r["Utility"], r["Fixed charge ($/mo)"]),
"Delivery (¢/kWh)": r["Delivery (¢/kWh)"],
}
for r in _default_rows
if r["Season"] != "Monthly"
]
_seasonal_default_df_app2 = pl.DataFrame(_seasonal_rows_app2)
```

```{python}
#| label: tbl-elec-default-tariffs-flat-app2
#| tbl-cap: "Default residential electric delivery tariffs for the four New York utilities with flat (non-seasonal) volumetric charges. Delivery includes the base rate-case delivery charge plus all volumetric surcharges topped up into the delivery revenue requirement. Where the volumetric rate varies by calendar month, the annual range is shown."

_flat_gt_app2 = (
GT(_flat_default_df_app2)
.tab_options(**get_switchbox_gt_tab_options())
)
display_gt(_flat_gt_app2)
```

```{python}
#| label: tbl-elec-default-tariffs-seasonal-app2
#| tbl-cap: "Default residential electric delivery tariffs for the three New York utilities with seasonal default rates. Delivery includes the base rate-case delivery charge plus all volumetric surcharges topped up into the delivery revenue requirement."

_seasonal_gt_app2 = (
GT(_seasonal_default_df_app2)
.tab_source_note("ConEd and O&R have increasing-block tiers with a 250 kWh/month threshold; '(first 250)' denotes the first-block rate. PSEG-LI has time-of-use rates; peak = weekday 3–7 PM, off-peak = all other hours and weekends.")
.tab_options(**get_switchbox_gt_tab_options())
)
display_gt(_seasonal_gt_app2)
```


## Default gas tariffs

Expand Down
Loading
Loading