Como Automatizar o Valuation de Ações com Python: Calcule o Preço Teto e Encontre Oportunidades na Bolsa

Fernando Neves, Ph.D.

O mercado financeiro é fascinante, mas esconde armadilhas para quem investe guiado apenas pela intuição ou pelo otimismo irracional. Uma das frases mais célebres de Warren Buffett resume a essência do investimento inteligente: “Preço é o que você paga, valor é o que você leva”. Mas como saber se o preço que estamos pagando por uma ação hoje faz sentido matematicamente? É aqui que a mágica acontece quando unimos finanças e programação.

Neste guia completo, vamos mergulhar no universo do valuation de ações. Você entenderá por que analisar os fundamentos de um ticker é apenas o primeiro passo e por que calcular o Preço Teto (Preço Justo) é a verdadeira blindagem contra perdas. Mais do que teoria, vamos explorar como você pode usar o Python para raspar esses dados financeiros da web e alimentar uma planilha automatizada que lhe dirá, em tempo real, se uma ação está descontada (com margem de segurança positiva) ou cara demais (margem negativa).

Se você gosta de código e quer aplicar sua lógica para multiplicar patrimônio, este artigo é o seu mapa do tesouro.

1. A Armadilha de Pagar Caro: Por Que o Valuation é a Regra de Ouro?

Muitos investidores iniciantes cometem um erro clássico: encontram uma empresa incrível, com lucros crescentes, excelente gestão, margens líquidas gordas e dominância de mercado, e compram suas ações a qualquer preço. O raciocínio falho é: “Se a empresa é boa, a ação sempre vai subir”.

A realidade, no entanto, é implacável. Comprar uma empresa excelente por um preço exorbitante é um péssimo investimento. Quando o mercado precifica a perfeição, qualquer tropeço no balanço trimestral faz a cotação despencar. O valuation (avaliação de empresas) não é apenas um exercício acadêmico; é o seu escudo contra a euforia do mercado.

Analisar indicadores como P/L (Preço sobre Lucro), LPA (Lucro Por Ação), P/VP (Preço sobre Valor Patrimonial), Payout e Dividend Yield é crucial para entender a saúde passada e presente da empresa. No entanto, o mercado compra futuro. O objetivo do valuation é projetar os fluxos de caixa ou dividendos futuros e trazê-los a valor presente, definindo um limite máximo que você deve pagar.

2. O Conceito de Preço Teto e Margem de Segurança

O Preço Teto (ou Preço Justo) é o valor máximo que você aceita pagar por uma ação para garantir que o seu investimento traga a rentabilidade desejada no futuro. Ele atua como um limite de segurança emocional e matemático. Se a cotação passar desse teto, você simplesmente fecha o home broker e vai fazer outra coisa.

Associado ao Preço Teto, temos o conceito sagrado de Benjamin Graham: a Margem de Segurança. Trata-se da diferença percentual entre o Preço Teto calculado e a cotação atual no mercado.

A nossa lógica de decisão para a automação que construiremos mais à frente será estritamente binária e pragmática:

  • Margem Positiva (Sinal Verde): A cotação atual está abaixo do Preço Teto. A ação está descontada. Há um “colchão” de proteção para erros de cálculo ou imprevistos de mercado. Quanto maior essa porcentagem positiva, maior o desconto e mais atrativa a compra.
  • Margem Negativa (Sinal Vermelho): A cotação atual está acima do Preço Teto. A ação está sendo negociada com prêmio (está cara). Isso significa que, naquele momento, a relação risco-retorno não é favorável, e o ativo não deve ser comprado. A paciência deve reinar.

3. Os Métodos Mais Usuais de Valuation

Existem dezenas de formas de precificar um ativo. Para automatizar nossas decisões e focar em carteiras previdenciárias (focadas em renda passiva), destacam-se três métodos consagrados:

A. O Modelo de Crescimento de Gordon (Gordon Growth Model)

Pressupõe que o valor de uma empresa é a soma infinita de todos os dividendos futuros que ela pagará, trazidos a valor presente, assumindo que esses dividendos crescerão a uma taxa constante para sempre.

$$P = \frac{D_1}{k – g}$$

Onde P é o Preço Justo, D1 é o dividendo projetado, k é a sua Taxa de Desconto (retorno exigido) e g é a taxa de crescimento perpétuo. Excelente para bancos e transmissoras de energia.

B. A Fórmula de Décio Bazin

Décio Bazin estabeleceu uma regra de ouro simples e direta: uma ação só merece seu dinheiro se pagar, no mínimo, 6% de Dividend Yield ao ano.

$$\text{Preço Teto} = \frac{\text{Dividendo Médio (últimos 3 a 5 anos)}}{0,06}$$

Se a ação estiver custando menos que o resultado desta fórmula, a margem de segurança é altamente positiva.

C. A Fórmula de Benjamin Graham

O pai do Value Investing sugeriu que um investidor defensivo não deve pagar mais de 15 vezes o lucro (P/L) e 1,5 vezes o valor patrimonial (P/VP) (15 x 1,5 = 22,5).

$$V = \sqrt{22,5 \times \text{LPA} \times \text{VPA}}$$

Onde V é o Valor Intrínseco, LPA é o Lucro por Ação e VPA é o Valor Patrimonial da Ação. Ótimo para evitar empresas hipervalorizadas.

4. A Magia da Automação: Unindo Python e Planilhas

Calcular tudo isso manualmente para dezenas de tickers toda semana é um processo exaustivo. A solução perfeita é criar um pipeline de dados automatizado.

Para provar que isso não é apenas teoria, vamos colocar a mão na massa. Abaixo, compartilho um script Python de “Raspagem Resiliente”. Ao invés de depender de seletores CSS frágeis (que quebram quando o site muda de layout), este código age como um humano: ele lê a página, procura pelo nome do indicador e extrai o número associado a ele.

O Código Python (Auto-Scraper)

Python

import requests
from bs4 import BeautifulSoup
import pandas as pd
import os
import re

# 📂 Caminho onde a planilha será salva
CAMINHO_PASTA = r"C:\Users\SuaPastaDeInvestimentos"

def buscar_dados_acoes():
    # 📊 Lista de ativos para analisar
    tickets = ['BBAS3.SA', 'PETR4.SA', 'VALE3.SA', 'WEGE3.SA', 'ITUB4.SA']
    dados_compilados = []

    # Disfarce para não ser bloqueado pelos sites financeiros
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
    }

    print("Iniciando busca refinada...\n")

    for ticket in tickets:
        ticket_url = ticket.replace('.SA', '').lower()
        url = f"https://investidor10.com.br/acoes/{ticket_url}/"
        
        try:
            response = requests.get(url, headers=headers)
            
            if response.status_code == 200:
                soup = BeautifulSoup(response.content, 'html.parser')
                
                # A função inteligente que procura o indicador pelo nome
                def extrair_dado_preciso(nome_indicador):
                    celulas = soup.find_all('div', class_=re.compile(r'cell|card'))
                    
                    for celula in celulas:
                        texto_celula = celula.get_text(separator=" ", strip=True).lower()
                        
                        if nome_indicador.lower() in texto_celula:
                            partes = texto_celula.split(nome_indicador.lower())
                            if len(partes) > 1:
                                trecho_apos_nome = partes[1]
                                # Regex para capturar padrões numéricos financeiros (ex: 15,3% ou 4,15)
                                match = re.search(r'-?\d{1,3}(?:\.\d{3})*(?:,\d+)?%?', trecho_apos_nome)
                                if match:
                                    return match.group(0)
                    return "N/D"

                # Coletando os indicadores chave
                dy = extrair_dado_preciso("Dividend Yield")
                if dy == "N/D": dy = extrair_dado_preciso("DY")
                
                pl = extrair_dado_preciso("P/L")
                payout = extrair_dado_preciso("Payout")
                margem_liq = extrair_dado_preciso("Margem Líquida")
                lpa = extrair_dado_preciso("LPA")
                p_vp = extrair_dado_preciso("P/VP")

                dados_compilados.append({
                    'Ticket': ticket,
                    'Dividend Yield (12m)': dy,
                    'P/L': pl,
                    'Payout': payout,
                    'Margem Líquida': margem_liq,
                    'LPA': lpa,
                    'P/VP': p_vp
                })
                print(f"[{ticket}] Processado.")

        except Exception as e:
            print(f"Erro ao processar {ticket}: {e}")

    # Transformando em tabela e salvando em Excel
    if dados_compilados:
        df = pd.DataFrame(dados_compilados)
        if not os.path.exists(CAMINHO_PASTA):
            os.makedirs(CAMINHO_PASTA)
            
        caminho_completo = os.path.join(CAMINHO_PASTA, 'relatorio_acoes.xlsx')
        df.to_excel(caminho_completo, index=False, engine='openpyxl')
        print(f"\nArquivo salvo em: {caminho_completo}")

if __name__ == "__main__":
    buscar_dados_acoes()

Dissecando o Código: Como ele funciona?

Para os entusiastas da programação, o funcionamento deste robô pode ser dividido em quatro etapas lógicas:

  1. O Disfarce (Headers): Sites como o Investidor10 bloqueiam robôs. Ao enviar parâmetros no dicionário headers, o script simula o comportamento de um navegador comum (como o Chrome no Windows), garantindo o acesso aos dados.
  2. O Motor de Busca e Conexão: Através de um loop for, o código varre a lista de ativos, formata os nomes (tirando o “.SA”) e faz o download do código-fonte (HTML) bruto da página de cada empresa.
  3. O Cérebro da Operação (Raspagem Resiliente com Regex): Ao invés de usar coordenadas fixas, a função isola todos os blocos do site (as divs com classe cell). Quando encontra a palavra-chave (ex: “p/l”), ela divide o texto e usa uma Expressão Regular (Regex)r'-?\d{1,3}(?:\.\d{3})*(?:,\d+)?%?' — para ignorar qualquer letra ao redor e capturar única e exclusivamente o padrão numérico financeiro brasileiro (com vírgulas e porcentagens).
  4. A Exportação via Pandas: Os dados coletados na memória do Python são convertidos na hora em um DataFrame do Pandas (uma tabela bidimensional) e exportados diretamente para um arquivo .xlsx na sua máquina local, pronto para ser integrado.

5. O Motor de Cálculo no Excel e os Sinais de Compra

Uma vez que o seu script Python exporta o arquivo Excel, a sua planilha mestre de investimentos pode importar esses dados da planilha gerada pelo programa em Python e fazer a mágica acontecer.

A Margem de Segurança percentual na sua planilha pode ser calculada com uma fórmula simples:

$$\text{Margem} = \left( \frac{\text{Preço Teto}}{\text{Preço Atual}} \right) – 1$$

Para facilitar a visualização e evitar vieses cognitivos, recomenda-se aplicar Formatação Condicional nessa coluna:

  • Verde Intenso (Sinal de Compra): Quando o resultado for, por exemplo, > 15%. A ação está descontada. Há uma grande margem em relação ao teto calculado por Graham, Bazin ou Gordon.
  • Vermelho (Sinal de Alerta): Quando o resultado for < 0%. A ação rompeu o Preço Teto. O ativo está caro, incorporando expectativas altas demais. Comprar agora significa reduzir seu rendimento futuro. O aviso é claro: aguarde.

O Superpoder do Investidor Moderno

O mercado de ações recompensa a disciplina e a paciência. Ao criar um pipeline automatizado com scripts resilientes em Python e painéis de controle no Excel, você afasta o maior inimigo do seu patrimônio: o viés emocional.

O valuation não precisa ser um emaranhado de suposições complexas reservado aos analistas de Wall Street. Usando código, boas bases de dados e as fórmulas corretas, a verdadeira vantagem competitiva está na sua própria máquina. Defina as regras, escreva os scripts, respeite estritamente o seu Preço Teto, e deixe os juros compostos fazerem o resto.

Gostou de entender a arquitetura por trás da automação em finanças? Já tentou conectar algum script de Web Scraping às suas planilhas de investimento? Compartilhe suas experiências (ou dúvidas com o código) nos comentários abaixo!

Referências Bibliográficas

Veja Também

Macros no Excel: Aprenda coletar o P/VP e Dividend Yield de Fundos Imobiliarios usando Técnica de Scraping. – Corporate Academy