API Selic, CDI, IPCA em Python: Dados Macroeconômicos Brasileiros
por bolsai · 18 de abril de 2026 · 9 min de leitura
Trabalhar com renda fixa, inflação e valuation no Brasil exige acesso estável a Selic, CDI e IPCA. O texto cobre as séries relevantes do Sistema Gerenciador de Séries Temporais do Banco Central, as armadilhas comuns de quem tenta consumi-las direto, os endpoints /macro da API da bolsai e três exemplos em Python que calculam juro real, comparam rentabilidade de CDB e alimentam a taxa livre de risco usada em modelos de desconto de fluxo de caixa.
Por que acessar Selic, CDI e IPCA programaticamente
A API Selic, CDI e IPCA da bolsai fornece séries macroeconômicas brasileiras normalizadas em JSON ou CSV, cobrindo Selic meta (série 432), IPCA mensal (série 433), CDI e Selic efetiva diárias. O plano gratuito libera 200 requisições por dia, permitindo calcular juro real, alimentar modelos de valuation com taxa livre de risco e comparar rentabilidade de CDBs sem depender de scraping do site do Banco Central.
Selic, CDI e IPCA formam o tripé de referência de qualquer análise financeira no Brasil. A Selic, definida pelo Comitê de Política Monetária (COPOM) em reuniões a cada 45 dias, baliza o custo do dinheiro na economia e funciona como taxa livre de risco em modelos de valuation. O CDI, média das taxas de empréstimo interbancário registradas pela B3, costuma oscilar 0,10 ponto percentual abaixo da Selic meta e é o benchmark padrão da renda fixa privada. O IPCA, medido mensalmente pelo IBGE, sintetiza a inflação oficial e é o denominador natural para converter retorno nominal em retorno real.
Em abril de 2026, a Selic meta está em 12,25% ao ano, o IPCA acumulado em 12 meses ronda 4,2% e o CDI anualizado fica próximo de 12,15%. Esses três números alimentam desde o cálculo de prêmio de um fundo DI até a taxa de desconto de um DCF em uma análise fundamentalista de múltiplos. Quem depende desses indicadores em produção precisa de uma fonte automatizável, versionada e com latência previsível.
As dores do acesso direto ao BCB SGS
O Sistema Gerenciador de Séries Temporais (SGS) do Banco Central do Brasil é a fonte primária oficial das séries macroeconômicas. O serviço existe desde a década de 1990 e acumulou peculiaridades que transformam a integração direta em um projeto de manutenção permanente.
- O endpoint público em www3.bcb.gov.br/sgspub aceita JSON, XML, CSV e HTML, mas a qualidade do JSON varia entre séries: datas vêm como string no formato
dd/MM/yyyy, valores chegam com vírgula decimal, e ocasionalmente surgem campos extras sem documentação. - Existe um limite informal de aproximadamente 10 anos por requisição. Consultas com
dataInicialmuito antigas retornam HTTP 500 sem mensagem de erro estruturada. - Não há paginação. Para recortes longos é necessário fatiar janelas manualmente e juntar as respostas.
- Em dias de feriado bancário e em janelas de manutenção noturna o serviço responde 503 ou devolve HTML estático. Cron jobs rodando à 0h costumam falhar silenciosamente.
- Certificado SSL e cadeia de intermediários já foram reemitidos sem aviso, quebrando clientes Python que usavam bundles de CA desatualizados.
- Séries são identificadas apenas pelo código numérico. Memorizar que Selic meta é 432, IPCA mensal é 433 e CDI anualizado é 4389 é fonte recorrente de erros.
Uma wrapper REST resolve esses pontos ao fatiar janelas longas internamente, normalizar formatos de data e valor, persistir os dados em banco próprio e garantir disponibilidade quando o SGS oscila. O desenho da API da bolsai segue esse princípio: uma única requisição HTTPS retorna a série pronta para alimentar um DataFrame do pandas.
Endpoints /macro/ da bolsai: Selic, CDI, IPCA
A API da bolsai expõe as séries macroeconômicas sob o prefixo /macro. O contrato é uniforme: cada rota aceita start, end, limit e format, e devolve um objeto contendo o nome e o código SGS correspondente, acompanhados da série ordenada por data. A tabela resume as séries publicadas.
| Endpoint bolsai | Série SGS | Descrição | Frequência |
|---|---|---|---|
/macro/selic_target |
432 | Selic meta definida pelo COPOM | Evento (a cada reunião) |
/macro/selic |
11 | Selic efetiva diária (taxa over) | Diária |
/macro/cdi |
12 | CDI diário (DI-Over) | Diária |
/macro/ipca |
433 | IPCA mensal (IBGE) | Mensal |
/macro/usd_brl |
1 | Dólar comercial (PTAX de venda) | Diária |
/macro/eur_brl |
21620 | Euro (PTAX de venda) | Diária |
Outras séries úteis para análise complementar, hoje acessíveis via SGS e em avaliação para inclusão nativa na API, incluem a série 4389 (CDI anualizado base 252), a série 4390 (Selic efetiva mensal), a série 4391 (CDI mensal) e a série 13522 (IPCA acumulado em 12 meses). A documentação viva em /docs acompanha a adição de cada série conforme o backlog evolui.
Buscando a Selic histórica em Python
O primeiro exemplo consome a série Selic efetiva diária para os últimos 12 meses. O código abaixo utiliza a biblioteca requests, recorta a janela temporal com os parâmetros start e end e carrega o resultado em um DataFrame do pandas pronto para análise. A fonte é a série 11 do BCB SGS, replicada integralmente pela bolsai.
import requests
import pandas as pd
from datetime import date, timedelta
API_KEY = "sk_sua_chave_aqui"
BASE = "https://api.usebolsai.com/api/v1"
HEADERS = {"X-API-Key": API_KEY}
# Últimos 12 meses da Selic efetiva diária (SGS 11)
end = date.today()
start = end - timedelta(days=365)
r = requests.get(
f"{BASE}/macro/selic",
params={"start": start.isoformat(), "end": end.isoformat(), "limit": 300},
headers=HEADERS,
timeout=15,
)
payload = r.json()
selic = pd.DataFrame(payload["data"])
selic["date"] = pd.to_datetime(selic["date"])
selic = selic.sort_values("date").set_index("date")
print(f"Série: {payload['series']} (SGS {payload['series_code']})")
print(f"Observações: {payload['count']}")
print(f"Último valor: {selic['value'].iloc[-1]:.4f}% a.d.")
print(f"Média 12m: {selic['value'].mean():.4f}% a.d.")
Saída representativa em abril de 2026:
Série: selic (SGS 11)
Observações: 252
Último valor: 0.0459% a.d.
Média 12m: 0.0471% a.d.
O valor diário pode ser convertido para taxa anualizada equivalente usando base 252 dias úteis: (1 + taxa_diaria) ** 252 − 1. O resultado em abril de 2026 converge para algo próximo de 12,15% ao ano, compatível com a Selic meta vigente de 12,25%. A pequena diferença entre efetiva e meta reflete o arredondamento do sistema de leilões do Banco Central.
O plano gratuito libera 200 requisições por dia para todos os endpoints, inclusive /macro. Suficiente para replicar os exemplos do post e iniciar um projeto de análise macro.
Comparando CDI e IPCA: calculando o juro real
O juro real é a taxa de juros descontada da inflação. A aproximação linear (CDI menos IPCA) funciona para exposição rápida, mas a fórmula correta obedece à equação de Fisher: r_real = (1 + r_nominal) / (1 + inflacao) − 1. O exemplo a seguir busca CDI e IPCA dos últimos 12 meses via API da bolsai, acumula cada um pelo produto dos fatores mensais e aplica Fisher.
import requests
import pandas as pd
from datetime import date, timedelta
API_KEY = "sk_sua_chave_aqui"
BASE = "https://api.usebolsai.com/api/v1"
HEADERS = {"X-API-Key": API_KEY}
def fetch_series(name, start, end):
r = requests.get(
f"{BASE}/macro/{name}",
params={"start": start, "end": end, "limit": 400},
headers=HEADERS,
timeout=15,
)
df = pd.DataFrame(r.json()["data"])
df["date"] = pd.to_datetime(df["date"])
return df.sort_values("date").set_index("date")["value"]
end = date.today().isoformat()
start = (date.today() - timedelta(days=400)).isoformat()
cdi_diario = fetch_series("cdi", start, end) / 100
ipca_mensal = fetch_series("ipca", start, end) / 100
# Acumula CDI em 12 meses via fator (1 + r)^252 equivalente
cdi_12m = (1 + cdi_diario).tail(252).prod() - 1
# Acumula IPCA em 12 meses multiplicando fatores mensais
ipca_12m = (1 + ipca_mensal).tail(12).prod() - 1
juro_real = (1 + cdi_12m) / (1 + ipca_12m) - 1
print(f"CDI 12m (nominal): {cdi_12m*100:.2f}%")
print(f"IPCA 12m: {ipca_12m*100:.2f}%")
print(f"Juro real (Fisher): {juro_real*100:.2f}%")
Saída típica em abril de 2026:
CDI 12m (nominal): 12.15%
IPCA 12m: 4.21%
Juro real (Fisher): 7.62%
O resultado indica que 100% do CDI equivale a aproximadamente 7,6% ao ano acima da inflação no cenário vigente. A aproximação linear (12,15 − 4,21 = 7,94%) superestima o juro real em mais de 0,3 ponto percentual, diferença relevante em carteiras grandes ou em horizontes longos. A equação de Fisher é o padrão adotado pelo IBGE e pela literatura de finanças clássica.
Exemplo prático: rentabilidade ajustada pela inflação
O terceiro exemplo aplica o juro real calculado acima para comparar dois CDBs hipotéticos emitidos em abril de 2026: um CDB de 105% do CDI e um CDB prefixado de 13,5% ao ano, ambos com prazo de um ano e sem incidência de IOF. O cálculo traduz cada rentabilidade nominal em rentabilidade real líquida, considerando alíquota de imposto de renda de 17,5% para resgate em 361 dias.
import requests
API_KEY = "sk_sua_chave_aqui"
BASE = "https://api.usebolsai.com/api/v1"
HEADERS = {"X-API-Key": API_KEY}
# IPCA 12m projetado e CDI 12m observado (reaproveitando o bloco anterior)
CDI_12M = 0.1215
IPCA_12M = 0.0421
IR = 0.175 # 17,5% para prazo entre 181 e 720 dias
def rentabilidade_real(nominal_bruta):
liquida = nominal_bruta * (1 - IR)
real = (1 + liquida) / (1 + IPCA_12M) - 1
return liquida, real
# CDB 105% do CDI
nominal_cdb_cdi = 1.05 * CDI_12M
liquida_cdi, real_cdi = rentabilidade_real(nominal_cdb_cdi)
# CDB prefixado 13,5% a.a.
nominal_cdb_pre = 0.135
liquida_pre, real_pre = rentabilidade_real(nominal_cdb_pre)
print(f"CDB 105% CDI | Nominal {nominal_cdb_cdi*100:.2f}% Líq {liquida_cdi*100:.2f}% Real {real_cdi*100:.2f}%")
print(f"CDB 13,5% pre | Nominal {nominal_cdb_pre*100:.2f}% Líq {liquida_pre*100:.2f}% Real {real_pre*100:.2f}%")
Saída esperada:
CDB 105% CDI | Nominal 12.76% Líq 10.53% Real 6.06%
CDB 13,5% pre | Nominal 13.50% Líq 11.14% Real 6.65%
A simulação mostra que, com IPCA em 4,21% e CDI em 12,15%, o CDB prefixado entrega juro real líquido de 6,65% ao ano contra 6,06% do CDB pós-fixado a 105% do CDI. A conclusão não é universal: se a Selic subir durante o período do investimento, o pós-fixado tende a recuperar ou superar o prefixado. A análise reforça a importância de rodar o cálculo com dados atualizados da API em vez de depender de planilhas estáticas. Para composição de carteira com renda variável de distribuidores de proventos, o post sobre Dividend Yield via API de ações brasileiras complementa a visão.
Integração com análise de ações (taxa livre de risco para valuation)
Em modelos de Discounted Cash Flow (DCF) e Dividend Discount Model (DDM), a taxa livre de risco aparece como componente da taxa de desconto, normalmente somada a um prêmio de risco de mercado e ao beta da ação. No Brasil, a convenção aceita é utilizar a Selic meta ou um proxy de juro pré longo (NTN-B 10 anos, título Tesouro IPCA+). Para cálculos tático-táticos e screeners, a Selic pura já entrega precisão suficiente.
A rotina típica começa com uma consulta simples a /macro/selic_target para obter o último valor em vigor, seguida de uma chamada a /fundamentals/{ticker} para recuperar métricas como LPA, VPA, ROE e crescimento. O valor da Selic alimenta a taxa de desconto; as métricas fundamentalistas alimentam o numerador do modelo. O tutorial sobre bolsai vs brapi na B3 detalha a cobertura comparativa, e a documentação da API descreve todos os endpoints relevantes.
Um modelo de Gordon simplificado para DDM, por exemplo, toma a forma P = D1 / (r − g), em que r é a taxa de desconto (Selic + prêmio de equity) e g é a taxa de crescimento esperada dos dividendos. Com a Selic em 12,25%, um prêmio de equity de 6 pontos e crescimento de 4% ao ano, o denominador fica em 14,25%, resultando em múltiplos consistentes com o observado em empresas brasileiras maduras de dividendos. Atualizar esse cálculo passa a ser uma chamada HTTPS, não uma leitura manual no site do BCB.
Boletim Focus (roadmap)
O Boletim Focus é a pesquisa semanal do Banco Central que consolida expectativas de mercado para Selic, IPCA, PIB, câmbio e demais variáveis macroeconômicas, baseadas em respostas de cerca de 140 instituições financeiras e consultorias. A publicação ocorre às segundas-feiras e influencia decisões do COPOM, de gestores de fundos e de tesourarias corporativas.
O acesso direto é feito via API Olinda do próprio BCB em olinda.bcb.gov.br, que usa OData e retorna projeções em janelas de curto, médio e longo prazo. A inclusão nativa das séries do Focus na API da bolsai está no roadmap sob o escopo de expansão do catálogo /macro/focus/*, com previsão de exposição da mediana, mínimo, máximo e desvio-padrão das expectativas agregadas. O status atualizado é mantido na referência da documentação.
Perguntas frequentes
Qual a Selic atual?
A Selic meta definida pelo COPOM na reunião de 18 e 19 de março de 2026 encerrou em 12,25% ao ano. O valor corresponde à série 432 do Sistema Gerenciador de Séries Temporais do Banco Central. Pela API da bolsai, o endpoint GET /macro/selic_target retorna o último valor em vigor e o histórico completo de cada alteração decidida pelo COPOM desde 1999.
Como calcular o juro real no Python?
O juro real aproximado é obtido subtraindo a inflação acumulada em 12 meses da taxa nominal de juros acumulada no mesmo intervalo. A fórmula precisa utiliza a equação de Fisher: r_real = (1 + r_nominal) / (1 + inflacao) − 1. O post traz um exemplo em Python que busca CDI e IPCA via API da bolsai, acumula os valores em 12 meses e aplica a equação de Fisher para retornar o juro real em termos anuais.
A API da bolsai cobra separado por endpoint?
Não. O plano gratuito libera 200 requisições por dia cobrindo todos os endpoints, incluindo /macro, /fundamentals, /stocks, /dividends, /fiis e /screener. O plano Pro a R$49 por mês amplia para 10 mil requisições diárias mantendo o mesmo catálogo. Não existe cobrança adicional por série macroeconômica ou por ticker consultado. Os tiers aparecem na página de preços.
Onde encontro a série histórica completa da Selic?
A fonte primária é o Sistema Gerenciador de Séries Temporais (SGS) do Banco Central, que publica a série 432 (Selic meta) e a série 11 (Selic efetiva diária). Pela API da bolsai, GET /macro/selic_target e GET /macro/selic retornam o histórico completo em JSON ou CSV, com os parâmetros start, end e limit para recorte temporal. O horizonte disponível cobre desde 1999 (Selic meta) e 1986 (Selic efetiva diária).
Próximos passos
Consumir Selic, CDI e IPCA diretamente do BCB SGS funciona para scripts de uso pontual, mas não se sustenta em produção por conta de formatos inconsistentes, limites de janela e janelas de indisponibilidade. A API Selic CDI IPCA da bolsai resolve o acoplamento com uma interface REST única, mesmo padrão de parâmetros, saída em JSON e CSV e suporte a CORS para uso em notebooks e frontends. Para dar o próximo passo, vale consultar a documentação completa e conferir os limites de cada tier.
Leia também
Este conteúdo é educativo e não constitui recomendação de investimento.