← Back to home PT
Metodologia aberta

FIIs — Brazilian real-estate funds (P/BV and Dividend Yield)

FIIs — Brazilian real-estate funds (P/BV and Dividend Yield)

This is Dados B3's second vertical. A REIT (FII) is not a listed company: it has no DFP, no ROIC, none of the CVM chart of accounts the rest of the database uses. It has a disclosure regime of its own — the monthly report (informe) — and therefore its own pipeline and its own invariants. The house rules do not change: methodology before the number, point-in-time with no leakage of future information, and a flag instead of an estimate.

Sources (all primary and public)

  • FII monthly report (informe) (CVM, Instrução 472)dados.cvm.gov.br/dados/FII/DOC/INF_MENSAL. Structured, free, one zip per year since 2016. It carries, per fund and per reference month: shareholders' equity, number of shares, net asset value per share, number of shareholders, business segment, ISIN and — the field that anchors point-in-time — the delivery date (when the report became public).
  • COTAHIST (B3) — the same end-of-day file used for stocks. The layout carries the trading ticker and the ISIN of the share; it is the ISIN that links the ticker to the fund.
  • Distributions paid (B3, GetListedSupplementFunds) — the only datum outside CVM, used only for the dividend yield. Best-effort: if B3 is down, the DY stays as it was; the rest of the build does not stop.

Ticker ↔ fund: by ISIN, never by name

The report (informe) identifies the fund by CNPJ and ISIN, not by ticker. COTAHIST carries ticker and ISIN together. We cross the two by ISIN: an FII, for this database, is a fund from the report whose ISIN shows up traded in COTAHIST. That solves the ticker with no hand-maintained list and, as a bonus, separates FIIs from company UNITs (KLBN11, TAEE11, SANB11 end in 11 but carry a company ISIN, absent from the FII report).

P/BV — point-in-time

P/BV (price to book value per share) is the number-one metric for an FII: share price divided by net asset value per share.

P/BV = share price ÷ net asset value per share (NAV per share)
  • NAV per share comes ready-made from the report (field Valor_Patrimonial_Cotas, the reported net asset value per share).
  • The price is that of the first trading session on or after the report's delivery date — never the price at the end of the reference month. January's balance sheet only becomes public when the report is filed (generally in February); matching the price of 31/01 with it would give P/BV information the market did not yet have. It is the same no look-ahead rule as the equities block.

The invariant that validates NAV per share

The reported NAV per share must equal shareholders' equity ÷ number of shares from the same report. That is the second internal source that checks the number. When it does not reconcile (within 1%), the source data is dirty — a scale or decimal-place error in the number of shares or in NAV per share, which happens in small and recently listed funds. In those cases the published P/BV carries the flag vp_cota_diverge_pl_cotas: we keep CVM's official number, but we say that it does not reconcile with the report's own accounting. No divergence goes unspoken.

Dividend Yield — 12 months, current

DY 12m = sum of distributions per share over the last 12 months ÷ share price
  • We sum only RENDIMENTO (the monthly distribution, income-tax exempt for individuals). Amortização (amortization) of a share is a return of capital, not yield, and is left out.
  • The source is B3 (distributions actually paid), not the report. Why not the report? The report has a Percentual_Dividend_Yield_Mes field (the month's dividend yield percentage), but at the source it is inconsistent — median zero, negative cases and cases above 100%. We keep the raw value for auditing (dy_mes_informe) and do not use it.
  • DY is a current snapshot, not a historical series: B3 only delivers recent distributions (~12 months). P/BV, on the other hand, is historical and point-in-time. The asymmetry is declared on purpose — it is honest about what each source gives.
  • A distribution above 30% per year gets the flag dy_extremo: it is almost always an extraordinary distribution (sale of a property, amortization classified as a distribution), not a recurring yield.

Vacancy (brick-and-mortar funds only)

Vacancy measures how much of the fund's area is unoccupied — the health metric of a brick-and-mortar fund (logistics, malls, office floors). It comes from CVM's quarterly report (informe) (inf_trimestral_fii_imovel), which reports, per property, the vacancy percentage, the delinquency and the area.

fund vacancy = Σ(property vacancy × area) ÷ Σ(area)
  • Area-weighted average (vacant m² over total m²), not a simple average: a 130 thousand m² warehouse weighs more than a 500 m² office floor.
  • Point-in-time by the quarterly report's delivery date, like everything else.
  • Only brick-and-mortar funds have it. A paper (CRI receivables) fund owns no property and therefore has no vacancy — an honest absence, just as a bank has no ROIC.

The CVM field has inconsistent semantics — and we flag it

This is the point that separates auditable data from a crooked number. The Percentual_Vacancia field (the property's vacancy percentage) does not have a uniform meaning across administrators: some report the actual vacancy fraction (0.124 = 12.4%); others mark 0 or 1 — apparently occupancy, not vacancy (XP Malls marks 1 for a packed mall). Adding that up blindly would publish "91% vacancy" for a full mall. So:

  • A fund-quarter whose vacancy is dominated by a property at ~100% gets the flag vacancia_suspeita (likely inverted semantics at the source).
  • Aggregate vacancy ≥ 70% gets vacancia_extrema — an income property operating at 70%+ vacancy is either a dead fund or a reporting error (the value 0,909179 identical for four consecutive quarters gives away a static field, not real vacancy).
  • A flagged number does not enter the segment medians or the ranking; it appears on the fund's page with the flag, never clean. Moderate, real distress (a building at 55%) stays clean — that is signal, not noise.
  • Delinquency is secondary; the source sometimes carries a negative value (reversal/error): outside [0,1] it becomes null, it is never estimated.

Cap rate is NOT included. Cap rate = net operating income ÷ market value of the property. The report does not carry those two in structured form; building it would require estimating the NOI and the market value — a guess. It is left out, declared, like any number we do not have the source to support.

An FII distribution is a CASH distribution, not accounting profit. An FII is required to distribute at least 95% of its semiannual cash result; the monthly distribution comes out of rent and interest received, not out of an accrual-basis profit. That is why an FII's DY and a stock's dividend yield, although they share the same formula, measure different things — do not compare them side by side without that caveat.

Segment

We use the business segment declared by the fund itself in the report (Logistics, Malls, Offices, Residential, Hospital, Hotel, Educational, Retail, Multi-category, Other). We do not build our own taxonomy: these are CVM's official values, used as they are, so the ranking compares a fund against peers in the same segment.

What is NOT here (honest absence)

  • Cap rate — would require NOI and the property's market value, which the report does not carry in structured form; it is not estimated. (Vacancy, on the other hand, is already there — see above.)
  • Historical DY — B3's distributions source does not deliver a long history; publishing a series would be inventing what we do not have.
  • A paper (CRI receivables) fund has neither vacancy nor cap rate — just as a bank has no ROIC. The absence belongs to the nature of the asset, it is not a coverage failure.
  • Partial coverage — a recently listed fund, one with no trading, or one with no response from B3 for distributions enters the registry but may end up without P/BV or without DY. The limitation is recorded in the flags, never hidden.

Flags on FII numbers

Flag Meaning
vp_cota_diverge_pl_cotas NAV per share in the report does not reconcile with shareholders' equity ÷ shares (>1%) — source data suspect
vp_cota_nao_positivo NAV per share missing or ≤ 0 in the report — no P/BV
sem_data_entrega Report with no publication date — no point-in-time anchor
sem_preco_apos_publicacao No trading session for the share on or after the delivery date
pvp_fora_da_faixa P/BV outside [0.2 ; 5.0] — worth a look, likely a corporate event
preco_defasado 1st trading session >30 days after publication (illiquid share) — NAV and price from different regimes
dy_extremo DY 12m > 30% per year — likely an extraordinary distribution
parcial_N_meses DY summed only N (< ~12) distributions — partial coverage of 12 months
sem_preco No price available to compute the DY
vacancia_suspeita Vacancy dominated by a property at ~100% — likely inverted semantics at the source
vacancia_extrema Aggregate vacancy ≥ 70% — dead fund or reporting error
vacancia_sem_area No property with an area — vacancy by simple average, less reliable

This service publishes data and methodology; this is not investment advice.