Dados B3 › Transparency
Transparency
Transparency — how you check the numbers yourself
Data version 2026-09-27-reapresentacao-agreg · page generated 2026-09-27 03:57 UTC. If these do not match /saude, you are reading a cached copy.
What is checked, before every publication — 466 automated tests, collected live
43 are DATA invariants (does the number tie out?) and 120 are product tests — access gate, navigation, language, AI connector. Calling all 466 'invariants' would be inflating it: the split is checkable in the list itself. Not a hand-picked highlight reel: every test below was found by introspecting the actual test files just now, the same way pytest --collect-only would. Grouped by what it protects against, not by which file it lives in.
Level 1 — Integrity: does the data tie out? (35)
I-P16— Every stored unit composition respects the maximum error and minimum sample the inference itself declares — the difference between 'the function applies the rule' and 'what is in the database went through it'.I-P17— COUNTER-PROOF from B3's RAW file: recomputes `a×ON + b×PN` against the unit price without going through the function that inferred it. A wrong pair still minimises some error; what it cannot do is explain the price within 2% across thousands of sessions.I-P18— A company whose primary ticker is a unit WITH a known composition can no longer carry the not-adjusted flag, and its price-to-book must land in the same plausible band as everyone else — the outcome test that proves the basket was applied, not merely discovered.I-P01— No trading code is tied to more than one company.I-P03— In the window where the old and the new code coexist, the company has ONE price per day — the primary one's.I-P21— A multiple whose price came two or more years after the fiscal year always carries a flag. The regulator's receipt date belongs to the LAST version of a filing, so when a company re-files, the date moves forward and our first-session-after-publication rule lands years past the year being measured. Anyone filtering on 'no flag' must not receive one year's profit matched against a price three years later.I-P22— Put the defect back and the stale-pair mark has to appear. Without this attack the rule could never fire and the invariant above would pass on an empty set, which is exactly how a checker is born decorative. It also checks that an existing flag is preserved rather than overwritten, and that the ordinary case — a filing published the following year — is left unmarked.I-P06— low ≤ open, close ≤ high, in EVERY row.I-P08— On a date where the company traded under TWO codes, all five prices come from the winning code — not one from each.I-P09— Reference prices, checked in ABSOLUTE value.I-P10— Financial volume ≈ quantity × average price — the anchor that CROSSES field slices.I-P11— Volume, quantity and trade count checked in ABSOLUTE value.I-P13— No primary ticker has far less traded value than a still-active sibling of a DIFFERENT share class — the property the liquidity correction exists to guarantee, asked of the database rather than trusted from the code that wrote it.I-P19— A B3 code is 4 positions plus a class digit, not 4 LETTERS plus a digit. The exchange itself trades as B3SA3, with a numeral inside the ticker root. The regex demanded [A-Z]{4} and the catalogue filtered on isalpha(), so B3 was discarded in both places: never ingested from COTAHIST, never present in the catalogue. It sat in the base under BVMF3, retired in 2017, with zero recent volume — anyone typing the real code found nothing, while B3SA3 shows 658 sessions and R$ 353bn traded.I-P20— A truncated B3 catalogue does NOT get to change which ticker represents a company. The endpoint is paginated and fails mid-way often — one measurement delivered 9 of 30 pages — and it used to do so in silence, returning half a catalogue as if it were whole. Deciding the representative ticker from half a source is worse than not deciding: the right code may simply not have arrived.I-P24— When the regulator’s file carries the whole consolidated block as zeros (TIM S.A., 2024 and 2025 annual filings) while the individual statements have figures, the standardised data uses the individual block, annotates the origin of every item and flags the indicator. Before, the zero was read as a value and TIM became a ‘company with no operations’. A single non-zero figure in the consolidated block keeps it; zeros on both sides have nowhere to fall.I-P25— For every company whose primary instrument is a unit with a known basket, the published market cap equals (price ÷ basket) × shares, recomputed here from the tables, in the annual and in the quarterly multiples, with or without the thousands-scale correction. The defect it guards against appeared on the first build with promoted units: the thousands-scale correction recomputed price × shares and dropped the divisor, so Santander came out at R$ 250bn (about R$ 125bn real) while flagged as adjusted, and the quarterly multiples had never divided any unit at all.I-P26— No PUBLISHED multiple has a share count 3x larger or smaller than the last published year before it without a corporate event to explain it. The plausibility band against equity let CSN Mineração through with a R$ 271 billion market cap in 2025 (33 billion in 2024, price falling): P/E 164 and P/B 40 published as clean. A share count does not change 10x without an event; the database holds the events; the cross-check was missing. The year after an IPO, counts already adjusted for events or scale, and any recorded event in the year, the previous or the next are accepted explanations.I-P27— With round numbers, every field of a multiple comes out exact: market value = price × shares; P/E = value ÷ controlling-shareholder profit; P/B = value ÷ (total equity − minorities); EV/EBITDA = (value + net debt) ÷ EBITDA; FCF yield = (operating cash flow + capex) ÷ value — and no flag. The suite tested the BUILT database, not the code that computes it; code mutation showed that swapping any of these operations went through.I-P28— Each substitution comes with its own flag and a number that does not exist stays empty: without minorities, total equity; without controlling profit, total profit; negative profit gives a negative P/E flagged, zero profit an empty P/E; non-positive equity has no P/B; missing EBITDA, negative EBITDA or unknown debt silence EV/EBITDA without inventing it; without capex, no FCF yield.I-P29— The rulers fall on their declared side: a P/E of exactly 200 is not extreme, above is; market value BELOW 1% of equity is a share count in thousands (fixed ×1000 and flagged), exactly 1% is not fixed and falls outside the plausibility band; 0.02× and 50× equity are inside; above the market-value ceiling nothing is published.I-P30— A unit ticker divides the price by its basket (and says so), an unknown basket is flagged; a year with divergent scale loses the four multiples; without shares outstanding the row is empty with the reason; the share count used is the last PUBLIC snapshot up to the price date (never the future), flagged when it came from the reference form and when it is more than 200 days old.I-P31— A year's share count against the previous priced year: up to 3× either way passes; beyond, the year has no multiples — unless the previous year was the FIRST with a price (IPO), the ratio is the ~1000× of a thousands scale, a corporate action is recorded between the previous and the next year, or the count was already adjusted.I-P32— A synthetic COTAHIST line with a distinct value in every field records close, open, high, low, average (two decimals), volume, quantity divided by the quotation factor, trades, date and the source code. Other record types, odd-lot market, unknown codes, zero price and unreadable lines are not recorded.I-P33— In the week a company trades under the old and the new code, the day's record is the main ticker's — all eight fields of the same line and its code — whatever the order in the file; a day only the old code traded keeps the old one. Large batches are written in full.I-P34— The code map gives the main ticker priority 0 and history of the same class priority 1; history of another class is not stitched; a code claimed by two companies leaves both; a company without a main ticker is left out.I-P35— The main ticker comes only from the company's most recent registration file and only from an active, exchange-traded, valid code, common before preferred; the code history gathers every year without placeholders.I-P36— Trailing-twelve-month profit by the identity prior annual − prior Q1..Qk + current Q1..Qk; total net income enters flagged when controlling-shareholder profit is missing; a missing piece makes it null with the missing piece named.I-P37— The quarterly multiple uses the first session from the quarterly filing's receipt within 45 days inclusive; market cap = price × shares, P/E TTM = cap ÷ TTM profit, P/B = cap ÷ (equity − minorities). Each absence — no filing, no session in the window, no share count — is recorded by name.I-P38— The share count is the latest already public up to the date (inclusive), never a later one; on a tie DFP/ITR beat the FRE; FRE alone is flagged; zero counts are ignored; above 100 billion no number; staleness above 200 days is flagged, 200 is not.I-P39— The annual calculation writes one row per year with facts: no filing received gives sem_data_publicacao, no session in the window gives the receipt date and sem_preco_apos_publicacao, otherwise the first session from the receipt (never the one before) and the full computation; it returns how many rows it wrote.I-P40— One step above each cut-off changes the result: P/E 200.5 is extreme; market cap 50.5x equity leaves the band; equity of exactly zero has no P/B and does not divide; half a real of EBITDA still gives EV/EBITDA; half a real of profit is not negative; the market-cap ceiling and the implausible share count at the exact number and just above.I-P41— A split with ex-date on the share-count date is applied; on the price date it is not; the day before the price it is. A suspicious event without a factor inside the window silences the count; outside it, it does not.I-P42— Q2 and Q3 find the quarterly filings of 30 June and 30 September; quarterly P/E of exactly 200 is not extreme and 200.5 is; P/B 50 is not and 50.5 is; market cap at exactly 1% of equity is not rescaled; zero equity does not divide. In COTAHIST a zero quotation factor counts as 1 and a 50-cent price is a price.I-P43— A COTAHIST line with every byte filled — digits next to each field, every number using its full width — is read exactly, so a slice shifted by one byte changes the number. Share jumps of 950x and 1,050.5x fall outside the thousands band and are flagged; a prior year declared in thousands is multiplied by exactly 1,000. In the quarterly path, equity of 50 cents still gives P/B and TTM profit of 50 cents is not negative.
Level 2 — Semantics: does the account mean what the calculation assumes? (7)
I-P05— `codigos_negociados` works with ZERO COTAHIST files present: it returns an empty set instead of raising.I-P02— Every code feeding a company's price series belongs to the SAME share class as today's primary ticker.I-P04— Every market cap uses a share-count snapshot that WAS ALREADY PUBLIC on the price date — never a later one.I-P12— The quotation factor corrects the QUANTITY; the price passes through untouched.I-P14— The swap only ever happens between different share CLASSES — never between a code and the retired name of the same class. Without this, MOTV3 would lose to CCRO3 and EMBJ3 to EMBR3: the old code has more historical volume purely because it existed longer, and the site would start calling Embraer and Motiva by the codes they abandoned.I-P15— The liquidity swap elects a unit only when its basket is recorded in unit_composicao, and never dethrones one. A unit packs N shares into one instrument; without N, market cap comes out multiplied. The basket is now inferred from the unit’s own price and market cap already divides by it, so keeping units out left Energisa represented by ENGI3, which trades 2,669 times LESS than ENGI11 — Taesa, Iguatemi, Santander and Sanepar likewise, four of them vanishing from any liquidity-screened universe. A unit with no recorded basket still cannot win, however liquid.I-P23— A company that changed its ticker root (Marfrig to MBRF3 in January 2026) gets the new code even while the annual registration form still lists the old one, and the old code, with zero recent volume, yields without the 3x factor over the sixteen years of history it accumulated. Same root is never a rename; a root claimed by two companies is discarded; a living incumbent keeps the factor.
Level 3 — Economic: is the result possible in the real world? (1)
I-P07— The B3 average price falls OUTSIDE [low, high] in ~0.1% of rows — and this test exists to record that, not to fail on it.
Other product tests (0)
Access gate, navigation and the MCP connector — they test whether the product works, not whether a number is right, so they don't fit the 3 levels above by design. Still counted, still listed:
Reconstruct it yourself — net margin across 5 companies, 4 sectors
We don't ask you to trust the numbers. Here's the net margin of five companies in four different sectors, each rebuilt straight from its annual report (DFP) at the CVM — net income ÷ revenue, matching the published figure exactly. For ANY indicator, of any company, the whole chain down to the line in CVM's file is at /linhagem:
| Company · sector | Net income (CVM acct) | Revenue (CVM acct) | Margin =÷ |
|---|---|---|---|
| WEGE3 · industrial | R$ 6.78 bn DRE:3.11 | R$ 40.80 bn DRE:3.01 | 16.6% |
| VALE3 · mining | R$ 11.81 bn DRE:3.11 | R$ 213.59 bn DRE:3.01 | 5.5% |
| PETR4 · oil & gas | R$ 110.61 bn DRE:3.11 | R$ 497.55 bn DRE:3.01 | 22.2% |
| ITUB4 · bank | R$ 45.85 bn DRE:3.09 | R$ 387.12 bn DRE:3.01 | 11.8% |
| BBAS3 · bank | R$ 16.78 bn DRE:3.11 | R$ 319.46 bn DRE:3.01 | 5.3% |
Download any of these DFPs from the CVM, take the income and revenue accounts, divide — you get the same number. Banks use interest income as revenue (what makes sense for a bank), so the reconciliation is sector-aware; the others use sales revenue. Figures are the latest fiscal year.
Why we may differ from another site (and it's not an error)
A difference between two sites usually isn't one being wrong — it's a method choice. We disclose ours:
- Average vs ending capital: ROE and ROIC use average equity/capital (this year + last ÷ 2), not the ending balance — so they're not a naive single-year division.
- Controlling vs consolidated: we state which one each item uses.
- TTM vs annual: quarterly multiples use trailing-twelve-months earnings.
- IFRS 16, goodwill, cash, exceptional tax: each handled explicitly and flagged when it distorts.
Do the tests bite? Yes — real cases the suite has caught
A test that never fails could mean perfect data — or a weak test. These were born from real errors that slipped through, and now fail — only shown for tests that actually exist in the collected suite above:
- I-B16 · banks' P/E = 0: the CVM reports share count sometimes in units, sometimes in thousands (varying by company and year); market cap came out 1000× too small and P/E was zero. I-B16 (price × shares recomputed) caught it — we fixed 661 annual and 2,027 quarterly multiples.
- I-B24 · the vanishing profit: the profit/equity account varies by bank (Itaú 3.09, BB 3.11); if the label search fails, the number vanishes silently and ROE is born wrong. I-B24 makes that hole fail.
- H-B23 · the 800% dividend yield: old B3 dividends carry a price not adjusted for splits; without H-B23 the yield would look absurdly real. The flag keeps the record and warns.
- I-B20 · the missing COTAHIST 2023: on the first deploy one year of prices failed to download silently; the API shipped with ~50k fewer prices and the suite passed, because nothing checked coverage. We added I-B20 — a year without prices now fails the build loudly.
- I-B33 · Oil & Gas at −89.6% in one week: COTAHIST isn't split-adjusted; a 10:1 split read as a −90% weekly return and stayed in the cumulative return forever, with nothing failing (a blind amplitude filter didn't fix it either — it just flipped which direction was wrong). I-B33 (no sector week beyond ±35%, the ruler is the exchange itself) stops the build.
- I-B31 · 364 of 865 sector-index weeks frozen: extending the series back to 2010, a sector with no company carrying a market cap that week turned into a factor of 1.0 — a flat line that the cumulative return read as 'market stood still', and the 'since 2010' return came out fictional (+527%). I-B31 fails on any week repeated to the cent.
- I-E05 · EMBRAER's 2010 P/E priced with 2025 data: the point-in-time price lookup fell forward with no ceiling whenever the current ticker had no price at balance-sheet time (ticker change, share-class migration); the multiple came out priced 15 years into the future, in 22% of annual and quarterly rows, silently. The 45-day window (and I-E05) blocks it: no session inside the deadline, no multiple computed.
- I-E04 · AZUL at R$ 1.67 quadrillion market cap: the balance sheet carried 54.7 trillion shares from the judicial recovery issuance, but the price used was already on the post-reverse-split (1:150,000) basis — two ends measured on different bases, market cap wrong by orders of magnitude. I-E04 (market cap never above Brazil's GDP) fails the build on that absurdity.
How far back each block of data goes
No asterisks here: this is coverage year by year, counted right now. Indicators (ROE, ROIC, margins, growth) come from the filings alone and cover the whole series. Multiples (P/E, P/BV, EV/EBITDA) need a price and a share count — and the share count comes from CVM's reference form, which the further back you go the fewer companies filed in a usable format. The gap between the two columns is a source limit, not an ingestion hole. If you look for an old P/E and do not find it, it is because nobody has it — not because we hid it. The same numbers as JSON: /cobertura.
| Year | Companies with indicators | Companies with multiples |
|---|---|---|
| 2025 | 438 | 290 |
| 2024 | 444 | 296 |
| 2023 | 442 | 298 |
| 2022 | 429 | 295 |
| 2021 | 423 | 296 |
| 2020 | 410 | 274 |
| 2019 | 371 | 164 |
| 2018 | 326 | 164 |
| 2017 | 317 | 162 |
| 2016 | 311 | 152 |
| 2015 | 303 | 143 |
| 2014 | 301 | 139 |
| 2013 | 292 | 130 |
| 2012 | 291 | 111 |
| 2011 | 284 | 97 |
| 2010 | 277 | 34 |
Live coverage
456 companies · 876,076 price points · 8,654 recorded restatements · last refresh 2026-09-27 00:20:28. Full live counts at /saude.
Sources: CVM (open data, ODbL) and B3 (COTAHIST). Not affiliated with B3 or the CVM. Not investment advice.
Numbers on this page are live. Data version 2026-09-27-reapresentacao-agreg · page generated 2026-09-27 03:57 UTC. If this does not match /saude, you are reading a cached copy.