📖 Metodologias de Cálculo

Referência técnica dos cálculos e fontes de dados • Dados Financeiros Históricos
Legenda de Fontes:
Y Yahoo Finance — Raw (sem transformação)
D Damodaran
C Calculado pela aplicação

Índice

1. Fontes de Dados

FonteDados ObtidosAPI/MétodoTipo
ticker.income_stmt / quarterly_income_stmtDRE: Receita, EBIT, EBITDA, Lucro Líquido, etc.Anual: até 5 períodos; Trimestral: até 5 trimestresY Raw
ticker.cash_flow / quarterly_cash_flowFluxo de Caixa: FCF, Operacional, CapexAnual: até 5 períodos; Trimestral: até 5 trimestresY Raw
ticker.balance_sheet / quarterly_balance_sheetBalanço: Dívida, PL, Ações, Ativos, CaixaAnual: até 5 períodos; Trimestral: até 5 trimestresY Raw
ticker.get_info()Shares Outstanding (fallback), moedas, marketCap, enterpriseValue, TTM snapshotValor correnteY Raw + Sanity Check
ticker.history()Preços históricos de fechamento (diário, 10 anos)Série temporalY Raw
{MOEDA}USD=XTaxa de câmbio histórica para USD (diário, 10 anos)Série temporalY Raw
damodaran_globalMarket Cap histórico, EV, múltiplos (cross-validation)dez/2014–2023D

2. TTM do Yahoo Finance vs TTM Calculado

Esclarecimento importante: O Yahoo Finance fornece alguns campos TTM via ticker.get_info(), porém são apenas um snapshot do momento atual. Não servem para análise histórica.

2.1 Campos TTM disponíveis no get_info()

Campo YahooExemplo (AAPL, mar/2026)Usado na nossa base?
totalRevenue$435.6B (TTM corrente)❌ Não
ebitda$152.9B (TTM corrente)❌ Não
freeCashflow$106.3B (TTM corrente)❌ Não
trailingPE32.22❌ Não
trailingEps$7.89❌ Não
enterpriseToEbitda24.43❌ Não (cross-check pontual)
enterpriseToRevenue8.58❌ Não (cross-check pontual)

2.2 Por que não usamos o TTM do Yahoo?

O quarterly_income_stmt retorna valores do trimestre individual (não acumulados 12 meses):

PeríodoTotal Revenue (AAPL)Natureza
Q4/2025$124.3BApenas o trimestre
Q3/2025$85.8BApenas o trimestre
Q2/2025$94.9BApenas o trimestre
Q1/2025$124.0BApenas o trimestre

2.3 Comparação

AspectoYahoo get_info() TTMNosso TTM calculado
Cobertura temporalApenas 1 ponto (atual)Até 5 pontos trimestrais (histórico)
Série temporal?❌ Não✅ Sim
Análise de tendência?❌ Não✅ Sim (ex: EBITDA TTM caindo Q-a-Q)
Consistência c/ nosso EVNão garantida✅ Usa mesmo EV estimado do período
Fonte dos dadosCálculo interno do YahooSoma dos quarterly_income_stmt
Conclusão: O TTM histórico é inteiramente calculado pela aplicação (script calculate_ttm.py), somando os 4 trimestres mais recentes. O Yahoo não fornece TTM histórico via seus demonstrativos trimestrais.

3. Enterprise Value (EV) — Estimativa Histórica C

3.1 Fórmula do EV

EV = Market Cap + Dívida Total + Preferred Stock + Minority Interest − Caixa e Equivalentes
Quando Preferred Stock, Minority Interest ou Caixa não estão disponíveis, são tratados como zero.

3.2 Market Cap Estimado

Market Cap = (Pclose(t) ÷ Fator Subunidade) × Ordinary Shares Number(t)
ComponenteDescriçãoFonte
Pclose(t) Preço de fechamento diário mais próximo da data do período fiscal Y ticker.history(period="10y")
Fator Subunidade 100 para LSE (.L, .IL), TASE (.TA), JSE (.JO). Converte pence→GBP, agorot→ILS, cents→ZAR. Para demais exchanges = 1. C SUBUNIT_EXCHANGES
Ordinary Shares Number(t) Número de ações ordinárias. Fallback: sharesOutstanding via get_info() Y balance_sheet

3.3 Sanity Check — MCap Calculado vs Yahoo Finance

Novo (mar/2026): Para períodos recentes (ano fiscal ≥ ano_atual−1), o MCap calculado é validado contra o marketCap reportado pelo Yahoo Finance via get_info(). Se a divergência for > 5x, o valor do YF é usado como fallback. O campo mcap_quality registra o status:
mcap_qualityDescrição
okMCap calculado consistente (< 5x divergência do YF)
mcap_yf_fallbackMCap calculado divergia > 5x do YF — usado o valor do YF
mcap_yf_onlySem MCap calculado (sem preço/shares), usado apenas o YF
no_mcapNenhum MCap disponível
mcap_guard_revenueMCap/Receita > 50.000× e MCap > 1B — shares provavelmente inflados, MCap zerado

3.4 Remoção de Períodos sem Preço Histórico

Implementado em abr/2026. Períodos sem preço de mercado confiável são removidos da base. Sem preço, não é possível calcular Market Cap, EV nem múltiplos — manter esses registros distorceria análises agregadas.

Critério: Se a diferença entre a data fiscal e o preço mais próximo disponível no Yahoo Finance > 90 dias, o período é classificado como stale_price ou no_historical_price e removido da base.

Impacto (abr/2026): 15.044 registros removidos (5,6% da base), sendo:

Casos notáveis de migração de ticker (preço irrecuperável):

Ticker novoEmpresaTicker antigoStatus Yahoo
EMBJ3.SAEmbraerEMBR3.SADeletado do Yahoo Finance
NATU3.SANaturaNTCO3.SADeletado do Yahoo Finance
NBISNebius (ex-Yandex)YNDXDeletado (sanções/reestruturação)
TLNTalen EnergyBankruptcy 2020-2023
SAILSailPointPrivatizado 2022-2024

Caso resolvido: LTM (LATAM Airlines) — preços FY2022-2023 recuperados via ticker LTM.SN (Santiago, CLP) com conversão CLP→USD antes da remoção.

3.5 Problemas Conhecidos por Exchange

ExchangeProblemaCorreção Aplicada
.L / .IL (LSE)Preços em pence, não libras. MCap inflava ~100x (ex: CNA.L)Divisão por 100 automática via SUBUNIT_EXCHANGES
.TA (TASE, Israel)Preços em agorot + shares mismatch entre classes. MCap inflava ~3-4xDivisão por 100 + sanity check vs marketCap do YF
.JO (JSE, África do Sul)Preços em cents, não ZARDivisão por 100 automática
.JK (Indonésia)Moeda reportada como USD pelo YF, preço real em IDRSanity check detecta divergência ~14.000x, usa marketCap do YF
.SN (Chile)Moeda reportada como USD pelo YF, preço real em CLPSanity check detecta divergência ~850x, usa marketCap do YF
ADRs (CEPU, EDN)Preço é do ADR (USD), shares são da empresa local (ex: ARS)Detecção automática via ratio BS_shares/YF_shares > 3x. Usa shares_outstanding_current do YF

3.6 Componentes do EV

CampoOrigem yfinanceCampo no BDFonte
Dívida TotalTotal Debttotal_debtY
Caixa e EquivalentesCash And Cash Equivalentscash_and_equivalentsY
Preferred StockPreferred Stockpreferred_stockY
Minority InterestMinority Interestminority_interestY
Preço de Fechamentoticker.history()close_priceY
Ações OrdináriasOrdinary Shares Numberordinary_shares_numberY
Market Cap Estimadomarket_cap_estimatedC
Enterprise Value Estimadoenterprise_value_estimatedC
Qualidade MCapmcap_qualityC Audit trail

4. Demonstrações Financeiras — Income Statement Y

Todos os 14 campos abaixo são extraídos diretamente do Yahoo Finance sem nenhuma transformação.

CampoOrigem yfinanceCampo no BDFonte
Receita TotalTotal Revenuetotal_revenueY
Custo da ReceitaCost Of Revenuecost_of_revenueY
Lucro BrutoGross Profitgross_profitY
Receita OperacionalOperating Incomeoperating_incomeY
Despesas OperacionaisOperating Expenseoperating_expenseY
EBITEBITebitY
EBITDAEBITDAebitdaY
EBITDA NormalizadoNormalized EBITDAnormalized_ebitdaY
Lucro LíquidoNet Incomenet_incomeY
Despesas de JurosInterest Expenseinterest_expenseY
Provisão p/ IRTax Provisiontax_provisionY
P&DResearch And Developmentresearch_and_developmentY
SG&ASelling General And AdministrationsgaY
Média Diluída AçõesDiluted Average Sharesdiluted_average_sharesY
O Yahoo Finance calcula internamente EBIT e EBITDA a partir dos line items da DRE. Para nós, são Raw pois vêm prontos do income_stmt.

5. Fluxo de Caixa Y

CampoOrigem yfinanceCampo no BDFonte
Free Cash FlowFree Cash Flowfree_cash_flowY
Caixa OperacionalOperating Cash Flowoperating_cash_flowY
CapexCapital Expenditurecapital_expenditureY
O Free Cash Flow reportado pelo Yahoo Finance é: FCF = Operating Cash Flow + Capital Expenditure (Capex é negativo).

6. Balanço Patrimonial Y

CampoOrigem yfinanceCampo no BDFonte
Dívida TotalTotal Debttotal_debtY
Dívida Curto PrazoCurrent Debtshort_term_debtY
Dívida Longo PrazoLong Term Debtlong_term_debtY
Caixa e EquivalentesCash And Cash Equivalentscash_and_equivalentsY
Patrimônio LíquidoStockholders Equitystockholders_equityY
Ações OrdináriasOrdinary Shares Numberordinary_shares_numberY
Preferred StockPreferred Stockpreferred_stockY
Minority InterestMinority Interestminority_interestY
Ativos TotaisTotal Assetstotal_assetsY
Passivos TotaisTotal Liabilities Net MItotal_liabilitiesY
Investimentos CPOther Short Term Investmentsshort_term_investmentsY
Ativo CirculanteCurrent Assetscurrent_assetsY
Passivo CirculanteCurrent Liabilitiescurrent_liabilitiesY

7. Margens e Indicadores de Rentabilidade C

Todos os indicadores desta seção são calculados pela aplicação no fetch_historical_financials.py.

7.1 Margens sobre Receita

IndicadorFórmulaCampo no BDFonte
Margem EBITEBIT / Receita Totalebit_marginC
Margem EBITDAEBITDA / Receita Totalebitda_marginC
Margem BrutaLucro Bruto / Receita Totalgross_marginC
Margem LíquidaLucro Líquido / Receita Totalnet_marginC

7.2 Indicadores de Conversão de Caixa

IndicadorFórmulaCampo no BDInterpretaçãoFonte
FCF/ReceitaFCF / Receita Totalfcf_revenue_ratioQuanto da receita vira caixa livreC
FCF/EBITDAFCF / EBITDAfcf_ebitda_ratioEficiência de conversão do EBITDA em caixaC
Capex/Receita|Capex| / Receita Totalcapex_revenueIntensidade de capitalC

8. Alavancagem e Múltiplos de Avaliação C

8.1 Indicadores de Alavancagem

IndicadorFórmulaCampo no BDInterpretaçãoFonte
Dívida/PLDívida Total / Patrimônio Líquidodebt_equityAlavancagem financeiraC
Dívida/EBITDADívida Total / EBITDAdebt_ebitdaCapacidade de pagamento (em anos de EBITDA)C

8.2 Múltiplos de Avaliação

IndicadorFórmulaCampo no BDInterpretaçãoFonte
EV/ReceitaEV Estimado / Receita Total (ou TTM)ev_revenueMúltiplo de receitaC
EV/EBITDAEV Estimado / EBITDA (ou TTM)ev_ebitdaMúltiplo de EBITDA (principal para valuation)C
EV/EBITEV Estimado / EBIT (ou TTM)ev_ebitMúltiplo de EBITC
Para registros trimestrais: Os denominadores usam valores TTM (soma 4Q) quando ttm_quarters_count = 4. Os múltiplos usam o EV estimado do período (não o corrente), permitindo análise temporal.

Guardas: Múltiplos com |valor| > 500x são descartados. Revenue mínima de $100K USD. EBITDA mínimo de $100 USD.

9. TTM — Trailing Twelve Months C

Script: scripts/calculate_ttm.py

9.1 Regras por Tipo de Período

TipoCálculo TTMttm_quarters_count
AnnualTTM = próprio valor do período (já são 12 meses)4
QuarterlyTTM = soma dos 4 últimos trimestres (incluindo o corrente)0–4 (real)

9.2 Campos TTM

Campo TrimestralCampo TTMFórmulaFonte
total_revenuetotal_revenue_ttmΣ revenue dos 4QC
ebitdaebitda_ttmΣ ebitda dos 4QC
ebitebit_ttmΣ ebit dos 4QC
free_cash_flowfree_cash_flow_ttmΣ fcf dos 4QC
net_incomenet_income_ttmΣ net_income dos 4QC
ttm_quarters_countContagem de Q com dadosC

9.3 Lógica de Cálculo

  1. Para cada empresa, registros trimestrais ordenados por period_date
  2. Para cada trimestre i, janela [max(0, i-3) .. i] — até 4 registros
  3. Valores não-nulos somados; mínimo 2 trimestres para gerar TTM
  4. Se menos de 2 trimestres têm dados → TTM = NULL
  5. ttm_quarters_count = trimestres com total_revenue não-nulo na janela

9.4 Recálculo de Múltiplos

Os múltiplos EV dos registros trimestrais são recalculados com denominadores TTM:

EV/Revenue = EV Estimado / Revenue TTM   |   EV/EBITDA = EV Estimado / EBITDA TTM
Múltiplos só calculados quando ttm_quarters_count ≥ 4. TTM parcial (< 4Q) → múltiplos NULL.

9.5 Limitações do TTM

LimitaçãoImpacto
Yahoo fornece apenas ~5 trimestres recentesPrimeiro trimestre terá TTM parcial (1-2Q)
Ações chinesas/indianas com ~5 trimestresTTM parcial resulta em subestimação de ~50-75%
Trimestres fiscais ≠ calendárioFY em meses não-padrão (mar, jun) podem desalinhar
Divergência ~9% entre TTM e anual (mesmo com 4Q)Normal: diferenças de ajuste contábil Q vs annual

10. Conversão Cambial (FX) C

10.1 Metodologia

  1. Moeda financeira: ticker.get_info()["financialCurrency"] — moeda das demonstrações Y
  2. Moeda de negociação: ticker.get_info()["currency"] — moeda do preço da ação Y
  3. Série FX: {MOEDA}USD=X com period="10y" Y
  4. Para cada período fiscal, taxa mais próxima da data (método nearest)
  5. Série FX cacheada por moeda (thread-safe)
  6. Taxa gravada em fx_rate_to_usd

10.2 Duas Moedas Distintas

Quando financialCurrencycurrency (ex: PGAS.JK negocia em IDR, demonstrações em USD), o Market Cap é convertido automaticamente:

MCapfin = (Pclose ÷ SubunitFactor) × Shares × FXtrading→USD / FXfinancial→USD

O campo trading_currency é salvo separadamente no banco para auditoria.

10.3 Campos Convertidos

Campo Original (moeda local)Campo USDFonte
total_revenuetotal_revenue_usdC
ebitebit_usdC
ebitdaebitda_usdC
net_incomenet_income_usdC
free_cash_flowfree_cash_flow_usdC
enterprise_value_estimatedenterprise_value_usdC

10.4 Campos de Auditoria de Moeda

CampoDescriçãoExemplo
original_currencyMoeda das demonstrações financeiras (financialCurrency)BRL, USD, GBP
trading_currencyMoeda de negociação do preço (currency)IDR, CLP, GBp
fx_rate_to_usdTaxa de câmbio financialCurrency → USD0.17 (BRL→USD)
subunit_factorFator de divisão para exchanges com subunidade (100 para .L, .TA, .JO)100 ou NULL

11. Correções de Qualidade — Market Cap e EV C

Implementado em mar/2026 após auditoria de qualidade na base Utilities (736 empresas, 48 países). 5 padrões de erro identificados, afetando ~214 linhas (4,4% da base).

11.1 Correção 1 — Subunidade de Preço por Exchange

Várias bolsas cotam preços em subunidades da moeda (ex: pence em vez de libras). O código agora divide automaticamente:

SufixoExchangePaísSubunidadeFator
.LLondon Stock ExchangeUKpence → GBP÷100
.ILLSE InternationalUKpence → GBP÷100
.TATel Aviv Stock ExchangeIsraelagorot → ILS÷100
.JOJohannesburg Stock ExchangeÁfrica do Sulcents → ZAR÷100

Exemplo: CNA.L preço = 130 (pence). Antes: MCap = 130 × 5.5B = 715B GBP (errado). Agora: MCap = 1.30 × 5.5B = 7.15B GBP (correto).

Mapeamento de Moedas Subunitárias (SUBUNIT_CURRENCY_MAP)

O Yahoo Finance reporta currency em códigos de subunidade (GBp, ILA, ZAc) que diferem de financialCurrency (GBP, ILS, ZAR). Sem mapeamento, o código tentaria converter entre moedas que são na verdade a mesma (ex: ILA→ILS via câmbio, que não existe). O mapeamento resolve a moeda subunitária para a principal antes de comparar com financialCurrency:

Moeda SubunitáriaMoeda PrincipalRelação
GBpGBP1 GBP = 100 pence
ILAILS1 ILS = 100 agorot
ZAcZAR1 ZAR = 100 cents

11.2 Correção 2 — Detecção Automática de ADRs

ADRs (American Depositary Receipts) cotam em USD mas o balanço informa ações locais. Ex: CEPU tem 1.5B ações locais (ARS) mas apenas 150M ADRs (USD). Se usado diretamente, MCap = preço_ADR × ações_locais → inflado pelo ratio ADR (~10x).

Detecção automática: se ordinary_shares_number / shares_outstanding_current > 3, o ticker é classificado como ADR e usa shares_outstanding_current do YF.

Exemplo CEPU: BS shares = 1.5B, YF shares = 150M → ratio 10:1 detectado. Antes: MCap = $14.49 × 1.5B = $21.7B (errado). Agora: MCap = $14.49 × 150M = $2.17B (correto, YF = $2.47B).

11.3 Correção 3 — Sanity Check vs marketCap do Yahoo Finance

Para períodos recentes (ano fiscal ≥ ano_atual−2), o MCap calculado é comparado com o info["marketCap"] do YF:

  1. Se divergência > 5x (ou < 0.2x): usa o marketCap do YF como fallback
  2. O campo mcap_quality registra: ok, mcap_yf_fallback, mcap_yf_only, no_mcap, mcap_guard_revenue
  3. Janela de 2 anos (não apenas 1) garante cobertura mesmo em bases com defasagem
  4. Isso resolve automaticamente: Indonésia (.JK), Chile (.SN), Israel (.TA com shares mismatch)

11.4 Correção 4 — Rastreabilidade de Moedas

Novo campo trading_currency salvo separadamente de original_currency (= financialCurrency):

Tickeroriginal_currencytrading_currencySituação
AAPLUSDUSDNormal — mesma moeda
VALE3.SABRLBRLNormal — mesma moeda
PGAS.JKUSDIDRDif. moedas — conversão automática
CNA.LGBPGBpSubunidade — ÷100 automático

11.5 Correção 5 — Campo shares_outstanding_current

O sharesOutstanding corrente do YF agora é salvo no banco para auditoria. Permite verificar discrepâncias entre shares históricos (balance sheet) e shares correntes.

11.6 Campos de Auditoria Adicionados

CampoTipoDescrição
trading_currencyTEXTMoeda de negociação do preço (pode diferir de original_currency)
shares_outstanding_currentREALShares outstanding correntes do YF (fallback para MCap)
subunit_factorREALFator de subunidade aplicado (100 para .L/.TA/.JO, NULL para demais)
mcap_qualityTEXTStatus do sanity check: ok, mcap_yf_fallback, mcap_yf_only, no_mcap, mcap_guard_revenue. Períodos com no_historical_price ou stale_price são removidos da base (ver seção 3.4)

12. Resumo: Campos Raw vs Calculados

12.1 Campos Y Raw Yahoo (31 campos)

#Campo no BDDemonstrativo
1-14total_revenue, cost_of_revenue, gross_profit, operating_income, operating_expense, ebit, ebitda, normalized_ebitda, net_income, interest_expense, tax_provision, research_and_development, sga, diluted_average_sharesIncome Statement
15-17free_cash_flow, operating_cash_flow, capital_expenditureCash Flow
18-30total_assets, total_debt, stockholders_equity, total_liabilities, cash_and_equivalents, short_term_debt, long_term_debt, short_term_investments, current_assets, current_liabilities, ordinary_shares_number, preferred_stock, minority_interestBalance Sheet
31close_pricePreço Histórico

+ metadata: original_currency, trading_currency, fx_rate_to_usd, subunit_factor, mcap_quality

12.2 Campos C Calculados (30 campos)

GrupoCamposScript
Mercado/EVmarket_cap_estimated, enterprise_value_estimated, mcap_qualityfetch
Valores USDtotal_revenue_usd, ebit_usd, ebitda_usd, net_income_usd, free_cash_flow_usd, enterprise_value_usdfetch
Margensebit_margin, ebitda_margin, gross_margin, net_marginfetch
Indicadoresfcf_revenue_ratio, fcf_ebitda_ratio, capex_revenue, debt_equity, debt_ebitdafetch
Múltiplos EVev_revenue, ev_ebitda, ev_ebitfetch + ttm
TTMtotal_revenue_ttm, ebitda_ttm, ebit_ttm, free_cash_flow_ttm, net_income_ttm, ttm_quarters_countcalculate_ttm
Total: ~61 campos na tabela company_financials_historical — 31 raw + 30 calculados + 4 auditoria.

13. Qualidade dos Dados

13.1 Cobertura Temporal

O yfinance retorna tipicamente:

13.2 Badges de Qualidade no Frontend

BadgeDescriçãoCor
PeríodosTotal de registrosVerde
PreçoRegistros com close_price > 0Verde ≥90%, Amarelo ≥50%, Vermelho <50%
AçõesRegistros com ordinary_shares_number > 0Idem
EVRegistros com enterprise_value_estimatedIdem
MúltiplosRegistros com ev_revenue calculadoIdem
TTMRegistros com total_revenue_ttmIdem
4Q completosRegistros com ttm_quarters_count ≥ 4Idem

13.3 Limitações Conhecidas

LimitaçãoMitigação
Shares Outstanding histórico pode não estar disponívelUsa sharesOutstanding corrente como fallback; salvo em shares_outstanding_current
5° período anual pode ter dados incompletosCampo data_quality para filtrar
Série FX limitada a ~10 anosPeríodos mais antigos usam a taxa mais antiga disponível
Yahoo TTM snapshot não usado (apenas snapshot atual)TTM calculado por soma de 4Q com rastreio de confiabilidade
Exchanges com subunidade (pence, agorot, cents)Divisão automática via SUBUNIT_EXCHANGES + sanity check vs YF
Moedas incorretas do YF (IDR→USD, CLP→USD)Sanity check detecta divergência > 5x e usa marketCap do YF
ADRs com shares locais vs preço em USDDetecção automática via ratio BS/YF shares > 3x, usa shares_outstanding_current
Shares mismatch multi-class (Israel .TA)Subunit fix (÷100) + sanity check vs YF

14. Estudo Anloc — Metodologia da Base Analítica

14.1 Legenda dos Campos

Na Base Analítica, cada coluna de dados exibe um indicador sobrescrito:

IndicadorTipoDescriçãoExemplos
1Dado brutoExtraído diretamente do Yahoo Finance sem transformaçãoAções, Preço, Receita, EBITDA, FCF, Dívida, Caixa
2CalculadoDerivado pela aplicação a partir dos dados brutos1Mkt Cap, EV, Múltiplos, Margens, valores USD

Campos calculados2 possuem um ícone no cabeçalho que exibe a fórmula ao passar o mouse.

14.2 Fórmulas dos Campos Calculados

CampoFórmulaObservação
Mkt Cap2Ações1 × Preço1shares_outstanding_current × close_price
EV2Mkt Cap2 + Dívida1 − Caixa1+ Preferred Stock + Minority Interest quando disponíveis
EV/EBITDA2EV2 ÷ EBITDA1Apenas quando EBITDA > 0
EV/Vendas2EV2 ÷ Receita1Apenas quando Receita USD ≥ $100K
FCF/Vendas2FCF1 ÷ Receita1
FCF/EBITDA2FCF1 ÷ EBITDA1
Mg EBITDA2EBITDA1 ÷ Receita1Em %
Mg Bruta2Lucro Bruto1 ÷ Receita1Em %
Mg Líq2Lucro Líquido1 ÷ Receita1Em %
Rec USD2Receita1 × FX→USD1Conversão pela taxa do período
EV USD2EV2 × FX→USD1Conversão pela taxa do período

14.3 Metodologia para Ano Corrente (FY2026)

Abordagem híbrida: A partir de FY2026 (ano corrente), os múltiplos combinam dados de mercado atuais (preço e ações) para o Market Cap com dados financeiros históricos (TTM ou FY anterior) para os denominadores.
ComponenteFonteNatureza Temporal
Preço da açãoYahoo Finance — preço de fechamento mais recenteDado atual (mercado)
Ações em circulaçãoYahoo Finance — get_info()Dado atual (mercado)
Market CapPreço atual × Ações atuaisCalculado com dados atuais
Dívida, Caixa (p/ EV)Último balanço disponível (FY2025 ou Q mais recente)Dado histórico
Enterprise ValueMarket Cap (atual) + Dívida (hist.) − Caixa (hist.)Misto: mercado + balanço
Receita, EBITDA, FCFTTM (soma 4Q) ou FY mais recenteDado histórico/TTM
MúltiplosEV (misto) ÷ Fundamentals (histórico)Híbrido

Racional: Para o ano corrente, os demonstrativos financeiros anuais ainda não foram publicados. A melhor estimativa de valor de mercado usa preços e ações atuais, enquanto os denominadores usam dados financeiros recentes (TTM ou FY anterior). Abordagem equivalente a Bloomberg, Capital IQ e Damodaran.

15. Pipeline do Relatório Setorial C

O relatório setorial calcula medianas de EV/EBITDA e EV/Revenue para cada setor, segmentadas por região geográfica (Global, LATAM, Brasil).

15.1 EBITDA Normalizado vs EBITDA

Distinção fundamental: O relatório usa o campo normalized_ebitda do Yahoo Finance, não o campo ebitda. O Normalized EBITDA exclui itens extraordinários e não-recorrentes (write-offs, ganhos com venda de ativos, reestruturações), evitando distorções nas medianas setoriais.
CampoOrigem yfinanceItens ExtraordináriosUsado no Relatório
ebitdaEBITDA✅ Incluídos❌ Não
normalized_ebitdaNormalized EBITDA❌ ExcluídosSim

No SQL do relatório:

cfh.normalized_ebitda as ebitda

15.2 Dados para o Ano Corrente (FY2026)

Para o ano corrente, o relatório combina:

  1. Dados trimestrais (prioridade) — último trimestre disponível com EV de mercado atualizado
  2. Fallback: dados anuais do FY anterior para empresas sem dados trimestrais

Deduplicação garante 1 registro por empresa, priorizando o trimestral.

15.3 Annualização ×4 de Dados Trimestrais

Por que ×4? Dados trimestrais representam apenas 1 trimestre. Sem ajuste, EV/EBITDA seria ~4x maior que o real (ex: Technology sem ×4 = 41.4x, com ×4 = 11.84x).

Para registros quarterly, os campos-denominador são multiplicados por 4:

CampoAjusteRacional
normalized_ebitda×41 trimestre → projeção anual
total_revenue×41 trimestre → projeção anual
free_cash_flow×41 trimestre → projeção anual
Nota: Trata-se de multiplicação simples ×4 (projeção linear), não TTM (soma de 4 trimestres distintos). O relatório recebe apenas o trimestre mais recente por empresa.

15.4 Cadeia de Filtros

Os filtros são aplicados em sequência. Empresas excluídas são removidas do dataset (não setadas para NaN), com motivo registrado.

#FiltroDefaultComportamento
1Indústrias selecionadasTodasRemove empresas de indústrias não selecionadas
2Exclusão manual de tickersNenhumRemove tickers específicos (suporta Exchange:TICKER)
3EV mínimo$100M USDRemove empresas com EV < limiar
4EBITDA positivoSimRemove empresas com EBITDA ≤ 0 ou nulo
5Teto EV/EBITDA60xRemove empresas com EV/EBITDA > limiar

Filtros 3, 4 e 5 são configuráveis pelo usuário na interface.

15.5 Cálculo dos Múltiplos

EV/EBITDA = Enterprise Value Estimado ÷ Normalized EBITDA (×4 se quarterly)
EV/Revenue = Enterprise Value Estimado ÷ Revenue (×4 se quarterly)

Apenas quando o denominador é positivo. A métrica principal é EV/EBITDA.

15.6 Estatísticas por Região

EstatísticaDescriçãoObservação
MedianaValor central (menos sensível a outliers)Métrica principal do relatório
MédiaMédia aritméticaInformativo
P25Percentil 25 (1° quartil)Limite inferior
P75Percentil 75 (3° quartil)Limite superior
NContagem de empresas válidasRepresentatividade

Segmentação geográfica:

O relatório calcula spreads (premium/discount) entre regiões: diferença absoluta, percentual e direção.

15.7 Evolução Temporal

A evolução aplica a mesma metodologia para cada ano de FY2021 ao FY corrente:

16. Testes de Qualidade de Dados

Suíte de testes (scripts/test_data_quality.py) valida a integridade dos dados em múltiplas camadas:

16.1 Fase 1 — Consistência Interna do DB

Detecta anomalias no banco de dados:

16.2 Fase 1b — Sanidade dos Múltiplos do Relatório

Simula o cálculo do relatório e verifica:

VerificaçãoDescrição
QUARTERLY_NOT_ANNUALIZEDDetecta se a annualização ×4 está faltando
CURRENT_YEAR_INFLATEDMediana do ano corrente > 2× ano anterior
CEILING_NOT_APPLIEDMediana > teto configurado
EXTREME_SECTOR_MEDIANAnomalia nas medianas setoriais

16.3 Fase 1c — Validação Determinística (Diff esperada: 0%)

Testes que devem apresentar 0% de desvio — qualquer desvio indica bug:

TesteVerificaçãoFórmula
AMúltiplos armazenados vs calculadosev_ebitda stored == EV ÷ normalized_ebitda
BMargens armazenadas vs calculadasebitda_margin stored == normalized_ebitda ÷ revenue
ESoma de 4 trimestres vs anualΣ 4Q revenue ≈ annual revenue (mesma empresa, mesmo FY)

16.4 Fase 1d — Replicação do Relatório (Diff esperada: 0%)

Teste end-to-end que:

  1. Replica o SQL exato do relatório
  2. Aplica mesmos filtros e annualização
  3. Calcula mediana independentemente
  4. Compara com o resultado da API (/api/estudoanloc/generate_report)
Diferença esperada: 0.000% — mesmo código, mesmos dados. Qualquer divergência indica bug na pipeline.

16.5 Fase 2b — Comparação Online com Yahoo Finance

Busca dados ao vivo do Yahoo Finance para amostra representativa (10 setores × até 10 tickers) e compara:

Divergência esperada: Financial statements (Revenue, EBITDA) devem ter ~0% de desvio para FY encerrados. Múltiplos baseados em EV podem divergir porque o EV muda diariamente com o preço da ação.
Documento atualizado em abril/2026 (v4 — Pipeline do Relatório + Testes de Qualidade) • Scripts: fetch_historical_financials.py, calculate_ttm.py, test_data_quality.py