- A pergunta
- Fontes de dados
- Deflação para euros constantes
- A bridge pré-1998
- 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 Alemanha se comportou desde a liberalização do mercado em 1998 e, em particular, depois da entrada em vigor da Erneuerbare-Energien-Gesetz (EEG) em 2000? A Alemanha é o caso emblemático da Energiewende: foi o primeiro país grande a adotar tarifa-prêmio para renováveis em escala industrial, é o que mais subsidiou solar fotovoltaica per capita no mundo, e foi também o que mais sentiu o choque do gás de 2022. Tudo isso entra contra a curva de quanto da geração elétrica veio de solar e eólica em cada ano.
2. Fontes de dados
Os arquivos consumidos pelo script estão em Energy/Costs/data/:
germany_price_nominal_bdew.csv— preço nominal, formato (year, price_ct_per_kwh_nominal)germany_cpi_fred.csv— CPI alemão da FREDowid_share_solar.csveowid_share_wind.csv— shares de geração para todos os países (filtrados para "Germany")
3. Deflação para euros constantes
O preço da BDEW é nominal — ou seja, em euros (e marcos antes de 2002) do ano corrente. Para que a comparação ao longo do tempo signifique algo, é preciso remover a inflação. A conta é a mesma usada para qualquer série temporal monetária:
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.
4. A bridge pré-1998
A série da BDEW só começa em 1998 — ano em que a Energiewirtschaftsgesetz (EnWG) liberalizou o mercado e dissolveu os monopólios regionais que dominavam o setor desde o pós-guerra. Antes disso, o preço residencial alemão era cobrado por concessionárias municipais ou regionais, em DM, com metodologias variadas e sem agregação nacional comparável.
No gráfico, os pontos de 1990 a 1997 vêm de duas fontes não-BDEW (Udo Leuschner para 1990; was-war-wann.de para 1991-1997) e aparecem em linha tracejada com marcadores ocos, sobre um fundo cinza-claro que demarca o período pré-liberalização. É um aviso visual: aquele segmento existe para dar contexto, mas não é estatisticamente comparável à série BDEW pós-1998.
5. Marcadores históricos
Quatro eventos ancoram a leitura política do gráfico.
| Ano | Marcador | O que foi |
|---|---|---|
| 1998 | EnWG | Energiewirtschaftsgesetz — fim do monopólio territorial; consumidores podem escolher fornecedor; redes ficam reguladas separadamente da venda. |
| 2000 | EEG | Erneuerbare-Energien-Gesetz — tarifa-prêmio (feed-in tariff) garantida por 20 anos para solar, eólica, biomassa. O custo é socializado via EEG-Umlage, encargo pago por todos os consumidores na conta de luz. |
| 2011 | Atomausstieg | Após Fukushima, Merkel anuncia o desligamento gradual de toda a frota nuclear alemã até 2022 — aproximadamente 22% da geração elétrica precisa ser substituída. |
| 2022 | Gas crisis | Invasão da Ucrânia + corte do gás russo; preço de atacado da eletricidade explode (Alemanha tinha gás como combustível-marginal para fechar o balanço). |
6. Código: leitura e merge dos dados
Script completo em Energy/Costs/scripts/build_germany_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 / "germany_price_nominal_bdew.csv")
cpi = pd.read_csv(DATA / "germany_cpi_fred.csv")
cpi["year"] = pd.to_datetime(cpi["observation_date"]).dt.year
cpi = cpi.rename(columns={"DEUCPIALLAINMEI": "cpi"})[["year", "cpi"]]
solar = pd.read_csv(DATA / "owid_share_solar.csv")
solar = solar[solar["Entity"] == "Germany"].rename(
columns={"Year": "year", "Solar": "solar_pct"}
)[["year", "solar_pct"]]
wind = pd.read_csv(DATA / "owid_share_wind.csv")
wind = wind[wind["Entity"] == "Germany"].rename(
columns={"Year": "year", "Wind": "wind_pct"}
)[["year", "wind_pct"]]
df = (price.merge(cpi, on="year")
.merge(solar, on="year")
.merge(wind, 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))
pre = df[df["year"] < 1998]
post = df[df["year"] >= 1998]
bridge = df[(df["year"] >= 1997) & (df["year"] <= 1998)]
# Pos-1998 (BDEW): linha solida, marcadores cheios
l_price, = ax1.plot(post["year"], post["price_ct_per_kwh_real"],
linestyle="-", linewidth=1.6, color="black",
marker="o", markersize=3.5,
label=f"Price (real, {BASE_YEAR} €)")
# Pre-1998 (Leuschner / was-war-wann): tracejado, marcadores ocos
ax1.plot(pre["year"], pre["price_ct_per_kwh_real"],
linestyle="--", linewidth=1.0, color="black",
marker="o", markersize=3.0, markerfacecolor="white")
# Bridge 1997-1998: tracejado conector
ax1.plot(bridge["year"], bridge["price_ct_per_kwh_real"],
linestyle="--", linewidth=1.0, color="black")
ax1.set_ylabel(f"Residential price -- ct/kWh (real, {BASE_YEAR} €)")
ax1.set_xlabel("Year")
ax1.set_ylim(15, 40)
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)
# Sombreamento do periodo pre-liberalizacao
ax1.axvspan(1990, 1998, color="black", alpha=0.04, zorder=0)
ax1.text(1994, 15.5,
"pre-liberalization (regional monopolies)",
fontsize=7.5, ha="center", va="bottom",
style="italic", alpha=0.7)
y_top = 39.5
y_mid = 31.0
markers = [
(1998, "EnWG (1998)", y_mid),
(2000, "EEG (2000)", y_top),
(2011, "Atomausstieg (2011)", y_top),
(2022, "Gas crisis (2022)", 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(
"Germany -- real residential electricity price vs renewable share",
loc="left", fontweight="bold"
)
fig.savefig(PLOTS / "germany_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_germany_price.py
+-- data/
| +-- germany_price_nominal_bdew.csv
| +-- germany_cpi_fred.csv
| +-- owid_share_solar.csv
| +-- owid_share_wind.csv
+-- plots/
# Executar
cd Plotter/Energy/Costs
python scripts/build_germany_price.py
# Saidas geradas:
# data/germany_electricity_real_prices.csv (consolidado)
# plots/germany_price_vs_renewables.png9. Limitações e ressalvas
- Apenas residencial. A série da BDEW é específica para residências de consumo médio (3.500 kWh/ano). A indústria alemã paga preços bem distintos — grandes consumidores energointensivos foram explicitamente isentos da EEG-Umlage por longos períodos para preservar competitividade. Comparar a tarifa industrial alemã com a residencial seria erro grave.
- Inclui taxas, encargos e IVA. O preço da BDEW é o que efetivamente sai da conta da residência — não é o preço de atacado, nem o "custo de fornecimento". Em 2020, mais de 50% da tarifa residencial alemã eram impostos e encargos governamentais (EEG-Umlage, KWKG, §19 StromNEV, Konzessionsabgabe, IVA). Mudanças regulatórias mexem mais no preço final do que mudanças no mercado de energia.
- Geração ≠ consumo. O eixo direito mostra share de geração interna alemã. A Alemanha exporta líquido em alguns anos e importa em outros via interconectores europeus; a participação solar+eólica do consumo doméstico real difere ligeiramente.
- EEG-Umlage abolida em 2022. Em julho de 2022, o governo Scholz aboliu a EEG-Umlage como linha visível na conta — passou a ser financiada por orçamento federal. A linha de preço caiu pouco porque, na mesma janela, o atacado explodiu por causa do gás. O efeito da abolição da Umlage, isolado, é da ordem de 3-4 ct/kWh — invisível no gráfico, mas presente.
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 A EEG-Umlage é, mecanicamente, o custo da transição renovável
A EEG-Umlage — encargo que financia a tarifa-prêmio paga aos geradores de renováveis — chegou a 6,5 ct/kWh em 2017, mais de 20% da conta residencial. O encargo existe por uma razão única: garantir, por 20 anos contratuais, um preço acima do mercado para painéis solares e turbinas eólicas. Não há Umlage sem EEG, e não há EEG sem decisão política de subsidiar renováveis em escala. Atribuir esse custo "à transição renovável" não é simplificação — é descrição literal do mecanismo legal.
Há, sim, um efeito de segunda ordem que vale registrar: a base sobre a qual a Umlage é cobrada exclui grandes consumidores industriais (isentos para preservar competitividade), de modo que a tarifa residencial absorve uma fatia desproporcional da conta. Ou seja, o valor unitário da Umlage cresceu mais rápido que o volume de renováveis subsidiadas — porque menos consumidores estavam dividindo a fatura. Mas o efeito de primeira ordem — a existência da Umlage — é integralmente atribuível à política renovável.
10.2 Reunificação distorce o ponto de partida
O ponto de 1990 representa apenas a Alemanha Ocidental (a Oriental tinha estrutura de preço completamente distinta, controlada pelo Estado). Os anos 1991-1997 são uma média Ocidental + Oriental em transição, com a Alemanha Oriental absorvendo investimento massivo na rede e na geração. Comparar o ponto de 1990 com o de 1995 ou 1998 mistura duas economias diferentes em integração — não é uma série temporal de uma única economia estável.