P/VP 2025: Como Usar Preço/Valor Patrimonial para Value Investing

Domine o P/VP para value investing! Aprenda calcular e interpretar Preço/Valor Patrimonial, identificar ações subvalorizadas e estratégias na B3. Guia completo ✓

Categoria:Análise Fundamentalista • Múltiplos de Valuation
18 min
Atualizado em:
Expertise: Value investing com 8+ anos de experiência no mercado brasileiro
Tags:
P/VPValue InvestingAnálise FundamentalistaB3ValuationMúltiplosSubvalorizadas

Neste artigo

P/VP 2025: Guia Completo Preço Valor Patrimonial Análise Ações B3

O P/VP (Price-to-Book) é o indicador fundamentalista essencial para identificar ações subvalorizadas. Aprenda como calcular, interpretar e usar este múltiplo para encontrar oportunidades de value investing na B3 em 2025.

Publicado em 19 de agosto, 2025

O que é o Indicador P/VP e Por Que é Fundamental?

O P/VP (Preço sobre Valor Patrimonial) é um múltiplo que compara o valor de mercado de uma ação com seu valor patrimonial contábil. Este indicador é crucial para identificar se uma empresa está sendo negociada com desconto ou prêmio em relação ao seu patrimônio líquido.

Em termos práticos: O P/VP mostra quantas vezes você está pagando pelo patrimônio líquido da empresa. É como comparar o preço de uma casa com seu valor de avaliação.

Fórmula do P/VP

P/VP = Preço da Ação ÷ Valor Patrimonial por Ação

Onde:

  • Preço da Ação: Cotação atual no mercado
  • Valor Patrimonial por Ação: Patrimônio Líquido ÷ Número de Ações

Significado dos Valores

P/VP < 1,0

  • Interpretação: Ação negociada abaixo do valor contábil
  • Possível oportunidade de value investing
  • Atenção: Pode indicar problemas fundamentais

P/VP = 1,0

  • Interpretação: Preço igual ao valor contábil
  • Avaliação neutra pelo mercado
  • Referência para comparações

P/VP > 1,0

  • Interpretação: Mercado avalia acima do valor contábil
  • Reconhecimento de ativos intangíveis
  • Pode indicar sobrevaloração

Como Calcular P/VP com brapi.dev

Implementação Prática

import requests
import json

def calcular_pvp_detalhado(ticker, token=''):
    """Calcula P/VP com análise detalhada"""
    
    url = f"https://brapi.dev/api/quote/{ticker}?modules=summaryProfile,defaultKeyStatistics,balanceSheetHistory&token={token}"
    
    try:
        response = requests.get(url)
        data = response.json()
        
        if not data['results']:
            return None
        
        resultado = data['results'][0]
        
        # Dados básicos
        preco_atual = resultado.get('regularMarketPrice', 0)
        acoes_em_circulacao = resultado.get('sharesOutstanding', 0)
        
        # Valor patrimonial do balanço
        balanco = resultado.get('balanceSheetHistory', {}).get('balanceSheetHistory', [])
        
        if not balanco:
            return None
        
        balanco_recente = balanco[0]
        patrimonio_liquido = balanco_recente.get('totalStockholdersEquity', 0)
        
        # Calcular VPA (Valor Patrimonial por Ação)
        vpa = patrimonio_liquido / acoes_em_circulacao if acoes_em_circulacao > 0 else 0
        
        # Calcular P/VP
        pvp = preco_atual / vpa if vpa > 0 else 0
        
        return {
            'ticker': ticker,
            'preco_atual': preco_atual,
            'patrimonio_liquido': patrimonio_liquido,
            'acoes_circulacao': acoes_em_circulacao,
            'vpa': vpa,
            'pvp': pvp,
            'interpretacao': interpretar_pvp(pvp),
            'valor_mercado': preco_atual * acoes_em_circulacao,
            'desconto_premio': ((pvp - 1) * 100)
        }
        
    except Exception as e:
        print(f"Erro ao calcular P/VP para {ticker}: {e}")
        return None

def interpretar_pvp(pvp):
    """Interpreta o valor do P/VP"""
    if pvp < 0.5:
        return {
            'classificacao': 'MUITO DESCONTADA',
            'descricao': 'Negociada a menos de 50% do valor contábil',
            'alerta': 'Investigar motivos - possível distress financeiro',
            'cor': 'azul'
        }
    elif pvp < 1.0:
        return {
            'classificacao': 'DESCONTADA',
            'descricao': 'Negociada abaixo do valor contábil',
            'alerta': 'Potencial oportunidade de value investing',
            'cor': 'verde'
        }
    elif pvp <= 1.5:
        return {
            'classificacao': 'FAIRLY VALUED',
            'descricao': 'Avaliação próxima do valor contábil',
            'alerta': 'Preço justo considerando ativos tangíveis',
            'cor': 'amarelo'
        }
    elif pvp <= 3.0:
        return {
            'classificacao': 'PREMIUM',
            'descricao': 'Prêmio por qualidade ou crescimento',
            'alerta': 'Mercado reconhece valor além dos ativos',
            'cor': 'laranja'
        }
    else:
        return {
            'classificacao': 'MUITO CARA',
            'descricao': 'Múltiplo elevado do valor contábil',
            'alerta': 'Possível sobrevalorização',
            'cor': 'vermelho'
        }

# Exemplo prático
analise_pvp = calcular_pvp_detalhado('ITUB4')

if analise_pvp:
    print("📊 ANÁLISE P/VP - ITUB4")
    print("=" * 50)
    print(f"Preço Atual: R$ {analise_pvp['preco_atual']:.2f}")
    print(f"VPA (Valor Patrimonial por Ação): R$ {analise_pvp['vpa']:.2f}")
    print(f"P/VP: {analise_pvp['pvp']:.2f}")
    print(f"Desconto/Prêmio: {analise_pvp['desconto_premio']:+.1f}%")
    
    interpretacao = analise_pvp['interpretacao']
    print(f"\n🎯 INTERPRETAÇÃO:")
    print(f"Classificação: {interpretacao['classificacao']}")
    print(f"Descrição: {interpretacao['descricao']}")
    print(f"Alerta: {interpretacao['alerta']}")
    
    print(f"\n💰 DADOS FINANCEIROS:")
    print(f"Patrimônio Líquido: R$ {analise_pvp['patrimonio_liquido']/1e9:.2f}B")
    print(f"Valor de Mercado: R$ {analise_pvp['valor_mercado']/1e9:.2f}B")

P/VP por Setor: Análise Comparativa

Características Setoriais

def analisar_pvp_setorial(setor_empresas, token=''):
    """Analisa P/VP por setor"""
    
    resultados_setor = []
    
    for ticker in setor_empresas:
        analise = calcular_pvp_detalhado(ticker, token)
        if analise:
            resultados_setor.append(analise)
    
    if not resultados_setor:
        return None
    
    # Calcular estatísticas do setor
    pvps = [r['pvp'] for r in resultados_setor if r['pvp'] > 0]
    
    estatisticas = {
        'pvp_medio': sum(pvps) / len(pvps),
        'pvp_mediano': sorted(pvps)[len(pvps)//2],
        'pvp_min': min(pvps),
        'pvp_max': max(pvps),
        'empresas_desconto': len([p for p in pvps if p < 1.0]),
        'empresas_premium': len([p for p in pvps if p > 1.5]),
        'total_empresas': len(pvps)
    }
    
    # Ranking por P/VP
    ranking = sorted(resultados_setor, key=lambda x: x['pvp'])
    
    return {
        'estatisticas': estatisticas,
        'ranking': ranking,
        'oportunidades': [r for r in ranking if r['pvp'] < 1.0 and r['pvp'] > 0]
    }

# Análise setorial - Bancos
bancos = ['ITUB4', 'BBDC4', 'BBAS3', 'SANB11', 'BPAC11']
analise_bancos = analisar_pvp_setorial(bancos)

if analise_bancos:
    stats = analise_bancos['estatisticas']
    
    print("🏦 ANÁLISE P/VP - SETOR BANCÁRIO")
    print("=" * 50)
    print(f"P/VP Médio do Setor: {stats['pvp_medio']:.2f}")
    print(f"P/VP Mediano: {stats['pvp_mediano']:.2f}")
    print(f"Faixa: {stats['pvp_min']:.2f} - {stats['pvp_max']:.2f}")
    print(f"Empresas com Desconto: {stats['empresas_desconto']}/{stats['total_empresas']}")
    
    print(f"\n🎯 RANKING P/VP (MENOR → MAIOR):")
    for i, empresa in enumerate(analise_bancos['ranking'][:5], 1):
        print(f"{i}. {empresa['ticker']}: {empresa['pvp']:.2f}")
    
    if analise_bancos['oportunidades']:
        print(f"\n💎 OPORTUNIDADES (P/VP < 1.0):")
        for opp in analise_bancos['oportunidades']:
            desconto = (1 - opp['pvp']) * 100
            print(f"• {opp['ticker']}: P/VP {opp['pvp']:.2f} ({desconto:.1f}% desconto)")

Screening Avançado por P/VP

Filtros Combinados

def screening_value_investing_pvp(universo_acoes, criterios, token=''):
    """Screening focado em P/VP para value investing"""
    
    candidatos = []
    
    for ticker in universo_acoes:
        try:
            # Análise P/VP
            analise_pvp = calcular_pvp_detalhado(ticker, token)
            if not analise_pvp:
                continue
            
            # Buscar dados complementares
            url = f"https://brapi.dev/api/quote/{ticker}?modules=defaultKeyStatistics,financialData&token={token}"
            response = requests.get(url)
            data = response.json()
            
            if not data['results']:
                continue
            
            resultado = data['results'][0]
            
            # Métricas complementares
            roe = resultado.get('returnOnEquity', 0)
            debt_equity = resultado.get('debtToEquity', 0)
            current_ratio = resultado.get('currentRatio', 0)
            pl = resultado.get('trailingPE', 0)
            
            # Aplicar filtros
            pvp = analise_pvp['pvp']
            
            # Critérios de value investing
            if (pvp > 0 and pvp <= criterios['pvp_max'] and
                roe >= criterios['roe_min'] and
                debt_equity <= criterios['debt_equity_max'] and
                current_ratio >= criterios['liquidez_min'] and
                pl > 0 and pl <= criterios['pl_max']):
                
                score_value = calcular_score_value(pvp, roe, debt_equity, current_ratio, pl)
                
                candidatos.append({
                    'ticker': ticker,
                    'pvp': pvp,
                    'roe': roe,
                    'debt_equity': debt_equity,
                    'current_ratio': current_ratio,
                    'pl': pl,
                    'score_value': score_value,
                    'desconto_vpa': (1 - pvp) * 100 if pvp < 1 else 0,
                    'interpretacao': analise_pvp['interpretacao']['classificacao']
                })
                
        except Exception as e:
            print(f"Erro ao analisar {ticker}: {e}")
            continue
    
    # Ordenar por score de value
    return sorted(candidatos, key=lambda x: x['score_value'], reverse=True)

def calcular_score_value(pvp, roe, debt_equity, current_ratio, pl):
    """Calcula score de value investing"""
    score = 0
    
    # Score P/VP (peso 30%)
    if pvp < 0.5:
        score += 30
    elif pvp < 0.8:
        score += 25
    elif pvp < 1.0:
        score += 20
    elif pvp < 1.2:
        score += 15
    else:
        score += 5
    
    # Score ROE (peso 25%)
    if roe >= 20:
        score += 25
    elif roe >= 15:
        score += 20
    elif roe >= 10:
        score += 15
    elif roe >= 5:
        score += 10
    
    # Score Endividamento (peso 20%)
    if debt_equity < 0.3:
        score += 20
    elif debt_equity < 0.5:
        score += 15
    elif debt_equity < 1.0:
        score += 10
    elif debt_equity < 1.5:
        score += 5
    
    # Score Liquidez (peso 15%)
    if current_ratio >= 2.0:
        score += 15
    elif current_ratio >= 1.5:
        score += 12
    elif current_ratio >= 1.2:
        score += 8
    elif current_ratio >= 1.0:
        score += 5
    
    # Score P/L (peso 10%)
    if pl < 10:
        score += 10
    elif pl < 15:
        score += 8
    elif pl < 20:
        score += 5
    
    return min(score, 100)  # Máximo 100

# Critérios para screening value
criterios_value = {
    'pvp_max': 1.2,
    'roe_min': 10,
    'debt_equity_max': 1.0,
    'liquidez_min': 1.0,
    'pl_max': 15
}

# Universo de ações para análise
universo_value = [
    'ITUB4', 'BBDC4', 'PETR4', 'VALE3', 'ABEV3', 'MGLU3', 'EGIE3', 'SBSP3',
    'BBSE3', 'TAEE11', 'CMIG4', 'ENBR3', 'CCRO3', 'EQTL3', 'CSAN3', 'USIM5'
]

candidatos_value = screening_value_investing_pvp(universo_value, criterios_value)

print("💎 SCREENING VALUE INVESTING - P/VP")
print("=" * 70)
print("Critérios aplicados:")
print(f"• P/VP ≤ {criterios_value['pvp_max']}")
print(f"• ROE ≥ {criterios_value['roe_min']}%")
print(f"• Debt/Equity ≤ {criterios_value['debt_equity_max']}")
print(f"• Liquidez Corrente ≥ {criterios_value['liquidez_min']}")
print(f"• P/L ≤ {criterios_value['pl_max']}")

print(f"\n📊 RESULTADOS ({len(candidatos_value)} empresas aprovadas):")
print("-" * 70)

for i, candidato in enumerate(candidatos_value[:10], 1):
    print(f"{i:2d}. {candidato['ticker']} - Score: {candidato['score_value']:.0f}/100")
    print(f"    P/VP: {candidato['pvp']:.2f} | ROE: {candidato['roe']:.1f}% | P/L: {candidato['pl']:.1f}")
    if candidato['desconto_vpa'] > 0:
        print(f"    💰 Desconto ao VPA: {candidato['desconto_vpa']:.1f}%")
    print(f"    📊 {candidato['interpretacao']}")
    print()

P/VP vs. Outros Indicadores

Análise Multivariada

def matriz_valor_pvp_combinada(ticker, token=''):
    """Análise combinada P/VP com outros indicadores"""
    
    # Buscar dados completos
    url = f"https://brapi.dev/api/quote/{ticker}?modules=defaultKeyStatistics,financialData,summaryDetail&token={token}"
    response = requests.get(url)
    data = response.json()
    
    if not data['results']:
        return None
    
    resultado = data['results'][0]
    
    # Calcular P/VP
    analise_pvp = calcular_pvp_detalhado(ticker, token)
    if not analise_pvp:
        return None
    
    # Outros múltiplos
    pl = resultado.get('trailingPE', 0)
    psr = resultado.get('priceToSalesTrailing12Months', 0)
    ev_ebitda = resultado.get('enterpriseToEbitda', 0)
    
    # Indicadores de qualidade
    roe = resultado.get('returnOnEquity', 0)
    roa = resultado.get('returnOnAssets', 0)
    margem_liquida = resultado.get('profitMargins', 0) * 100
    
    # Análise combinada
    matriz_analise = {
        'ticker': ticker,
        'multiplos': {
            'pvp': analise_pvp['pvp'],
            'pl': pl,
            'psr': psr,
            'ev_ebitda': ev_ebitda
        },
        'qualidade': {
            'roe': roe,
            'roa': roa,
            'margem_liquida': margem_liquida
        },
        'avaliacao_combinada': avaliar_combinacao_indicadores(
            analise_pvp['pvp'], pl, roe, margem_liquida
        )
    }
    
    return matriz_analise

def avaliar_combinacao_indicadores(pvp, pl, roe, margem_liquida):
    """Avalia empresa com base em combinação de indicadores"""
    
    # Classificação P/VP
    if pvp < 1.0:
        classe_pvp = "Descontada"
        score_pvp = 20
    elif pvp < 1.5:
        classe_pvp = "Justa"
        score_pvp = 15
    else:
        classe_pvp = "Premium"
        score_pvp = 10
    
    # Classificação P/L
    if pl < 10:
        classe_pl = "Barata"
        score_pl = 15
    elif pl < 15:
        classe_pl = "Moderada"
        score_pl = 12
    elif pl < 20:
        classe_pl = "Cara"
        score_pl = 8
    else:
        classe_pl = "Muito Cara"
        score_pl = 3
    
    # Classificação Qualidade
    if roe >= 15 and margem_liquida >= 10:
        classe_qualidade = "Alta Qualidade"
        score_qualidade = 25
    elif roe >= 10 and margem_liquida >= 5:
        classe_qualidade = "Boa Qualidade"
        score_qualidade = 20
    elif roe >= 5:
        classe_qualidade = "Qualidade Média"
        score_qualidade = 15
    else:
        classe_qualidade = "Baixa Qualidade"
        score_qualidade = 5
    
    score_total = score_pvp + score_pl + score_qualidade
    
    # Recomendação final
    if score_total >= 50:
        recomendacao = "COMPRA FORTE"
    elif score_total >= 40:
        recomendacao = "COMPRA"
    elif score_total >= 30:
        recomendacao = "NEUTRO"
    else:
        recomendacao = "EVITAR"
    
    return {
        'classes': {
            'pvp': classe_pvp,
            'pl': classe_pl,
            'qualidade': classe_qualidade
        },
        'scores': {
            'pvp': score_pvp,
            'pl': score_pl,
            'qualidade': score_qualidade,
            'total': score_total
        },
        'recomendacao': recomendacao,
        'justificativa': f"{classe_pvp} (P/VP) + {classe_pl} (P/L) + {classe_qualidade}"
    }

# Exemplo de análise multivariada
matriz_itub4 = matriz_valor_pvp_combinada('ITUB4')

if matriz_itub4:
    print("🔍 MATRIZ DE VALOR COMBINADA - ITUB4")
    print("=" * 60)
    
    multiplos = matriz_itub4['multiplos']
    print(f"📊 MÚLTIPLOS:")
    print(f"P/VP: {multiplos['pvp']:.2f}")
    print(f"P/L: {multiplos['pl']:.1f}")
    print(f"PSR: {multiplos['psr']:.2f}")
    
    qualidade = matriz_itub4['qualidade']
    print(f"\n⭐ INDICADORES DE QUALIDADE:")
    print(f"ROE: {qualidade['roe']:.1f}%")
    print(f"ROA: {qualidade['roa']:.1f}%")
    print(f"Margem Líquida: {qualidade['margem_liquida']:.1f}%")
    
    avaliacao = matriz_itub4['avaliacao_combinada']
    print(f"\n🎯 AVALIAÇÃO COMBINADA:")
    print(f"Score Total: {avaliacao['scores']['total']}/60")
    print(f"Recomendação: {avaliacao['recomendacao']}")
    print(f"Justificativa: {avaliacao['justificativa']}")

Limitações do P/VP

Quando Não Usar P/VP

1. Empresas de Tecnologia

  • Ativos intangíveis não aparecem no balanço
  • P/VP pode ser enganoso
  • Foco em múltiplos de receita

2. Empresas em Crescimento Acelerado

  • P/VP alto pode ser justificado
  • Crescimento futuro não refletido no patrimônio
  • Análise de potencial mais relevante

3. Empresas com Prejuízos Recorrentes

  • Patrimônio pode estar deteriorado
  • P/VP baixo por motivos fundamentais
  • Necessário análise de viabilidade

Ajustes e Melhorias

def pvp_ajustado_qualidade_ativos(ticker, token=''):
    """P/VP ajustado pela qualidade dos ativos"""
    
    analise_base = calcular_pvp_detalhado(ticker, token)
    if not analise_base:
        return None
    
    # Buscar detalhes do balanço
    url = f"https://brapi.dev/api/quote/{ticker}?modules=balanceSheetHistory&token={token}"
    response = requests.get(url)
    data = response.json()
    
    balanco = data['results'][0]['balanceSheetHistory']['balanceSheetHistory'][0]
    
    # Analisar composição dos ativos
    total_assets = balanco.get('totalAssets', 0)
    current_assets = balanco.get('totalCurrentAssets', 0)
    cash = balanco.get('cash', 0)
    inventory = balanco.get('inventory', 0)
    goodwill = balanco.get('goodWill', 0) or 0
    
    # Calcular qualidade dos ativos
    if total_assets > 0:
        liquidez_ativos = current_assets / total_assets
        participacao_cash = cash / total_assets
        participacao_goodwill = goodwill / total_assets
        participacao_estoque = inventory / total_assets if inventory else 0
    else:
        return analise_base
    
    # Score de qualidade (0-1)
    quality_score = (
        min(liquidez_ativos * 0.4, 0.4) +          # Max 40% para liquidez
        min(participacao_cash * 2, 0.3) +          # Max 30% para cash
        max(0, 0.2 - participacao_goodwill) +      # Penaliza goodwill alto
        max(0, 0.1 - participacao_estoque * 0.5)   # Penaliza estoque alto
    )
    
    # P/VP ajustado
    pvp_original = analise_base['pvp']
    pvp_ajustado = pvp_original / quality_score if quality_score > 0 else pvp_original
    
    return {
        **analise_base,
        'pvp_ajustado': pvp_ajustado,
        'quality_score': quality_score,
        'analise_ativos': {
            'liquidez_ativos': liquidez_ativos * 100,
            'participacao_cash': participacao_cash * 100,
            'participacao_goodwill': participacao_goodwill * 100,
            'participacao_estoque': participacao_estoque * 100
        },
        'ajuste_recomendado': quality_score < 0.7
    }

# Exemplo de P/VP ajustado
analise_ajustada = pvp_ajustado_qualidade_ativos('MGLU3')

if analise_ajustada:
    print("🔧 P/VP AJUSTADO POR QUALIDADE DOS ATIVOS")
    print("=" * 55)
    print(f"P/VP Original: {analise_ajustada['pvp']:.2f}")
    print(f"P/VP Ajustado: {analise_ajustada['pvp_ajustado']:.2f}")
    print(f"Score Qualidade: {analise_ajustada['quality_score']:.2f}")
    
    ativos = analise_ajustada['analise_ativos']
    print(f"\n📋 COMPOSIÇÃO DOS ATIVOS:")
    print(f"Liquidez dos Ativos: {ativos['liquidez_ativos']:.1f}%")
    print(f"Participação Cash: {ativos['participacao_cash']:.1f}%")
    print(f"Participação Goodwill: {ativos['participacao_goodwill']:.1f}%")
    print(f"Participação Estoque: {ativos['participacao_estoque']:.1f}%")
    
    if analise_ajustada['ajuste_recomendado']:
        print("\n⚠️ RECOMENDAÇÃO: Considerar P/VP ajustado devido à baixa qualidade dos ativos")

Casos Práticos de Análise

Exemplo 1: Banco (ITUB4)

Características:

  • Ativos tangíveis (empréstimos, imóveis)
  • P/VP tradicionalmente próximo a 1,0
  • ROE elevado justifica prêmio

Exemplo 2: Siderúrgica (USIM5)

Características:

  • Ativos físicos (plantas industriais)
  • P/VP volátil com ciclo econômico
  • Atenção para depreciação

Exemplo 3: Petrolífera (PETR4)

Características:

  • Reservas não totalmente contabilizadas
  • P/VP pode subestimar valor real
  • Considerar reservas provadas

Estratégias de Investimento com P/VP

1. Deep Value Investing

  • P/VP < 0,8
  • Empresas temporariamente desvalorizadas
  • Alto risco, alto retorno potencial

2. Quality Value

  • P/VP < 1,2
  • ROE > 15%
  • Empresas sólidas com desconto

3. Contrarian Investing

  • P/VP historicamente baixo
  • Setores fora de favor
  • Reversão à média

Conclusão

O P/VP é um indicador fundamental para identificar oportunidades de value investing, especialmente em empresas com ativos tangíveis significativos. Combine sempre com outros indicadores e análise qualitativa.

Pontos-Chave:

  1. P/VP < 1,0: Possível oportunidade, investigar motivos
  2. Análise setorial: Compare com pares do mesmo setor
  3. Qualidade dos ativos: Ajuste por composição patrimonial
  4. Combine indicadores: Use junto com ROE, P/L e margem líquida
  5. Contexto temporal: Considere ciclo econômico e setor

Próximos Passos:

Lembre-se: P/VP baixo pode indicar oportunidade ou problema. Sempre faça análise completa antes de investir!

Artigos Relacionados