How every figure here is built
No ratio on this site comes from an aggregator or a third-party estimate. Everything derives from filings the company lodged with Brazil's securities regulator (CVM) and from B3's own daily file. This page exists so you can check the method — and so you know where it can fail, because every source has a way of fooling whoever does not look.
Isolated quarters, never year-to-date
Q2 2026 revenue = the row spanning 01 Apr → 30 Jun (not the row 01 Jan → 30 Jun)
In quarterly filings the income statement appears twice for the same period: year-to-date and the quarter on its own. This site always uses the isolated quarter, and shows each row's actual window.
The trap: Adding both produces a figure that exists in no document. For MGLU3's Q2 2026, mixing them would pair half-year revenue (R$ 18.10bn) with the quarter's loss (−R$ 72.5m) — an invented margin, with nothing visibly wrong on screen.
Q4 is computed, and labelled as such
Q4 = full year (annual filing) − first nine months (Q3 filing)
The CVM does not publish a standalone fourth quarter: the annual filing carries the closed year. Every December row here is tagged “computed”, and any ratio using one says so on the same screen.
The trap: The balance sheet is excluded from this arithmetic. It is a snapshot, not a window — subtracting equity from equity means nothing. That is why the balance sheet table carries no computed values.
Price to earnings, without estimating a share count
P/E = last close ÷ trailing twelve-month earnings per share
Earnings per share comes from the filing itself, for the ticker's own share class — PETR4 is preferred stock, so the divisor is the preferred EPS. The multiple therefore depends on no externally estimated share count.
The trap: There are two opposite dialects in CVM filings. Petrobras reports EPS on the share-class account and leaves the parent account at zero; Banco do Brasil does the reverse. Reading only one of them silently loses an entire sector, because zero is a valid number and four zeros summed raise no error.
When this site refuses to show a multiple
A company with twelve-month losses (a negative P/E says nothing); a reported EPS that does not reconcile with published net income — PINE3 filed 190,833, which would imply 2,742 shares in the entire company; and negative shareholders' equity, which takes down P/B, ROE and leverage at once, because dividing by negative equity flips the sign — a loss would read as record return.
The trap: The check is a cross-check, using data already here: twelve-month net income divided by EPS must yield a plausible share count for a listed company. Outside that range the page refuses — and prints the reason where the number would be. A blank cell with no explanation would be worse: readers take it for zero, or for a broken site.
Market cap, class by class
market cap = common shares × common price + preferred shares × preferred price
The share count comes from the capital stated in the company's FRE filing, broken down by class — never derived from earnings divided by EPS, which fails whenever classes carry different EPS. Since PETR3 and PETR4 close at different prices every day, the sum runs class by class, and both pages show the same market cap — the company's. P/B divides shareholders' equity by total shares: common and preferred therefore share one book value per share, and what differs between them is the price.
The trap: The FRE carries four capital types, and “authorized” is not issued stock — it is the charter ceiling, sometimes stated in currency: using it would shrink MGLU3's market cap 536-fold. The same file repeats the right type once per board approval, old ones still inside. The latest approval of paid-in capital wins; units stay out of the sum, being a bundle of the other classes rather than a class of their own. And the FRE is annual: the capital's reference date is printed on the page. One measured exception: a non-trading class holding up to 0.1% of capital stays out of the sum, with the count stated on the page — Vale carries 12 government golden shares, and refusing the largest miner's market cap over twelve shares would be hiding behind the rule.
EBITDA, debt, and the multiples built from them
EBITDA = operating result + depreciation and amortization (from the cash-flow statement)
D&A has no account of its own: it is an adjustment line in the cash-flow statement, freely named — and the DFC (cash-flow statement) only publishes year-to-date figures, never the quarter. The quarter is the difference between neighbouring accumulations; without the neighbour, that window's EBITDA does not exist and the page says so. Gross debt adds the two loan accounts on the balance sheet (current and long-term), net debt subtracts cash and equivalents, and EV adds net debt to market cap. Gross margin uses gross profit (account 3.03), the only income-statement code that is identical across all charts of accounts. The 5-year CAGR requires both endpoints published and positive — a rate that crosses a loss-making year is not a rate of anything.
The trap: In the banking chart of accounts, the codes where the common plan keeps loans carry SOMETHING ELSE — “Interbank Relations” and “Deposits”. So debt matches by code AND name: banks and insurers come out with no balance-sheet debt and no EV, reason stated, instead of a “debt” made of client deposits. And companies file D&A split across up to three lines (“Depreciation and Amortization” + “Right-of-use Depreciation”): only leaf lines are added, never a line that subtotals another.
Distributions: B3's registry, by share class and record date
12m yield = distributions per share with record date in the last 365 days ÷ current price
Dividends, interest on equity and REIT income come from B3's own public distributions registry — value per share with share class (ON, PN), approval date and record date. Yield is by record date, which belongs to whoever held the share that day, and by CLASS: PETR4's yield sums only PN distributions. Payout multiplies each class's distribution by its share count (from the FRE) and divides by twelve-month earnings — and only shows when the company runs plain ON and PN, because splitting with PNA/PNB or units in the mix would be guessing. For REITs the same registry carries R$ per share with reference month and payment date — which the monthly report does not publish.
The trap: Interest on equity is GROSS: 15% is withheld at source for individuals, so net yield is lower — stated next to the table. Old records come per thousand-share lot (the quotedPerShares field), and without the division historical yield would be a thousand times too high. And absence of a record does not become 0%: zero yield means “on record and paid nothing”; with no record at all, the page says so.
REITs: fundamentals come from the monthly report, bridged by ISIN
P/B = B3 price ÷ book value per share as filed
Net assets, book value per share, unitholders, yield and monthly return come from the monthly report each fund files with CVM — published as filed, with the reference month printed on the page. The bridge between the report's CNPJ and B3's ticker is the ISIN, published on both sides; short names stay out, having produced wrong matches before. P/B only shows when the report is under six months old: an old book value against today's price is a multiple that lies.
The trap: Until 2020 the CNPJ column was named CNPJ_Fundo; Resolution 175 renamed it CNPJ_Fundo_Classe — reading only the new name silently skips five years. The distribution in R$ per share is not in the report (only the percentage), and CVM publishes vacancy per property — a fund-level figure would need a weight the source does not provide, so neither is invented.
Consolidated before parent-only
A company with subsidiaries files both; the consolidated statement is the one describing the whole business. A company without subsidiaries files only parent-level accounts — and there, that is the correct figure, not a lesser substitute. The page states which one is on screen.
The filing estimate is measured habit
estimate = next period end + this company's historical median
How many days this company usually takes between quarter end and lodging the filing, measured across every filing it has made. The minimum and maximum sit alongside, because a median alone hides the spread.
The trap: It is not company guidance. The CVM publishes no forward calendar as open data — a “Corporate Events Calendar” category exists, but the expected date lives inside the document, not in a column. Aggregator calendars are guesses that slide: the same set of companies reappears pushed from one day to the next.
Twenty-six years of raw prices — and what that leaves unsaid
N-year return = current month close ÷ same-month close N years earlier − 1
Since 2026-09-02 the archive holds B3's COTAHIST from 2000 to date, cash market only (before the real there are three currencies in the way — a series crossing a redenomination is not a number). The high/low/change window became a true 52 weeks; 1/3/5/10-year returns come from monthly closes, and the long chart shows monthly closes since 2000. All RAW PRICE: no adjustment for distributions or corporate events — B3 does not publish the factor, and inferring it would be our number.
The trap: A return crossing a split or reverse split compares different share bases, and the page REFUSES any window containing one. The event is recognised by two signals: the price jump (a close moving outside 0.4×–2.5× overnight) and — since 4 September 2026 — the marker B3 itself writes on the file's own line, EB for bonus issues and splits, EG for reverse splits. The second signal exists because the first had a hole in the middle: a 2-for-1 split halves the price and a 3-for-2 divides it by 1.5, both INSIDE the accepted band, never flagged. BBAS3 published a “5-year return of −22.98%” when, accounting for its April 2024 split, the return is positive — the sign was wrong. 73 tickers were like that. Widening the band would not fix it: it would start calling every genuine 50% crash a corporate action. Reading the marker fixes it without inventing a number. What is still not caught: a large payout, which drops the price without changing the share base — the raw return of a heavy dividend payer understates total return. It is stated next to the numbers, and the chart dashes the jumps it found.
The window's label says what it measures
Since 2 September 2026 the closing series runs from 2000 to date, and the high/low/change window is a true 52 weeks. Before that the series began on 2 January 2026 — and this site called that “the window”, never “12 months” or “52 weeks”, because it was not. A label that promises more than the data holds is the easiest lie to publish; when the data grew, the label grew with it, not before.
The trap: The chart's vertical axis does not start at zero — on a price series that would flatten precisely the variation being read. The high and low are therefore written on the edge: a truncated axis with no visible scale is the easiest chart to lie with.
Real returns: both ends on the last CPI month
real = (close in Jul-26 ÷ close in Jul-16) ÷ Π(1 + monthly CPI) − 1
The 1, 3, 5 and 10-year returns come in two versions: nominal, to the last close, and real, net of Brazil's CPI (IPCA, central bank series 433). The real figure sits on the same card, with the date it runs to.
The trap: The CPI lags. A month's index is published around the 10th of the following month, while prices run to yesterday: in September 2026 prices ran to September and the CPI to July. Deflating today's return by July's index would use two months of inflation that do not exist yet. So the real return aligns both ends on the last CPI month — nominal and real cover windows that differ by a month or two, and the page says which is which instead of pretending they end together.
Yearly P/E and DY
P/E for a year = close of the fiscal year-end month ÷ that year's EPS DY for a year = payouts with ex-date in the year ÷ the same close
The per-year table carries each year's multiple since 2010, computed with that year's price — not today's. EPS and payouts are already per share, so neither needs a share count. The EPS scale check (net income ÷ EPS must yield a plausible share count) runs year by year, and a year that fails is refused with the reason.
The trap: The EPS dialect changes over time. The same company reports on the share-class account in some years and on the parent account in others — the choice has to be made per year, not once. Made once, from the trailing twelve months, Banco do Brasil came out with a P/E in 3 of 16 years, refusing 2010–2012 for a “loss”: the chosen account was zero in those years, and zero means “reported elsewhere”, never a loss. Made per year, 15 of 16 — and the refusals left are genuine losses, like Petrobras from 2014 to 2016. Three more refusals, all measured in the 4 September 2026 verification: the year the share was quoted per lot of a thousand (the EPS in that year's DFP may be per lot, and the source does not say — CBEE3 came out with a P/E of 0.01); a split within six months after the fiscal year-end (the DFP may carry the EPS already restated on the new base, while the year-end price stays on the old one — Santander showed a 2013 P/E of 0.19 with the EPS of its 2014 reverse split); and an EPS implying a share count incompatible with the registered capital, or departing more than 4× from both neighbouring years — Itaú filed its 2019 EPS in a scale that gave a P/E of 0.01 between 13.9 and 16.4. A P/E below 0.1 is not shown either: it is an extraordinary gain or a scale mix-up, and neither informs. The yearly DY refuses when a split falls inside the fiscal year: per-share payouts before and after do not add up.
Corn: one session's curve, from B3's settlement price
curve = settlement price of each corn (CCM) expiry in the same session US$/bag = settlement ÷ central bank PTAX (sell) of the same day
The curve uses the settlement price — the reference B3 computes at the close — not the last trade. Each expiry carries the sessions left to settlement, the day's trades and the open interest. Only the latest session is published: a per-contract history, ready to download, would be redistributing B3's data. The dollar is the central bank's PTAX sell rate (series 1) for the same day; the contract is in reais, and the conversion is for reading only.
The trap: A settlement price is not a trade. In 2026, 305 of 1,558 corn contract-days had a settlement with no trade at all — a price set by B3 (measured on 16 September 2026); the chart draws that point hollow. And the open interest carried in a day's settlement file is the previous day's close (checked in 135 of 135 cases): the table says so instead of mixing dates silently.
Carry: what the market pays to carry, against what interest costs
spread = settlement of the longer expiry − settlement of the shorter carry p.a. = (longer ÷ shorter)^(252 ÷ sessions in the leg) − 1 interest = shorter settlement × (DI factor over the leg − 1) left over = spread − interest
A leg runs from one expiry to the next. Interest comes from the same session's DI1 curve, interpolated flat-forward — the DI market convention — and the annualised carry uses the same 252-business-day base, so both fit in one column. What is left over has to pay for storage, insurance and shrink, which have no market source: the reader types that cost in.
The trap: Negative carry is not a negative cost. When the longer expiry is cheaper than the shorter one — on 15 September 2026, from March to September 2027 — it is the new crop coming into the price, and that leg's left-over is not a storage discount. Near settlement the short leg decouples: from 10 sessions out the correlation between legs gives way, reaching 0.53 on the last session (77 settled contracts, 2014–2026); the leg is flagged, and there the pair stops being a hedge. Business days follow B3's session calendar, closed on 24 and 31 December — days the DI counts as business days: up to two days a year of difference in the interest period.
What is not here yet
Listed with the same care as what is. A ratio needing absent data is neither estimated nor approximated — it simply does not appear, and the reason is written down.
- P/B for earlier years — yearly P/E and DY are in the per-year table, because EPS and payouts are already per share. P/B would need that year's share count — and the registration filing stores the latest approval's count under the reference date. A 2019 P/B would come out with today's capital
- Prices adjusted for dividends and share consolidations — B3 does not publish the adjustment factor, and inferring it would make the number ours. This site shows the raw series, says it is raw, cuts the 52-week window at the event and refuses any multi-year return crossing it — rather than pretending it did not happen
- REIT vacancy — the CVM publishes it per property, and rolling it up per fund would need a weighting the source does not give
- Agribusiness fund fundamentals after 2025 — the CVM moved the agribusiness funds' monthly report to a dataset of its own (Annex VI of Resolution 175), which the archive does not load yet. A listed quota with a report shows the last one from the old dataset, dated, and refuses the P/B on age — rather than pretending the fund stopped reporting. Infrastructure funds were never in that regime, and the page says so
- Fundamentals for funds whose ISIN appears in two registrations — the ISIN field in the CVM registry is typed by the fund, and seven tickers trade an ISIN that two funds declare at the same time (XPML11 among them). Choosing by name would be a guess — the page shows the quote and says why the fundamentals are not there. A hand-verified link, when there is one, comes in through the archive
- Corn cash prices and local basis — basis is the local cash price minus the future, and local cash prices are not in this house yet. A basis computed against a price the page does not show would be a number without provenance on screen
- Corn export parity — it needs Chicago by expiry, the port premium and freight — none of the three is in the archive with the coverage the calculation requires
- Corn curve history — the page shows one session at a time; the per-contract settlement series is not published for download