- A pergunta
- Fontes de dados
- Conversão de unidades: $/MMBtu para ct/kWh
- Deflação para dólares constantes
- Marcadores históricos
- Código: leitura e merge dos dados
- Código: gráfico
- Como reproduzir
- Limitações e ressalvas
- Pontos frágeis desta demonstração
1. A pergunta
Como o preço residencial real da eletricidade na Califórnia se comportou de 1990 até hoje, em paralelo com a entrada agressiva de solar e eólica na matriz? A Califórnia é o estado americano que mais cedo apostou em política climática estadual: AB 1890 abriu o mercado em 1996, AB 32 instituiu o cap-and-trade em 2006, SB 100 fixou meta de 100% de eletricidade limpa até 2045. Tem hoje a maior penetração solar utility-scale dos Estados Unidos — e a tarifa residencial média mais cara do país continental.
2. Fontes de dados
ESRCD — preço residencial de eletricidade ao consumidor, em dólares por milhão de BTU nominais, anual, todos os 50 estados, 1970-2023. eia.gov/state/seds/sep_prices/total/csv/pr_all.csv"Total Electric Power Industry" e "Solar Thermal and Photovoltaic". eia.gov/electricity/data/state/annual_generation_state.xlsOs arquivos consumidos pelo script estão em Energy/Costs/data/:
california_price_nominal_eia.csv— preço nominal já convertido para ct/kWh, formato (year, price_ct_per_kwh_nominal)usa_cpi_fred.csv— CPI americano da FREDcalifornia_generation_shares_eia.csv— shares de geração, formato (year, solar_pct, wind_pct)
A SEDS publica preço uniforme desde 1970, sem mudança de metodologia — diferente de Alemanha e Reino Unido, a Califórnia não precisa de bridge visual no gráfico. A linha é contínua de 1990 a 2023.
3. Conversão de unidades: $/MMBtu para ct/kWh
A SEDS reporta o preço residencial em dólares por milhão de BTU — unidade térmica, herança das séries históricas de combustíveis. Para o gráfico, converte-se para centavos por quilowatt-hora, unidade familiar à conta de luz do consumidor americano.
Essa conversão é determinística — não envolve estimativa nem perda de informação. O preço em ct/kWh é exatamente equivalente ao preço em $/MMBtu, só em outra unidade.
4. Deflação para dólares constantes
O preço da SEDS é nominal — em dólares do ano corrente. Para que a comparação ao longo do tempo signifique algo, é preciso remover a inflação:
A escolha de 2020 como ano-base é arbitrária — qualquer ano com CPI conhecido serviria, e todas as comparações relativas entre anos permanecem idênticas. O que muda com a escolha de base é apenas a magnitude absoluta do número no eixo Y.
5. Marcadores históricos
Quatro eventos ancoram a leitura política do gráfico.
| Ano | Marcador | O que foi |
|---|---|---|
| 1996 | AB 1890 | Assembly Bill 1890 — primeira lei de desregulamentação do mercado elétrico estadual nos EUA. Criou o ISO e o pool atacadista, separou geração de distribuição. |
| 2001 | Energy crisis | Combinação de seca, tetos de preço residenciais com atacado livre e manipulação de mercado por traders (Enron) — apagões rotativos, falência da PG&E, intervenção do Estado para comprar energia diretamente. |
| 2006 | AB 32 | Global Warming Solutions Act — instituiu meta de redução de emissões e o programa de cap-and-trade, que vincula o preço do CO2 ao preço residencial via custo das geradoras. |
| 2018 | SB 100 | The 100 Percent Clean Energy Act — fixou meta de 100% de eletricidade vendida ao varejo vinda de fontes elegíveis (RPS) e zero-emissão até 2045. |
6. Código: leitura e merge dos dados
Script completo em Energy/Costs/scripts/build_california_price.py. Trecho essencial:
from pathlib import Path
import pandas as pd
HERE = Path(__file__).parent
ROOT = HERE.parent
DATA = ROOT / "data"
BASE_YEAR = 2020
def load() -> pd.DataFrame:
price = pd.read_csv(DATA / "california_price_nominal_eia.csv")
cpi = pd.read_csv(DATA / "usa_cpi_fred.csv")
cpi["year"] = pd.to_datetime(cpi["observation_date"]).dt.year
cpi = cpi.rename(columns={"CPIAUCSL": "cpi"})[["year", "cpi"]]
shares = pd.read_csv(DATA / "california_generation_shares_eia.csv")
df = price.merge(cpi, on="year").merge(shares, on="year")
base_cpi = df.loc[df["year"] == BASE_YEAR, "cpi"].iloc[0]
df["price_ct_per_kwh_real"] = (
df["price_ct_per_kwh_nominal"] * base_cpi / df["cpi"]
)
return dfA linha base_cpi = df.loc[df["year"] == BASE_YEAR, "cpi"].iloc[0] seleciona o valor do CPI no ano-base e mantém todas as outras observações relativas a ele. A coluna final price_ct_per_kwh_real é o que vai para o eixo Y.
7. Código: gráfico
import matplotlib.pyplot as plt
PLOTS = ROOT / "plots"
STYLE = ROOT.parent.parent / "vintage.mplstyle"
def save_plot(df: pd.DataFrame) -> None:
plt.style.use(str(STYLE))
fig, ax1 = plt.subplots(figsize=(10, 6))
l_price, = ax1.plot(df["year"], df["price_ct_per_kwh_real"],
linestyle="-", linewidth=1.6, color="black",
marker="o", markersize=3.5,
label=f"Price (real, {BASE_YEAR} USD)")
ax1.set_ylabel(f"Residential price -- ct/kWh (real, {BASE_YEAR} USD)")
ax1.set_xlabel("Year")
ax1.set_ylim(15, 30)
ax2 = ax1.twinx()
l_solar, = ax2.plot(df["year"], df["solar_pct"],
linestyle="--", linewidth=1.2, color="black",
label="Solar share of generation")
l_wind, = ax2.plot(df["year"], df["wind_pct"],
linestyle=":", linewidth=1.4, color="black",
label="Wind share of generation")
ax2.set_ylabel("Share of electricity generation (%)")
ax2.set_ylim(bottom=0)
ax2.spines["right"].set_visible(True)
y_top = 29.5
y_mid = 23.0
markers = [
(1996, "AB 1890 (1996)", y_mid),
(2001, "Energy crisis (2001)", y_top),
(2006, "AB 32 (2006)", y_mid),
(2018, "SB 100 (2018)", y_top),
]
for year, label, y in markers:
ax1.axvline(year, color="black", linewidth=0.5,
linestyle="-", alpha=0.4)
ax1.text(year, y, f" {label}",
fontsize=8, va="top", ha="left", style="italic")
ax1.legend([l_price, l_solar, l_wind],
[l.get_label() for l in (l_price, l_solar, l_wind)],
loc="upper left", bbox_to_anchor=(0.0, 1.0),
frameon=False, fontsize=9)
ax1.set_title(
"California -- real residential electricity price vs renewable share",
loc="left", fontweight="bold"
)
fig.savefig(PLOTS / "california_price_vs_renewables.png",
dpi=300, bbox_inches="tight")
plt.close(fig)
8. Como reproduzir
# Pre-requisitos
pip install pandas matplotlib
# Estrutura esperada
Plotter/
+-- vintage.mplstyle
+-- Energy/
+-- Costs/
+-- scripts/
| +-- build_california_price.py
+-- data/
| +-- california_price_nominal_eia.csv
| +-- usa_cpi_fred.csv
| +-- california_generation_shares_eia.csv
+-- plots/
# Executar
cd Plotter/Energy/Costs
python scripts/build_california_price.py
# Saidas geradas:
# data/california_electricity_real_prices.csv (consolidado)
# plots/california_price_vs_renewables.png9. Limitações e ressalvas
- Apenas residencial. A SEDS publica também tarifa comercial e industrial. A residencial é a mais relevante para o impacto político (ela vai à fatura do eleitor), mas não captura o que pagam os grandes consumidores. Indústrias intensivas em energia migraram da Califórnia para outros estados nas últimas duas décadas — sinal indireto de que a tarifa industrial seguiu rota parecida com a residencial.
- EIA Form 923 ignora rooftop PV. O share solar mostrado no gráfico (~19% em 2023) é apenas a geração utility-scale registrada nas usinas. A geração distribuída em telhados residenciais e comerciais — fortíssima na Califórnia, com cerca de 1,8 milhão de sistemas instalados — não entra. Incluindo rooftop, a participação solar na geração total da Califórnia chega a ~25-28%.
- Cap-and-trade adiciona um custo de carbono ao preço. Desde 2013 o programa de AB 32 cobra das geradoras um preço por tonelada de CO2 emitida, que é repassado à tarifa. Em 2023 o preço do CCA-V (California Carbon Allowance) ficou em torno de 30-35 USD/tCO2; isso adiciona aproximadamente 1,5-2 ct/kWh ao custo de uma usina de gás. O gráfico inclui esse custo dentro do preço cheio — o leitor não consegue separá-lo das demais componentes da tarifa sem dados adicionais.
10. Pontos frágeis desta demonstração
Três pontos da metodologia merecem ser explicitados antes de tomar o gráfico como veredito.
10.1 Net energy metering (NEM) é um subsídio cruzado embutido na tarifa
A Califórnia opera, desde os anos 2000, um esquema de net energy metering em que residências com painéis solares no telhado recebem da concessionária crédito pelo excedente injetado na rede a preço de varejo — não a preço de atacado. Como o varejo (~25 ct/kWh) é várias vezes maior que o atacado (~5-7 ct/kWh), cada kWh injetado por um cliente NEM é, na prática, subsidiado pelos demais clientes. Estimativas da CPUC apontam que o subsídio cruzado embutido na NEM-2.0 atingiu ~3 ct/kWh para clientes não-NEM em 2022. Ou seja: parte do aumento da tarifa visível no gráfico é o custo socializado da decisão política de favorecer geração distribuída — não é mercado.
10.2 O eixo direito mede geração interna, não o que a Califórnia consome
A linha solar e a linha eólica mostram qual fração da eletricidade gerada dentro da Califórnia veio dessas fontes. Mas a Califórnia consome cerca de 30% mais eletricidade do que gera — a diferença vem de importações: hidrelétrica do Pacífico noroeste, gás do sudoeste americano, solar excedente do Arizona em horas de pico. O leitor que olha "19% solar em 2023" e conclui que "a Califórnia consome 19% de eletricidade solar" está errado: 19% é a fração da geração feita em solo californiano. A participação solar+eólica no consumo efetivo é diferente — provavelmente menor, porque grande parte das importações é firme (hidro do PNW, gás de Arizona-Nevada).