Tutorial 22 mar 2026 15 min de leitura

Como automatizar a análise fundamentalista de ações brasileiras com Python

Muitos devs brasileiros fazem web scraping do Fundamentus ou StatusInvest para obter dados fundamentalistas. O resultado é código frágil que quebra a cada mudança de layout. Neste tutorial, mostramos como automatizar a análise fundamentalista de verdade — com screening, comparações e histórico trimestral via API.

O problema do web scraping financeiro

Se você já tentou automatizar análise de ações brasileiras com Python, provavelmente começou assim: abriu o Fundamentus no navegador, inspecionou o HTML, escreveu um scraper com BeautifulSoup ou Selenium. Funcionou por uma semana. Depois o site mudou uma classe CSS e tudo parou.

Esse ciclo é comum porque não existe uma API pública oficial da B3 ou da CVM que entregue indicadores fundamentalistas prontos. As fontes primárias publicam dados brutos em formatos arcaicos — CSVs com encoding Latin-1, arquivos de largura fixa de 245 bytes por linha, contas financeiras que mudam de escala sem aviso.

A bolsai resolve isso: é uma API REST que agrega dados oficiais da B3, CVM e BCB e entrega indicadores fundamentalistas calculados, normalizados e prontos para consumo programático. Sem scraping, sem manutenção.

O que é análise fundamentalista

Análise fundamentalista é o estudo dos indicadores financeiros de uma empresa para avaliar se o preço da ação está justo em relação ao seu valor intrínseco. Os principais indicadores são:

Automatizar a consulta desses indicadores permite fazer screening (filtro) de centenas de ações em segundos, comparar empresas de um setor e acompanhar a evolução trimestral — tudo com código.

Configurando o ambiente

Você vai precisar de Python 3.8+ e do httpx como cliente HTTP. Crie uma conta gratuita em usebolsai.com/dashboard e copie sua API key.

pip install httpx

Configure a chave e a URL base que usaremos em todos os exemplos:

import httpx

API_KEY = "sua_chave_aqui"
BASE = "https://api.usebolsai.com/api/v1"
HEADERS = {"X-API-Key": API_KEY}

Exemplo 1: Consultar fundamentos de uma ação

O endpoint GET /api/v1/fundamentals/{ticker} retorna 27 indicadores calculados com TTM (Trailing Twelve Months) para qualquer ação da B3. Vamos consultar a Petrobras:

# Buscar fundamentos atuais da Petrobras
r = httpx.get(
    f"{BASE}/fundamentals/PETR4",
    headers=HEADERS
)
data = r.json()

print(f"Empresa:    {data['corporate_name']}")
print(f"P/L:        {data['pl']}")            # 5.32
print(f"P/VP:       {data['pvp']}")           # 1.42
print(f"EV/EBITDA:  {data['ev_ebitda']}")     # 3.27
print(f"ROE:        {data['roe']}%")          # 26.6%
print(f"Net Margin: {data['net_margin']}%")   # 22.23%
print(f"Mkt Cap:    R${data['market_cap']:,.0f}")

A resposta inclui preço atual, market cap, e indicadores de valuation, endividamento, eficiência e rentabilidade. O cálculo usa TTM automaticamente — se a empresa publicou ITR Q3 2025 e DFP 2024, a API combina os dois para gerar o valor dos últimos 12 meses.

Exemplo 2: Comparar múltiplas ações

Um caso de uso comum é comparar os fundamentos de várias empresas lado a lado. Basta iterar sobre uma lista de tickers e montar uma tabela:

tickers = ["PETR4", "VALE3", "ITUB4", "WEGE3", "ABEV3"]

print(f"{'Ticker':<8} {'P/L':>8} {'P/VP':>8} {'ROE':>8} {'EV/EBITDA':>10}")
print("-" * 44)

for ticker in tickers:
    r = httpx.get(
        f"{BASE}/fundamentals/{ticker}",
        headers=HEADERS
    )
    d = r.json()
    print(
        f"{ticker:<8}"
        f"{d['pl'] or 'N/A':>8}"
        f"{d['pvp'] or 'N/A':>8}"
        f"{str(d['roe']) + '%' if d['roe'] else 'N/A':>8}"
        f"{d['ev_ebitda'] or 'N/A':>10}"
    )

# Ticker      P/L     P/VP      ROE  EV/EBITDA
# --------------------------------------------
# PETR4      5.32     1.42   26.6%       3.27
# VALE3     27.31     1.75    6.41%      12.45
# ITUB4      9.99     2.13   21.32%       N/A
# WEGE3     28.46    10.39    39.5%      20.12
# ABEV3     14.13     3.85   18.82%       9.87

Com poucas linhas de código, você tem uma visão comparativa que demoraria minutos para montar manualmente em sites como Fundamentus. E como os dados vêm de uma API, você pode integrar essa lógica em qualquer pipeline, dashboard ou notebook.

Exemplo 3: Screening automático de ações

Screening é o processo de filtrar ações por critérios fundamentalistas. Digamos que você quer encontrar ações com:

Como a bolsai tem endpoint de dividendos separado, combinamos /fundamentals/{ticker} e /dividends/{ticker} para montar o screening completo:

# Lista de tickers para screening (blue chips + mid caps)
candidates = [
    "PETR4", "VALE3", "ITUB4", "BBDC4", "BBAS3",
    "WEGE3", "ABEV3", "RENT3", "SUZB3", "GGBR4",
    "CPLE6", "VIVT3", "CMIG4", "TAEE11", "BBSE3",
]

# Critérios de screening
MIN_DY = 6.0     # Dividend Yield > 6%
MAX_PL = 10.0    # P/L < 10
MIN_ROE = 15.0   # ROE > 15%

approved = []

for ticker in candidates:
    # Buscar fundamentos
    fund = httpx.get(
        f"{BASE}/fundamentals/{ticker}",
        headers=HEADERS
    ).json()

    # Buscar dividend yield
    div = httpx.get(
        f"{BASE}/dividends/{ticker}",
        headers=HEADERS
    ).json()

    pl = fund.get("pl")
    roe = fund.get("roe")
    dy = div.get("dividend_yield_ttm")

    # Aplicar filtros
    if pl and roe and dy:
        if dy > MIN_DY and pl < MAX_PL and roe > MIN_ROE:
            approved.append({
                "ticker": ticker,
                "pl": pl,
                "roe": roe,
                "dy": dy,
            })

print(f"\nAções aprovadas ({len(approved)}):")
print(f"{'Ticker':<8} {'P/L':>8} {'ROE':>8} {'DY':>8}")
print("-" * 34)
for a in approved:
    print(f"{a['ticker']:<8} {a['pl']:>8} {a['roe']:>7}% {a['dy']:>7}%")

# Ações aprovadas (4):
# Ticker      P/L      ROE       DY
# ----------------------------------
# PETR4      5.32   26.6%   14.23%
# BBAS3      4.87   18.9%    9.12%
# CMIG4      6.21   22.1%    8.45%
# TAEE11     8.34   27.3%   10.87%

Esse é o tipo de automação que levaria horas com web scraping e pode ser feita em 30 linhas de Python com a API. Você pode ajustar os critérios, expandir a lista de candidatos ou integrar com alertas por email/Telegram.

Exemplo 4: Histórico trimestral para análise de tendências

Indicadores pontuais podem enganar — uma empresa pode ter um trimestre excepcional que distorce o P/L. O endpoint GET /api/v1/fundamentals/{ticker}/history retorna os fundamentos trimestrais dos últimos 11 anos, cada um com TTM normalizado:

# Evolução do ROE e P/L da Petrobras nos últimos 3 anos
r = httpx.get(
    f"{BASE}/fundamentals/PETR4/history",
    params={"limit": 12},
    headers=HEADERS
)

history = r.json()["history"]

print(f"{'Período':<14} {'P/L':>8} {'ROE':>8} {'Net Margin':>12}")
print("-" * 44)

for item in history:
    print(
        f"{item['reference_date']:<14}"
        f"{item['pl'] or 'N/A':>8}"
        f"{str(item['roe']) + '%' if item['roe'] else 'N/A':>8}"
        f"{str(item['net_margin']) + '%' if item['net_margin'] else 'N/A':>12}"
    )

# Período          P/L      ROE   Net Margin
# --------------------------------------------
# 2025-12-31      5.32   26.6%       22.23%
# 2025-09-30      4.89   28.1%       23.41%
# 2025-06-30      5.01   27.3%       22.87%
# 2025-03-31      5.44   25.8%       21.95%
# ...

Com esses dados trimestrais, você pode construir gráficos de evolução, detectar tendências de deterioração ou melhoria nos fundamentos, e tomar decisões mais informadas do que olhando apenas o número atual.

Por que não fazer web scraping

A tabela abaixo resume as diferenças entre scraping de sites financeiros e usar uma API como a bolsai:

Web Scraping API bolsai
Velocidade 2-5s por ação (parsing HTML) ~100ms por ação (JSON)
Confiabilidade Quebra quando o site muda Contrato estável (versionado)
Manutenção Constante (seletores CSS mudam) Zero (API gerenciada)
Dados históricos Difícil de obter 11 anos de trimestres
Formato HTML (precisa parsear) JSON ou CSV
Rate limiting Risco de bloqueio 200 req/dia grátis, 10k/dia Pro

A principal vantagem é a confiabilidade: nomes de campos da API são permanentes e versionados. Seu código não vai quebrar porque alguém redesenhou um site.

Integração com IA

Além do uso direto via Python, a bolsai oferece um servidor MCP (Model Context Protocol) que permite que assistentes de IA como Claude e ChatGPT consultem dados financeiros brasileiros diretamente durante uma conversa.

Isso significa que você pode pedir ao Claude ou ChatGPT: "Compare o P/L e ROE de PETR4, VALE3 e ITUB4" — e ele vai buscar os dados na API automaticamente. Ideal para análises exploratórias ou para construir agentes de investimento que combinam dados quantitativos com raciocínio em linguagem natural.

Veja como configurar na página de integração com IA.

Próximos passos

Agora que você sabe como automatizar a análise fundamentalista, explore mais:

Comece agora

O plano gratuito dá 200 requisições por dia — o suficiente para testar todos os exemplos deste tutorial. O plano Pro (R$29/mês) libera 10.000 requisições, dados históricos completos e todos os endpoints.