Análise Fundamentalista de Ações: Indicadores Essenciais para Investir na B3
A análise fundamentalista é a base para investimentos consistentes no longo prazo. Aprenda como analisar empresas usando indicadores financeiros, múltiplos de valuation e dados qualitativos para tomar decisões de investimento mais assertivas no mercado brasileiro.
O que é Análise Fundamentalista?
A análise fundamentalista é um método de avaliação de investimentos que examina fatores econômicos, financeiros e qualitativos que podem afetar o valor intrínseco de uma empresa. Diferentemente da análise técnica, que foca em padrões de preços, a análise fundamentalista busca determinar o valor real de um negócio.
Pilares da Análise Fundamentalista
1. Análise Quantitativa
- Demonstrações financeiras
- Indicadores e múltiplos
- Métricas de rentabilidade
- Estrutura de capital
2. Análise Qualitativa
- Qualidade da gestão
- Vantagem competitiva
- Posição no mercado
- Governança corporativa
3. Análise Macroeconômica
- Cenário econômico
- Taxas de juros
- Inflação
- Políticas governamentais
Framework de Análise com brapi.dev
Estrutura Completa de Análise
import requests
import pandas as pd
from datetime import datetime, timedelta
class AnalisadorFundamentalista:
def __init__(self, token):
self.token = token
self.base_url = "https://brapi.dev/api"
def analise_completa(self, ticker):
"""Realiza análise fundamentalista completa de uma ação"""
# Obter dados da empresa
dados_empresa = self.obter_dados_empresa(ticker)
# Análise de múltiplos
multiplos = self.calcular_multiplos(ticker)
# Análise de rentabilidade
rentabilidade = self.analisar_rentabilidade(ticker)
# Análise de endividamento
endividamento = self.analisar_endividamento(ticker)
# Análise de crescimento
crescimento = self.analisar_crescimento(ticker)
# Score final
score_final = self.calcular_score_total(multiplos, rentabilidade, endividamento, crescimento)
return {
'ticker': ticker,
'dados_empresa': dados_empresa,
'multiplos': multiplos,
'rentabilidade': rentabilidade,
'endividamento': endividamento,
'crescimento': crescimento,
'score_final': score_final,
'recomendacao': self.gerar_recomendacao(score_final)
}
def obter_dados_empresa(self, ticker):
"""Obtém informações básicas da empresa"""
url = f"{self.base_url}/quote/{ticker}?modules=summaryProfile,defaultKeyStatistics&token={self.token}"
try:
response = requests.get(url)
data = response.json()
acao = data['results'][0]
profile = acao.get('summaryProfile', {})
stats = acao.get('defaultKeyStatistics', {})
return {
'nome': acao['longName'],
'setor': profile.get('sector', 'N/A'),
'industria': profile.get('industry', 'N/A'),
'funcionarios': profile.get('fullTimeEmployees', 0),
'market_cap': stats.get('marketCap', 0) / 1e9, # Em bilhões
'preco_atual': acao['regularMarketPrice'],
'variacao_52w': {
'minimo': acao.get('fiftyTwoWeekLow', 0),
'maximo': acao.get('fiftyTwoWeekHigh', 0)
}
}
except Exception as e:
print(f"Erro ao obter dados da empresa {ticker}: {e}")
return {}
def calcular_multiplos(self, ticker):
"""Calcula múltiplos de valuation"""
url = f"{self.base_url}/quote/{ticker}?modules=defaultKeyStatistics,financialData&token={self.token}"
try:
response = requests.get(url)
data = response.json()
acao = data['results'][0]
stats = acao.get('defaultKeyStatistics', {})
financials = acao.get('financialData', {})
multiplos = {
'pl': stats.get('forwardPE', 0),
'pvp': stats.get('priceToBook', 0),
'p_vendas': stats.get('priceToSalesTrailing12Months', 0),
'ev_ebitda': stats.get('enterpriseToEbitda', 0),
'ev_receita': stats.get('enterpriseToRevenue', 0),
'peg_ratio': stats.get('pegRatio', 0),
'dividend_yield': stats.get('dividendYield', 0) * 100
}
# Scores dos múltiplos (0-100)
scores = {
'score_pl': self.score_pl(multiplos['pl']),
'score_pvp': self.score_pvp(multiplos['pvp']),
'score_ev_ebitda': self.score_ev_ebitda(multiplos['ev_ebitda']),
'score_dy': self.score_dy(multiplos['dividend_yield'])
}
multiplos.update(scores)
multiplos['score_medio_multiplos'] = sum(scores.values()) / len(scores)
return multiplos
except Exception as e:
print(f"Erro ao calcular múltiplos para {ticker}: {e}")
return {}
def analisar_rentabilidade(self, ticker):
"""Analisa indicadores de rentabilidade"""
url = f"{self.base_url}/quote/{ticker}?modules=financialData&token={self.token}"
try:
response = requests.get(url)
data = response.json()
financials = data['results'][0].get('financialData', {})
rentabilidade = {
'roe': financials.get('returnOnEquity', 0) * 100,
'roa': financials.get('returnOnAssets', 0) * 100,
'roic': self.calcular_roic(ticker), # Calculado separadamente
'margem_bruta': financials.get('grossMargins', 0) * 100,
'margem_operacional': financials.get('operatingMargins', 0) * 100,
'margem_liquida': financials.get('profitMargins', 0) * 100
}
# Scores de rentabilidade
scores = {
'score_roe': self.score_roe(rentabilidade['roe']),
'score_roa': self.score_roa(rentabilidade['roa']),
'score_margem_liquida': self.score_margem_liquida(rentabilidade['margem_liquida'])
}
rentabilidade.update(scores)
rentabilidade['score_medio_rentabilidade'] = sum(scores.values()) / len(scores)
return rentabilidade
except Exception as e:
print(f"Erro ao analisar rentabilidade para {ticker}: {e}")
return {}
def analisar_endividamento(self, ticker):
"""Analisa estrutura de capital e endividamento"""
url = f"{self.base_url}/quote/{ticker}?modules=defaultKeyStatistics,financialData&token={self.token}"
try:
response = requests.get(url)
data = response.json()
stats = data['results'][0].get('defaultKeyStatistics', {})
financials = data['results'][0].get('financialData', {})
endividamento = {
'divida_patrimonio': financials.get('debtToEquity', 0),
'liquidez_corrente': financials.get('currentRatio', 0),
'liquidez_seca': financials.get('quickRatio', 0),
'cobertura_juros': stats.get('interestCoverage', 0),
'divida_ebitda': self.calcular_divida_ebitda(ticker)
}
# Scores de endividamento
scores = {
'score_liquidez': self.score_liquidez_corrente(endividamento['liquidez_corrente']),
'score_endividamento': self.score_endividamento(endividamento['divida_patrimonio'])
}
endividamento.update(scores)
endividamento['score_medio_endividamento'] = sum(scores.values()) / len(scores)
return endividamento
except Exception as e:
print(f"Erro ao analisar endividamento para {ticker}: {e}")
return {}
def analisar_crescimento(self, ticker):
"""Analisa indicadores de crescimento"""
# Esta função seria expandida com dados históricos
# Por ora, usar dados disponíveis na API
url = f"{self.base_url}/quote/{ticker}?modules=defaultKeyStatistics&token={self.token}"
try:
response = requests.get(url)
data = response.json()
stats = data['results'][0].get('defaultKeyStatistics', {})
crescimento = {
'crescimento_receita_ttm': stats.get('revenueGrowth', 0) * 100,
'crescimento_lucro_ttm': stats.get('earningsGrowth', 0) * 100,
'payout_ratio': stats.get('payoutRatio', 0) * 100,
'retencao_lucros': 100 - (stats.get('payoutRatio', 0) * 100),
'reinvestimento': self.calcular_taxa_reinvestimento(ticker)
}
# Score de crescimento
score_crescimento = self.score_crescimento(
crescimento['crescimento_receita_ttm'],
crescimento['crescimento_lucro_ttm']
)
crescimento['score_crescimento'] = score_crescimento
return crescimento
except Exception as e:
print(f"Erro ao analisar crescimento para {ticker}: {e}")
return {}
# Métodos auxiliares para scoring
def score_pl(self, pl):
"""Score P/L (0-100, maior score = melhor)"""
if pl <= 0: return 0
elif pl <= 8: return 100
elif pl <= 12: return 80
elif pl <= 18: return 60
elif pl <= 25: return 40
else: return 20
def score_pvp(self, pvp):
"""Score P/VP (0-100, maior score = melhor)"""
if pvp <= 0: return 0
elif pvp <= 1: return 100
elif pvp <= 1.5: return 80
elif pvp <= 2: return 60
elif pvp <= 3: return 40
else: return 20
def score_ev_ebitda(self, ev_ebitda):
"""Score EV/EBITDA (0-100, maior score = melhor)"""
if ev_ebitda <= 0: return 0
elif ev_ebitda <= 6: return 100
elif ev_ebitda <= 10: return 80
elif ev_ebitda <= 15: return 60
elif ev_ebitda <= 20: return 40
else: return 20
def score_dy(self, dy):
"""Score Dividend Yield (0-100, maior score = melhor)"""
if dy >= 8: return 100
elif dy >= 6: return 80
elif dy >= 4: return 60
elif dy >= 2: return 40
else: return 20
def score_roe(self, roe):
"""Score ROE (0-100, maior score = melhor)"""
if roe >= 25: return 100
elif roe >= 20: return 80
elif roe >= 15: return 60
elif roe >= 10: return 40
else: return 20
def score_roa(self, roa):
"""Score ROA (0-100, maior score = melhor)"""
if roa >= 15: return 100
elif roa >= 10: return 80
elif roa >= 7: return 60
elif roa >= 5: return 40
else: return 20
def score_margem_liquida(self, margem):
"""Score Margem Líquida (0-100, maior score = melhor)"""
if margem >= 20: return 100
elif margem >= 15: return 80
elif margem >= 10: return 60
elif margem >= 5: return 40
else: return 20
def score_liquidez_corrente(self, liquidez):
"""Score Liquidez Corrente (0-100, maior score = melhor)"""
if liquidez >= 2: return 100
elif liquidez >= 1.5: return 80
elif liquidez >= 1.2: return 60
elif liquidez >= 1: return 40
else: return 20
def score_endividamento(self, debt_equity):
"""Score Endividamento (0-100, maior score = melhor)"""
if debt_equity <= 0.3: return 100
elif debt_equity <= 0.5: return 80
elif debt_equity <= 0.8: return 60
elif debt_equity <= 1.2: return 40
else: return 20
def score_crescimento(self, crescimento_receita, crescimento_lucro):
"""Score Crescimento (0-100, maior score = melhor)"""
crescimento_medio = (crescimento_receita + crescimento_lucro) / 2
if crescimento_medio >= 20: return 100
elif crescimento_medio >= 15: return 80
elif crescimento_medio >= 10: return 60
elif crescimento_medio >= 5: return 40
else: return 20
def calcular_roic(self, ticker):
"""Calcula ROIC (simplificado)"""
# Implementação simplificada - na prática seria mais complexa
return 0 # Placeholder
def calcular_divida_ebitda(self, ticker):
"""Calcula Dívida/EBITDA"""
# Implementação simplificada
return 0 # Placeholder
def calcular_taxa_reinvestimento(self, ticker):
"""Calcula taxa de reinvestimento"""
# Implementação simplificada
return 0 # Placeholder
def calcular_score_total(self, multiplos, rentabilidade, endividamento, crescimento):
"""Calcula score total ponderado"""
scores = [
multiplos.get('score_medio_multiplos', 0),
rentabilidade.get('score_medio_rentabilidade', 0),
endividamento.get('score_medio_endividamento', 0),
crescimento.get('score_crescimento', 0)
]
# Pesos: Múltiplos 30%, Rentabilidade 35%, Endividamento 20%, Crescimento 15%
pesos = [0.30, 0.35, 0.20, 0.15]
score_total = sum(score * peso for score, peso in zip(scores, pesos))
return {
'score_total': score_total,
'scores_individuais': {
'multiplos': scores[0],
'rentabilidade': scores[1],
'endividamento': scores[2],
'crescimento': scores[3]
}
}
def gerar_recomendacao(self, score_final):
"""Gera recomendação baseada no score"""
score = score_final['score_total']
if score >= 80:
return {
'recomendacao': 'COMPRA FORTE',
'descricao': 'Empresa com excelentes fundamentos',
'cor': 'verde'
}
elif score >= 60:
return {
'recomendacao': 'COMPRA',
'descricao': 'Empresa com bons fundamentos',
'cor': 'verde-claro'
}
elif score >= 40:
return {
'recomendacao': 'NEUTRO',
'descricao': 'Empresa com fundamentos medianos',
'cor': 'amarelo'
}
elif score >= 20:
return {
'recomendacao': 'VENDA',
'descricao': 'Empresa com fundamentos fracos',
'cor': 'laranja'
}
else:
return {
'recomendacao': 'VENDA FORTE',
'descricao': 'Empresa com fundamentos ruins',
'cor': 'vermelho'
}
# Exemplo de uso do analisador
analisador = AnalisadorFundamentalista('SEU_TOKEN')
# Analisar uma empresa
analise_petr4 = analisador.analise_completa('PETR4')
print("📊 ANÁLISE FUNDAMENTALISTA - PETR4")
print("=" * 50)
print(f"Empresa: {analise_petr4['dados_empresa']['nome']}")
print(f"Setor: {analise_petr4['dados_empresa']['setor']}")
print(f"Market Cap: R$ {analise_petr4['dados_empresa']['market_cap']:.1f}B")
print(f"\n📈 MÚLTIPLOS:")
print(f"P/L: {analise_petr4['multiplos']['pl']:.1f}")
print(f"P/VP: {analise_petr4['multiplos']['pvp']:.2f}")
print(f"EV/EBITDA: {analise_petr4['multiplos']['ev_ebitda']:.1f}")
print(f"DY: {analise_petr4['multiplos']['dividend_yield']:.2f}%")
print(f"\n💰 RENTABILIDADE:")
print(f"ROE: {analise_petr4['rentabilidade']['roe']:.1f}%")
print(f"ROA: {analise_petr4['rentabilidade']['roa']:.1f}%")
print(f"Margem Líquida: {analise_petr4['rentabilidade']['margem_liquida']:.1f}%")
print(f"\n🎯 SCORE FINAL: {analise_petr4['score_final']['score_total']:.1f}/100")
print(f"Recomendação: {analise_petr4['recomendacao']['recomendacao']}")
print(f"Descrição: {analise_petr4['recomendacao']['descricao']}")
Análise de Demonstrações Financeiras
Demonstração de Resultados (DRE)
def analisar_dre(ticker, token):
"""Analisa Demonstração de Resultados"""
url = f"https://brapi.dev/api/quote/{ticker}?modules=incomeStatementHistory&token={token}"
try:
response = requests.get(url)
data = response.json()
income_statements = data['results'][0].get('incomeStatementHistory', {}).get('incomeStatementHistory', [])
if not income_statements:
return {}
# Analisar últimos 3 anos
analise_dre = []
for statement in income_statements[:3]:
ano = datetime.fromtimestamp(statement['endDate']).year
receita_liquida = statement.get('totalRevenue', 0)
custo_vendas = statement.get('costOfRevenue', 0)
lucro_bruto = statement.get('grossProfit', 0)
lucro_operacional = statement.get('operatingIncome', 0)
lucro_liquido = statement.get('netIncome', 0)
# Calcular margens
margem_bruta = (lucro_bruto / receita_liquida * 100) if receita_liquida > 0 else 0
margem_operacional = (lucro_operacional / receita_liquida * 100) if receita_liquida > 0 else 0
margem_liquida = (lucro_liquido / receita_liquida * 100) if receita_liquida > 0 else 0
analise_dre.append({
'ano': ano,
'receita_liquida': receita_liquida / 1e9, # Em bilhões
'lucro_bruto': lucro_bruto / 1e9,
'lucro_operacional': lucro_operacional / 1e9,
'lucro_liquido': lucro_liquido / 1e9,
'margem_bruta': margem_bruta,
'margem_operacional': margem_operacional,
'margem_liquida': margem_liquida
})
# Calcular tendências
if len(analise_dre) >= 2:
receita_crescimento = ((analise_dre[0]['receita_liquida'] - analise_dre[1]['receita_liquida']) /
analise_dre[1]['receita_liquida'] * 100)
lucro_crescimento = ((analise_dre[0]['lucro_liquido'] - analise_dre[1]['lucro_liquido']) /
analise_dre[1]['lucro_liquido'] * 100)
else:
receita_crescimento = 0
lucro_crescimento = 0
return {
'dados_anuais': analise_dre,
'tendencias': {
'crescimento_receita': receita_crescimento,
'crescimento_lucro': lucro_crescimento,
'evolucao_margem_liquida': analise_dre[0]['margem_liquida'] - analise_dre[1]['margem_liquida'] if len(analise_dre) >= 2 else 0
}
}
except Exception as e:
print(f"Erro ao analisar DRE de {ticker}: {e}")
return {}
# Exemplo de análise DRE
dre_analise = analisar_dre('WEGE3', 'SEU_TOKEN')
if dre_analise:
print("📋 ANÁLISE DRE - WEGE3")
print("=" * 40)
for ano_data in dre_analise['dados_anuais']:
print(f"\n📅 Ano {ano_data['ano']}:")
print(f" Receita: R$ {ano_data['receita_liquida']:.1f}B")
print(f" Lucro Líquido: R$ {ano_data['lucro_liquido']:.1f}B")
print(f" Margem Líquida: {ano_data['margem_liquida']:.1f}%")
print(f"\n📈 TENDÊNCIAS:")
print(f" Crescimento Receita: {dre_analise['tendencias']['crescimento_receita']:+.1f}%")
print(f" Crescimento Lucro: {dre_analise['tendencias']['crescimento_lucro']:+.1f}%")
print(f" Evolução Margem: {dre_analise['tendencias']['evolucao_margem_liquida']:+.1f} p.p.")
Balanço Patrimonial
def analisar_balanco(ticker, token):
"""Analisa Balanço Patrimonial"""
url = f"https://brapi.dev/api/quote/{ticker}?modules=balanceSheetHistory&token={token}"
try:
response = requests.get(url)
data = response.json()
balance_sheets = data['results'][0].get('balanceSheetHistory', {}).get('balanceSheetStatements', [])
if not balance_sheets:
return {}
# Analisar último balanço
balanco_atual = balance_sheets[0]
# Ativos
ativo_circulante = balanco_atual.get('totalCurrentAssets', 0)
ativo_total = balanco_atual.get('totalAssets', 0)
# Passivos
passivo_circulante = balanco_atual.get('totalCurrentLiabilities', 0)
divida_total = balanco_atual.get('totalLiab', 0)
patrimonio_liquido = balanco_atual.get('totalStockholderEquity', 0)
# Calcular indicadores
liquidez_corrente = ativo_circulante / passivo_circulante if passivo_circulante > 0 else 0
debt_to_equity = divida_total / patrimonio_liquido if patrimonio_liquido > 0 else 0
ativo_circulante_pct = (ativo_circulante / ativo_total * 100) if ativo_total > 0 else 0
return {
'ativo_total': ativo_total / 1e9, # Em bilhões
'ativo_circulante': ativo_circulante / 1e9,
'passivo_circulante': passivo_circulante / 1e9,
'patrimonio_liquido': patrimonio_liquido / 1e9,
'divida_total': divida_total / 1e9,
'indicadores': {
'liquidez_corrente': liquidez_corrente,
'debt_to_equity': debt_to_equity,
'ativo_circulante_pct': ativo_circulante_pct,
'composicao_ativo': 'Circulante' if ativo_circulante_pct > 50 else 'Permanente'
}
}
except Exception as e:
print(f"Erro ao analisar balanço de {ticker}: {e}")
return {}
# Exemplo de análise do balanço
balanco_analise = analisar_balanco('ITUB4', 'SEU_TOKEN')
if balanco_analise:
print("⚖️ ANÁLISE BALANÇO - ITUB4")
print("=" * 40)
print(f"Ativo Total: R$ {balanco_analise['ativo_total']:.1f}B")
print(f"Patrimônio Líquido: R$ {balanco_analise['patrimonio_liquido']:.1f}B")
print(f"Dívida Total: R$ {balanco_analise['divida_total']:.1f}B")
print(f"Liquidez Corrente: {balanco_analise['indicadores']['liquidez_corrente']:.2f}")
print(f"Debt/Equity: {balanco_analise['indicadores']['debt_to_equity']:.2f}")
Screening Fundamentalista Avançado
Sistema de Filtros Múltiplos
def screening_fundamentalista_avancado(universo_acoes, criterios, token):
"""Sistema avançado de screening fundamentalista"""
resultados = []
for ticker in universo_acoes:
try:
print(f"Analisando {ticker}...")
# Análise completa
analisador = AnalisadorFundamentalista(token)
analise = analisador.analise_completa(ticker)
if not analise:
continue
# Aplicar filtros
multiplos = analise['multiplos']
rentabilidade = analise['rentabilidade']
endividamento = analise['endividamento']
crescimento = analise['crescimento']
# Filtros de múltiplos
if (multiplos.get('pl', 0) > criterios['pl_max'] or
multiplos.get('pvp', 0) > criterios['pvp_max'] or
multiplos.get('ev_ebitda', 0) > criterios['ev_ebitda_max']):
continue
# Filtros de rentabilidade
if (rentabilidade.get('roe', 0) < criterios['roe_min'] or
rentabilidade.get('margem_liquida', 0) < criterios['margem_min']):
continue
# Filtros de endividamento
if (endividamento.get('liquidez_corrente', 0) < criterios['liquidez_min'] or
endividamento.get('divida_patrimonio', 0) > criterios['debt_equity_max']):
continue
# Filtros de crescimento
if crescimento.get('crescimento_receita_ttm', 0) < criterios['crescimento_min']:
continue
# Se passou em todos os filtros, incluir na lista
resultado = {
'ticker': ticker,
'nome': analise['dados_empresa']['nome'],
'setor': analise['dados_empresa']['setor'],
'score_total': analise['score_final']['score_total'],
'recomendacao': analise['recomendacao']['recomendacao'],
'metricas_chave': {
'pl': multiplos.get('pl', 0),
'pvp': multiplos.get('pvp', 0),
'roe': rentabilidade.get('roe', 0),
'dy': multiplos.get('dividend_yield', 0),
'margem_liquida': rentabilidade.get('margem_liquida', 0),
'crescimento_receita': crescimento.get('crescimento_receita_ttm', 0)
}
}
resultados.append(resultado)
except Exception as e:
print(f"Erro ao analisar {ticker}: {e}")
continue
# Ordenar por score total
return sorted(resultados, key=lambda x: x['score_total'], reverse=True)
# Critérios de screening
criterios_avancados = {
# Múltiplos
'pl_max': 20,
'pvp_max': 3,
'ev_ebitda_max': 15,
# Rentabilidade
'roe_min': 15,
'margem_min': 5,
# Endividamento
'liquidez_min': 1.2,
'debt_equity_max': 1.0,
# Crescimento
'crescimento_min': 0 # Pelo menos estável
}
# Universo de ações (top por liquidez)
universo_screening = [
'PETR4', 'VALE3', 'ITUB4', 'BBDC4', 'ABEV3', 'BBAS3', 'WEGE3', 'RENT3',
'EGIE3', 'MGLU3', 'LREN3', 'RAIL3', 'VIVT3', 'KLBN11', 'SBSP3', 'SUZB3',
'GGBR4', 'USIM5', 'BRFS3', 'JBSS3', 'EMBR3', 'GOAU4', 'CPLE6', 'TAEE11'
]
# Executar screening (demonstração com subset menor)
acoes_subset = universo_screening[:5] # Apenas 5 para demonstração
oportunidades = screening_fundamentalista_avancado(acoes_subset, criterios_avancados, 'SEU_TOKEN')
print("🎯 OPORTUNIDADES IDENTIFICADAS")
print("=" * 80)
for i, oportunidade in enumerate(oportunidades, 1):
print(f"{i}. {oportunidade['ticker']} - {oportunidade['nome']}")
print(f" Setor: {oportunidade['setor']}")
print(f" Score: {oportunidade['score_total']:.1f}/100 - {oportunidade['recomendacao']}")
print(f" P/L: {oportunidade['metricas_chave']['pl']:.1f} | ROE: {oportunidade['metricas_chave']['roe']:.1f}% | DY: {oportunidade['metricas_chave']['dy']:.1f}%")
print()
Análise Qualitativa
Framework de Avaliação Qualitativa
def avaliacacao_qualitativa(ticker):
"""Framework de avaliação qualitativa de empresas"""
# Esta análise seria baseada em pesquisa e dados qualitativos
# Aqui apresentamos um framework conceitual
criterios_qualitativos = {
'gestao': {
'peso': 25,
'fatores': [
'Histórico da gestão',
'Transparência nas comunicações',
'Estratégia clara',
'Governança corporativa'
],
'score': 0 # Seria preenchido com pesquisa
},
'vantagem_competitiva': {
'peso': 30,
'fatores': [
'Diferenciação do produto',
'Barreiras de entrada',
'Posição de mercado',
'Rede de distribuição'
],
'score': 0
},
'mercado': {
'peso': 20,
'fatores': [
'Tamanho do mercado',
'Taxa de crescimento',
'Competitividade',
'Regulamentação'
],
'score': 0
},
'financeiro': {
'peso': 15,
'fatores': [
'Qualidade dos lucros',
'Geração de caixa',
'Estrutura de capital',
'Política de dividendos'
],
'score': 0
},
'sustentabilidade': {
'peso': 10,
'fatores': [
'Práticas ESG',
'Sustentabilidade ambiental',
'Responsabilidade social',
'Compliance'
],
'score': 0
}
}
return criterios_qualitativos
def exemplos_analise_qualitativa():
"""Exemplos práticos de análise qualitativa"""
exemplos = {
'WEGE3': {
'gestao': {
'score': 90,
'comentarios': 'Gestão familiar profissionalizada, foco em inovação'
},
'vantagem_competitiva': {
'score': 85,
'comentarios': 'Líder em motores elétricos, marca forte, P&D'
},
'mercado': {
'score': 80,
'comentarios': 'Mercado de automação industrial em crescimento'
}
},
'VALE3': {
'gestao': {
'score': 70,
'comentarios': 'Governança melhorada pós-Brumadinho'
},
'vantagem_competitiva': {
'score': 95,
'comentarios': 'Baixo custo, reservas de qualidade'
},
'mercado': {
'score': 60,
'comentarios': 'Mercado cíclico, dependente da China'
}
}
}
return exemplos
# Exemplo de uso
exemplos_qual = exemplos_analise_qualitativa()
print("🔍 ANÁLISE QUALITATIVA - EXEMPLOS")
print("=" * 50)
for ticker, analise in exemplos_qual.items():
print(f"\n{ticker}:")
for criterio, dados in analise.items():
print(f" {criterio.title()}: {dados['score']}/100")
print(f" {dados['comentarios']}")
Relatório de Análise Completa
Gerador de Relatório Automático
def gerar_relatorio_completo(ticker, token):
"""Gera relatório completo de análise fundamentalista"""
# Realizar todas as análises
analisador = AnalisadorFundamentalista(token)
analise_principal = analisador.analise_completa(ticker)
dre_dados = analisar_dre(ticker, token)
balanco_dados = analisar_balanco(ticker, token)
# Estruturar relatório
relatorio = {
'ticker': ticker,
'data_analise': datetime.now().strftime('%d/%m/%Y'),
'resumo_executivo': gerar_resumo_executivo(analise_principal),
'dados_empresa': analise_principal['dados_empresa'],
'analise_quantitativa': {
'multiplos': analise_principal['multiplos'],
'rentabilidade': analise_principal['rentabilidade'],
'endividamento': analise_principal['endividamento'],
'crescimento': analise_principal['crescimento']
},
'demonstracoes': {
'dre': dre_dados,
'balanco': balanco_dados
},
'score_final': analise_principal['score_final'],
'recomendacao': analise_principal['recomendacao']
}
return relatorio
def gerar_resumo_executivo(analise):
"""Gera resumo executivo da análise"""
score = analise['score_final']['score_total']
pontos_fortes = []
pontos_fracos = []
# Múltiplos
if analise['multiplos'].get('score_medio_multiplos', 0) > 70:
pontos_fortes.append("Múltiplos de valuation atrativos")
elif analise['multiplos'].get('score_medio_multiplos', 0) < 40:
pontos_fracos.append("Múltiplos de valuation elevados")
# Rentabilidade
if analise['rentabilidade'].get('score_medio_rentabilidade', 0) > 70:
pontos_fortes.append("Alta rentabilidade e eficiência operacional")
elif analise['rentabilidade'].get('score_medio_rentabilidade', 0) < 40:
pontos_fracos.append("Rentabilidade abaixo da média")
# Endividamento
if analise['endividamento'].get('score_medio_endividamento', 0) > 70:
pontos_fortes.append("Estrutura de capital sólida")
elif analise['endividamento'].get('score_medio_endividamento', 0) < 40:
pontos_fracos.append("Endividamento elevado")
return {
'score_geral': score,
'classificacao': 'Excelente' if score >= 80 else 'Boa' if score >= 60 else 'Mediana' if score >= 40 else 'Fraca',
'pontos_fortes': pontos_fortes,
'pontos_fracos': pontos_fracos
}
def formatar_relatorio_html(relatorio):
"""Formata relatório em HTML"""
html = f"""
<!DOCTYPE html>
<html>
<head>
<title>Análise Fundamentalista - {relatorio['ticker']}</title>
<style>
body {{ font-family: Arial, sans-serif; margin: 20px; }}
.header {{ background: #2c3e50; color: white; padding: 20px; }}
.score {{ font-size: 2em; font-weight: bold; }}
.secao {{ margin: 20px 0; padding: 15px; border-left: 4px solid #3498db; }}
.positivo {{ color: #27ae60; }}
.negativo {{ color: #e74c3c; }}
table {{ width: 100%; border-collapse: collapse; }}
th, td {{ border: 1px solid #ddd; padding: 8px; text-align: left; }}
th {{ background-color: #f2f2f2; }}
</style>
</head>
<body>
<div class="header">
<h1>Análise Fundamentalista</h1>
<h2>{relatorio['ticker']} - {relatorio['dados_empresa']['nome']}</h2>
<p>Análise realizada em {relatorio['data_analise']}</p>
</div>
<div class="secao">
<h2>Resumo Executivo</h2>
<div class="score">Score Final: {relatorio['score_final']['score_total']:.1f}/100</div>
<p><strong>Classificação:</strong> {relatorio['resumo_executivo']['classificacao']}</p>
<p><strong>Recomendação:</strong> {relatorio['recomendacao']['recomendacao']}</p>
<h3>Pontos Fortes</h3>
<ul>
"""
for ponto in relatorio['resumo_executivo']['pontos_fortes']:
html += f"<li class='positivo'>{ponto}</li>"
html += """
</ul>
<h3>Pontos de Atenção</h3>
<ul>
"""
for ponto in relatorio['resumo_executivo']['pontos_fracos']:
html += f"<li class='negativo'>{ponto}</li>"
html += f"""
</ul>
</div>
<div class="secao">
<h2>Informações da Empresa</h2>
<table>
<tr><td><strong>Setor</strong></td><td>{relatorio['dados_empresa']['setor']}</td></tr>
<tr><td><strong>Indústria</strong></td><td>{relatorio['dados_empresa']['industria']}</td></tr>
<tr><td><strong>Market Cap</strong></td><td>R$ {relatorio['dados_empresa']['market_cap']:.1f}B</td></tr>
<tr><td><strong>Funcionários</strong></td><td>{relatorio['dados_empresa']['funcionarios']:,}</td></tr>
</table>
</div>
<div class="secao">
<h2>Múltiplos de Valuation</h2>
<table>
<tr><td><strong>P/L</strong></td><td>{relatorio['analise_quantitativa']['multiplos']['pl']:.1f}</td></tr>
<tr><td><strong>P/VP</strong></td><td>{relatorio['analise_quantitativa']['multiplos']['pvp']:.2f}</td></tr>
<tr><td><strong>EV/EBITDA</strong></td><td>{relatorio['analise_quantitativa']['multiplos']['ev_ebitda']:.1f}</td></tr>
<tr><td><strong>Dividend Yield</strong></td><td>{relatorio['analise_quantitativa']['multiplos']['dividend_yield']:.2f}%</td></tr>
</table>
</div>
<div class="secao">
<h2>Indicadores de Rentabilidade</h2>
<table>
<tr><td><strong>ROE</strong></td><td>{relatorio['analise_quantitativa']['rentabilidade']['roe']:.1f}%</td></tr>
<tr><td><strong>ROA</strong></td><td>{relatorio['analise_quantitativa']['rentabilidade']['roa']:.1f}%</td></tr>
<tr><td><strong>Margem Líquida</strong></td><td>{relatorio['analise_quantitativa']['rentabilidade']['margem_liquida']:.1f}%</td></tr>
<tr><td><strong>Margem Operacional</strong></td><td>{relatorio['analise_quantitativa']['rentabilidade']['margem_operacional']:.1f}%</td></tr>
</table>
</div>
</body>
</html>
"""
return html
# Exemplo de geração de relatório
relatorio_exemplo = gerar_relatorio_completo('WEGE3', 'SEU_TOKEN')
html_relatorio = formatar_relatorio_html(relatorio_exemplo)
# Salvar relatório
with open(f"relatorio_{relatorio_exemplo['ticker']}_{datetime.now().strftime('%Y%m%d')}.html", 'w', encoding='utf-8') as f:
f.write(html_relatorio)
print(f"✅ Relatório de {relatorio_exemplo['ticker']} gerado com sucesso!")
Conclusão
A análise fundamentalista é uma ferramenta poderosa para identificar empresas de qualidade e oportunidades de investimento no longo prazo. Através da combinação de análise quantitativa e qualitativa, é possível tomar decisões mais informadas e consistentes.
Pontos-Chave da Análise Fundamentalista:
- Visão Holística: Combine múltiplos, rentabilidade, endividamento e crescimento
- Contexto Setorial: Compare sempre com empresas do mesmo setor
- Análise Temporal: Observe tendências históricas, não apenas dados pontuais
- Fatores Qualitativos: Gestão e vantagem competitiva são fundamentais
- Disciplina: Mantenha critérios consistentes e objetivos
Próximos Passos:
- Explore nossa API completa para dados fundamentalistas detalhados
- Use nossa plataforma para análises interativas
- Implemente os frameworks apresentados neste guia
- Combine com análise setorial para maior precisão
Recursos Adicionais:
- Dados históricos para análise de tendências
- Módulos especializados para diferentes tipos de análise
- Exemplos práticos de implementação
Lembre-se: A análise fundamentalista requer tempo e dedicação. Não há atalhos para uma análise de qualidade, mas com as ferramentas certas e metodologia consistente, os resultados compensam o esforço investido!