Dados B3 › Transparência
Transparência
Transparência — como você confere os números você mesmo
Versão do dado 2026-11-03-ponte-b3-codigo-de-fundo · página gerada em 2026-11-07 01:13 UTC. Se isto não bater com o /saude, você está lendo uma cópia em cache.
O que é conferido, antes de cada publicação — 1238 testes automáticos, coletados ao vivo
46 são invariantes de DADO (o número fecha?) e 131 são de produto — gate de acesso, navegação, idioma, conector de IA. Chamar os 1238 de 'invariantes' seria inflar: a divisão é conferível na própria lista. Não é uma seleção à mão dos melhores exemplos: cada teste abaixo foi achado agora, introspectando os arquivos de teste de verdade, do mesmo jeito que pytest --collect-only acharia. Agrupados pelo que protegem, não pelo arquivo onde moram.
Nível 1 — Integridade: o dado fecha? (46)
I-H09— Os brutos NÃO caem dentro de `_build/`, que é apagado a cada build.I-H10— O build declara TMPDIR e SQLITE_TMPDIR fora do /tmp.I-H11— Banco sem as tabelas derivadas as ganha no BOOT, não no rebuild.I-H12— Falha ao carregar derivado vira aviso, nunca exceção no boot.I-H01— O caso do fluxo em 21/08: a fonte externa devolveu ZERO e o banco em construção ficou sem nenhuma linha.I-H02— O caso do CÂMBIO em 21/08, que é o que um `if vier vazio: copiar` deixaria passar — veio pela metade, não vazio.I-H03— A regra em uma frase: depois da herança, nenhuma das tabelas pode ter MENOS linhas que o banco anterior.I-H04— Primeiro build da vida (ou disco limpo): não há de onde herdar.I-H05— Os números REAIS de 21/08/2026 têm de ser recusados.I-H06— A trava NÃO pode ser zero, e este é o teste que impede isso.I-H07— O caso normal: banco novo maior.I-H08— Primeiro build da vida: não há com o que comparar.I-H13— Uma regra nova pode tirar linhas de propósito — mas só declarando quanto, e só na troca de versão.I-H14— O backup diário copia as três bases pequenas do disco persistente (acompanhamento, analytics, recibos) pela API de backup do SQLite para DADOS_DIR/backup/AAAA-MM-DD/, com o conteúdo inteiro e abrível; não copia de novo no mesmo dia; base ausente fica de fora; guarda só os 7 dias mais recentes; /saude diz a data do último e quantos arquivos, sem caminho nem conteúdo.I-H15— O banco pronto sobe em pedaços pelas rotas /admin/base/*, só com o cabeçalho X-Admin-Token (a query e a ausência dão 404), e fica estacionado com a versão que ele traz, sem tocar no banco em produção.I-H16— Pedaço com offset diferente do que o servidor tem dá 409 com o tamanho atual (é assim que o script retoma depois de uma queda); pedaço acima do teto, vazio ou com outra base já pronta é recusado; sha256 errado, gzip inválido e arquivo que não é banco íntegro com data_version falham COM motivo e apagam o parcial, para recomeçar limpo.I-H17— A troca só acontece quando a base estacionada traz a versão que o CÓDIGO no ar promete, o banco em produção ainda não está nela e nenhuma contagem vigiada encolheu além do limite.I-H18— Com RECONSTRUIR_NO_SERVIDOR=0 o servidor não reconstrói o banco (versão nova ou domingo); sem banco nenhum ele ainda reconstrói, que é o socorro de um disco vazio.I-H19— `construir_local.I-H20— `_memoria_do_processo` lê o /proc e o cgroup (v2 e v1) e devolve MB do processo, do pico, do contêiner e do limite; "max" (sem teto) e arquivos ausentes ficam de fora; sem /proc (Windows) devolve None.I-H21— `construir_local.I-H22— Ao conferir uma base (sha256, descompressão, quick_check) o servidor pede `posix_fadvise(DONTNEED)` sobre o parcial e sobre o banco descomprimido; onde a chamada não existe (Windows) é um nada, sem erro.I-H23— Enquanto a base é descomprimida, conferida e recebida, uma thread pede ao Linux que descarte o cache a cada segundo (e a cada pedaço recebido); ao sair do bloco a thread termina.I-H24— `descomprimir` produz o arquivo idêntico e, a cada `a_cada` bytes escritos, força a gravação (fsync) e pede ao Linux que solte o cache.I-H25— Se uma consulta de rede dá tempo esgotado — no aviso de fim (cuja resposta se perde, mas o servidor já começou a conferir) ou na espera pela conferência — `enviar` tenta de novo e termina com a base PRONTA, em vez de morrer; um 409 "em andamento" no aviso repetido conta como "chegou".I-H26— `/admin/base/estado` diz se o servidor ainda reconstrói o banco (`reconstroi_no_servidor`), lendo RECONSTRUIR_NO_SERVIDOR: sem a variável ou com 1, verdadeiro; com 0, falso.I-H27— `python construir_local.I-H28— Ao ativar, a base estacionada recebe do banco em produção as linhas de fluxo estrangeiro, câmbio, IPCA e Selic que ela não tem (INSERT OR IGNORE: o que a base nova trouxe fica), e só então a trava de encolhimento decide.I-H29— Ao ativar, `etf_diario` e `etf_balancete` recebem do banco em produção as linhas que a base estacionada não tem; em conflito de chave fica a de `id_doc` MAIOR (a regra do schema); `etf_balancete_reenvio` só ganha o que não existe; tabela ausente num dos lados é ignorada sem derrubar.I-H30— Ao trocar, o banco que estava no ar fica ao lado como `<banco>.I-H31— `GET /admin/base/ar` entrega o banco em gzip que, descomprimido, é IDÊNTICO ao arquivo, com o tamanho original e a versão nos cabeçalhos; só com o cabeçalho do dono (404 sem ele ou com o token na URL); recusa com 503 se há WAL não consolidado e com 409 se já há um download em andamento; o lock é solto.I-H32— `construir_local.I-H33— `arquivar_no_redundante`: sem `DADOSB3_NAS_REDUNDANTE` não faz nada (e não levanta); configurado, copia os arquivos da casa e espelha as cópias `bases/ar/*` do NAS principal, sem recopiar o que já está lá e sem copiar nada fora da lista (banco de assinante); com o redundante fora do ar só AVISA.I-H34— `construir_local.I-H35— Entre o arquivo da base estacionada aparecer e a ficha com a versão ser gravada, `estado()` responde "processando" — nunca "pronta" com a versão vazia.I-H36— No Linux, o import do api limita o alocador a 2 arenas (`mallopt(M_ARENA_MAX=-8, 2)`) e o laço de hora em hora devolve a memória liberada (`malloc_trim(0)`); fora do Linux nada é chamado e o estado diz que não limitou.I-H37— `construir_local.I-H38— Se o servidor reinicia no meio da conferência (um deploy), a ficha que ficou dizendo "processando" passa a ler "falhou" com o motivo, e o mesmo envio pode ser finalizado de novo até virar "pronta".I-H39— O servidor tem o parcial COMPLETO de uma base velha e a ficha "falhou" (conferência interrompida por reinício, I-H38).I-H40— O isolamento de `testes/conftest.I-H46— `guardar_o_ar` NÃO baixa o banco do ar quando o NAS já tem a MESMA versão (base construída em `bases/.I-H41— `em_curso` lista os pedidos que estão no app do mais velho ao mais novo, com método, caminho + query SEM os parâmetros de segredo (api_key, chave, token, t.I-H42— `medir` lê VmRSS, RssAnon e RssFile de /proc/self/status, soma os filhos (e os filhos dos filhos, pelo /proc/<pid>/task/<tid>/children) e lê o contêiner (cgroup v2 ou v1).I-H43— `avaliar`: abaixo do aviso não escreve nada; ao cruzar escreve UMA linha com a memória, a fase do laço de fundo, o pedido mais velho e a lista em curso; enquanto segue alto, no máximo uma linha a cada 30 s; ao voltar, uma linha de recuperação.I-H44— Acima de `corte_mb` o corte liga por `corte_s`: pedido NOVO de família pesada (/acoes, /linhagem, /og.I-H45— `iniciar` não sobe a thread na bateria, com VIGIA_MEMORIA_DESLIGADO=1 nem sem /proc, e diz o motivo; limiares vêm das variáveis (valor torto cai no padrão).
Nível 2 — Semântica: a conta significa o que o cálculo supõe? (0)
Nível 3 — Econômico: o resultado é possível no mundo real? (0)
Outros testes do produto (0)
Gate comercial, navegação e o conector MCP — testam se o produto funciona, não se um número está certo, então não entram nos 3 níveis acima por natureza. Contados e listados do mesmo jeito:
Reconstrua você mesmo — margem líquida de 5 empresas, 4 setores
Não pedimos que você confie nos números. Eis a margem líquida de cinco empresas de quatro setores diferentes, cada uma reconstruída direto do balanço anual (DFP) na CVM — lucro líquido ÷ receita, batendo exatamente com o valor publicado. Para QUALQUER indicador, de qualquer empresa, a cadeia inteira até a linha do arquivo da CVM está em /linhagem:
| Empresa · setor | Lucro líq. (conta CVM) | Receita (conta CVM) | Margem =÷ |
|---|---|---|---|
| WEGE3 · indústria | R$ 6,78 bi DRE:3.11 | R$ 40,80 bi DRE:3.01 | 16,6% |
| VALE3 · mineração | R$ 11,81 bi DRE:3.11 | R$ 213,59 bi DRE:3.01 | 5,5% |
| PETR4 · petróleo | R$ 110,61 bi DRE:3.11 | R$ 497,55 bi DRE:3.01 | 22,2% |
| ITUB4 · banco | R$ 45,85 bi DRE:3.09 | R$ 387,12 bi DRE:3.01 | 11,8% |
| BBAS3 · banco | R$ 16,78 bi DRE:3.11 | R$ 319,46 bi DRE:3.01 | 5,3% |
Baixe a DFP de qualquer uma delas na CVM, pegue as contas de lucro e receita, divida — você chega no mesmo número. Bancos usam a receita de intermediação (o que faz sentido pra um banco), então a reconciliação é ciente do setor; os demais usam a receita de vendas. Valores do último exercício.
Por que às vezes divergimos de outro site (e não é erro)
Uma diferença entre dois sites geralmente não é um estar errado — é uma escolha de método. A nossa está aberta:
- Capital médio vs final: ROE e ROIC usam patrimônio/capital médio (ano atual + anterior ÷ 2), não o saldo final — então não são uma divisão ingênua de um ano só.
- Controladora vs consolidado: dizemos qual cada item usa.
- TTM vs anual: múltiplos trimestrais usam lucro dos últimos 12 meses.
- IFRS 16, goodwill, caixa, imposto excepcional: cada um tratado explicitamente e sinalizado quando distorce.
Os testes mordem? Sim — casos reais que a bateria já pegou
Um teste que nunca falha pode significar dado perfeito — ou teste fraco. Estes nasceram de erros reais que passaram, e hoje reprovam — só aparece o que existe de verdade na bateria coletada acima:
- I-B16 · o P/L = 0 dos bancos: a CVM reporta o nº de ações ora em unidades, ora em milhares (varia por empresa e por ano); o market cap saía 1000× menor e o P/L dava zero. O I-B16 (preço × ações recomputado) pegou — corrigimos 661 múltiplos anuais e 2.027 trimestrais.
- I-B24 · o lucro que sumia: a conta de lucro/PL varia por banco (Itaú 3.09, BB 3.11); se a busca por rótulo falha, o número some em silêncio e o ROE nasce errado. I-B24 faz esse buraco reprovar.
- H-B23 · o dividend yield de 800%: provento antigo na B3 vem com preço não ajustado por desdobramento; sem o H-B23 o yield sairia absurdo como se fosse real. A flag mantém o registro e avisa.
- I-B20 · o furo do COTAHIST 2023: no 1º deploy, o download de um ano de preços falhou em silêncio; a API subiu com ~50 mil preços a menos e a bateria passou, porque nenhum teste olhava cobertura. Criamos o I-B20 — ano sem preço agora reprova o build alto.
- I-B33 · Petróleo e Gás em −89,6% numa semana: o COTAHIST não é ajustado por desdobramento; um split 10:1 lia como −90% de retorno semanal e ficava no acumulado para sempre, sem nada reprovar (um filtro cego de amplitude nem resolveu — só trocou o erro de sinal). I-B33 (nenhuma semana de setor além de ±35%, a régua é a própria bolsa) faz o build parar.
- I-B31 · 364 de 865 semanas do índice setorial congeladas: ao estender a série até 2010, setor sem nenhuma empresa com market cap naquela semana virava fator 1,0 — uma linha reta que o retorno acumulado lia como 'mercado parado', e o retorno 'desde 2010' saía ficcional (+527%). I-B31 reprova qualquer semana repetida ao centavo.
- I-E05 · o P/L de 2010 da EMBRAER com preço de 2025: a busca de preço ponto-no-tempo caía para a frente sem teto quando o ticker atual não tinha preço na época do balanço (troca de código, mudança de classe); o múltiplo saía calculado com um preço 15 anos no futuro, em 22% das linhas anuais e trimestrais, em silêncio. A janela de 45 dias (e o I-E05) barra isso: sem pregão dentro do prazo, o múltiplo não é calculado.
- I-E04 · a AZUL com R$ 1,67 quadrilhão de valor de mercado: o balanço trazia 54,7 trilhões de ações da recuperação judicial, mas o preço usado já estava na base pós-grupamento de 1:150.000 — duas pontas em bases diferentes, market cap errado por ordens de grandeza. I-E04 (valor de mercado nunca maior que o PIB do Brasil) faz esse absurdo reprovar o build.
Até onde vai cada bloco de dado
Aqui não tem asterisco: esta é a cobertura ano a ano, contada agora. Indicadores (ROE, ROIC, margens, crescimento) saem só das demonstrações e cobrem a série inteira. Múltiplos (P/L, P/VP, EV/EBITDA) exigem preço e número de ações — e o nº de ações vem do Formulário de Referência, que quanto mais antigo menos companhia entregou em formato aproveitável. A diferença entre as duas colunas é limite da fonte, não buraco de ingestão. Se você procurar um P/L antigo e não achar, é porque ninguém tem — não porque escondemos. Os mesmos números em JSON: /cobertura.
| Ano | Empresas com indicadores | Empresas com múltiplos |
|---|---|---|
| 2025 | 440 | 290 |
| 2024 | 444 | 296 |
| 2023 | 442 | 298 |
| 2022 | 429 | 295 |
| 2021 | 423 | 296 |
| 2020 | 411 | 274 |
| 2019 | 372 | 166 |
| 2018 | 327 | 167 |
| 2017 | 318 | 165 |
| 2016 | 312 | 154 |
| 2015 | 304 | 144 |
| 2014 | 302 | 140 |
| 2013 | 293 | 131 |
| 2012 | 291 | 112 |
| 2011 | 284 | 98 |
| 2010 | 277 | 34 |
Cobertura ao vivo
456 empresas · 883,569 pontos de preço · 8,670 reapresentações registradas · última atualização 2026-11-06 01:27:27. Contagens completas ao vivo em /saude.
Fontes: CVM (dados abertos, ODbL) e B3 (COTAHIST). Não afiliado à B3 nem à CVM. Não é recomendação de investimento.
Os números desta página são ao vivo. Versão do dado 2026-11-03-ponte-b3-codigo-de-fundo · página gerada em 2026-11-07 01:13 UTC. Se isto não bater com o /saude, você está lendo uma cópia em cache.