SUMÁRIO
  1. A pergunta
  2. Fontes de dados
  3. Deflação para euros constantes
  4. A bridge pré-1998
  5. Marcadores históricos
  6. Código: leitura e merge dos dados
  7. Código: gráfico
  8. Como reproduzir
  9. Limitações e ressalvas
  10. 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

Preço (nominal, ct/kWh para residência de 3.500 kWh/ano, incluindo taxas/encargos/IVA): BDEW (Bundesverband der Energie- und Wasserwirtschaft) Strompreisanalyse, série de 1998 em diante. Compilada via de.wikipedia.org/wiki/Strompreis. Para 1990: Udo Leuschner (Energie-Chronik). Para 1991-1997: was-war-wann.de, com tarifas em DM arredondadas e metodologia que não é estritamente idêntica à da BDEW.
Deflator: FRED, série DEUCPIALLAINMEI (Consumer Price Index for Germany, all items, annual average, base 2015=100). fred.stlouisfed.org/series/DEUCPIALLAINMEI
Participação na geração: Our World in Data, "Share of electricity generation by source", filtrado para "Germany". Compilação de Ember + Energy Institute Statistical Review of World Energy. ourworldindata.org/grapher/share-electricity-solar e share-electricity-wind

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 FRED
  • owid_share_solar.csv e owid_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:

Preçoreal (2020 €)  =  Preçonominal (ano t)  ×  CPI2020  ÷  CPIt

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.

AnoMarcadorO que foi
1998EnWGEnergiewirtschaftsgesetz — fim do monopólio territorial; consumidores podem escolher fornecedor; redes ficam reguladas separadamente da venda.
2000EEGErneuerbare-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.
2011AtomausstiegApó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.
2022Gas crisisInvasã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 df

A 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)
Alemanha: preço real vs renováveis — resultado esperado
Resultado esperado. Após o vale logo depois de 1998 (efeito da liberalização), o preço cresce praticamente sem interrupção até 2024, em paralelo com a subida de solar (linha tracejada) e eólica (pontilhada) na geração. O salto de 2021-2022 é o choque do gás. A Alemanha, no eixo direito, alcança em 2024 cerca de 40% da eletricidade vinda de solar+eólica — e tem o preço residencial real mais alto da União Europeia.

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.png

9. 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.

Tem uma sugestão melhor? Se você consegue refinar essa metodologia — substituir o bridge pré-1998 por uma fonte primária mais sólida, decompor a tarifa em mercado vs encargos, ou propor outra forma de relacionar política e preço — escreva para statisticsreal1@gmail.com. Críticas técnicas são exatamente o que esta seção espera receber.