Comprar cotas de fundos de investimento imobiliário (FIIs) é uma das formas de se expor ao mercado imobiliário, sem necessariamente ter que despender volumosas quantias de dinheiro para a compra de um imóvel. Há basicamente dois tipos de fundos: de tijolo e de papel.
Fundos de papel investem em ativos financeiros do mercado imobiliário ou em cotas de outros fundos (fundo de fundos). Fundos de tijolo investem em imóveis reais e ganham com a venda ou o aluguel destes imóveis. Muitos FIIs são negociados em bolsa.
Nos fundos de tijolo, o investidor pode ganhar em duas frentes: 1) recebendo uma quantia mensal a título de renda, proveniente do aluguel dos imóveis; 2) por meio da valorização da cota do fundo em bolsa. No primeiro caso, há isenção de imposto de renda. No segundo, os ganhos são tributados mediante uma alíquota de 20%. Fundos de tijolo atuam normalmente nos seguintes segmentos: shopping centers; lajes corporativas; galpões industriais (também chamados de fundos logísticos); hoteis; escolas; hospitais; agências bancárias; residenciais; e outros. Nos FIIs de papel, o investidor ganha com o pagamento de juros, não havendo valorização do principal.
Dito isto, o objetivo deste post é mostrar como o software R pode ser utilizado para selecionar fundos imobiliários para investimento.
O site Fundamentus apresenta uma tabela com todos os FIIs que são negociados em bolsa. Faremos a “raspagem” dessa tabela e, a partir dela, aplicaremos alguns filtros para a seleção de fundos.
# instalar (se necessário) e carregar o pacote "pacman"
if (!require("pacman"))
install.packages("pacman")
# instalar (se necessário) e carregar os pacotes que serão utilizados
p_load(rvest, tidyverse, janitor, knitr, kableExtra, XML, here, scales)
# armazenar a página da web
url <- "http://www.fundamentus.com.br/fii_resultado.php"
# importar a tabela de dados
table_raw <- read_html(url) %>%
html_table(fill = TRUE) %>%
enframe() %>%
unnest(cols = c(value)) %>%
clean_names() %>%
mutate(across(cotacao:vacancia_media, ~ str_remove_all(., "\\."))) %>%
mutate(across(c(
ends_with("yield"), cap_rate:vacancia_media
),
~ str_remove(., "%"))) %>%
mutate(across(cotacao:vacancia_media, ~ str_replace(., ",", "."))) %>%
mutate(across(cotacao:vacancia_media, as.numeric)) %>%
mutate(across(c(
ends_with("yield"), cap_rate:vacancia_media
), ~ .x / 100))
# organizar a tabela de dados para apresentação
table_tidy <- table_raw %>%
select(papel:segmento,
ffo_yield:p_vp,
liquidez:qtd_de_imoveis,
cap_rate:vacancia_media) %>%
rename('Papel' = papel,
'Segmento' = segmento,
'FFO Yield' = ffo_yield,
'Dividend Yield' = dividend_yield,
'P/VP' = p_vp,
'Liquidez' = liquidez,
'Nº Imóveis' = qtd_de_imoveis,
'CAP Rate' = cap_rate,
'Vacância Média' = vacancia_media)
# mostrar as primeiras 10 linhas da tabela
kable(head(table_tidy, n = 10)) %>%
kable_styling("striped", "bordered")
Papel | Segmento | FFO Yield | Dividend Yield | P/VP | Liquidez | Nº Imóveis | CAP Rate | Vacância Média |
---|---|---|---|---|---|---|---|---|
ABCP11 | Shoppings | 0.0697 | 0.0696 | 0.80 | 105951 | 1 | 0.0813 | 0.0750 |
AEFI11 | Outros | 0.0697 | 0.0000 | 1.24 | 0 | 6 | 0.0740 | 0.0000 |
AFCR11 | Híbrido | 0.1316 | 0.0995 | 1.01 | 0 | 0 | 0.0000 | 0.0000 |
AFHI11 | Títulos e Val. Mob. | 0.0619 | 0.1116 | 1.04 | 876449 | 0 | 0.0000 | 0.0000 |
AFOF11 | Títulos e Val. Mob. | 0.0514 | 0.1089 | 0.90 | 98202 | 0 | 0.0000 | 0.0000 |
AGCX11 | Outros | 0.0069 | 0.0000 | 11.99 | 0 | 83 | 0.0098 | 0.0049 |
AIEC11 | Lajes Corporativas | 0.0981 | 0.0982 | 0.77 | 813342 | 2 | 0.1036 | 0.0000 |
ALMI11 | Lajes Corporativas | -0.0002 | 0.0000 | 0.40 | 46700 | 1 | 0.0621 | 0.6405 |
ALZR11 | Híbrido | 0.0593 | 0.0714 | 1.03 | 1065960 | 13 | 0.0686 | 0.0000 |
ANCR11B | Shoppings | 0.0738 | 0.0475 | 1.03 | 0 | 3 | 0.1045 | 0.0000 |
Temos o banco de dados, mas qual o significado de todas essas variáveis?
Dividend Yield (DY - rendimento de dividendo) mostra a relação entre os rendimentos distribuídos e o preço atual da cota de um fundo de investimento imobiliário. Sua fórmula de cálculo é:
\[ DY = \frac {\text{Total dos rendimentos distribuídos}}{\text{Valor de mercado do fundo}} \]
FFO Yield mede a relação entre os rendimentos distribuídos e o fluxo de caixa proveniente das operações. Sua fórmula de cálculo é:
\[ FFO \space Yield = \frac {\text{Total dos rendimentos distribuídos}}{\text{Lucro Líquido} \space + \text{Depreciação} \space + \text{Amortização} \space- \text{Ganhos na venda de imóveis}} \]
Preço/Valor Patrimonial da Cota (P/VP) mede a relação entre a cotação do fundo em bolsa e seu patrimônio líquido. Valores acima de 1 significam que o mercado está pagando pelo fundo mais do que seu patrimônio líquido. Quando as expectativas são positivas sobre o fundo, este indicador se aprecia.
Capitalization Rate (Cap Rate) mede a relação entre os rendimentos distribuídos e o valor de seus ativos. Sua fórmula de cálculo, portanto, é:
\[ Cape \space Rate = \frac {\text{Total dos rendimentos distribuídos}}{\text{Ativo total}} \]
A vacância média mede a razão entre a quantidade de imóveis não ocupados e a quantidade total de imóveis que compõem a carteira do fundo, ou seja, a porcentagem de imóveis não alugados. Por fim, liquidez representa o volume financeiro negociado em bolsa do fundo imobiliário.
Vejamos quantos fundos compõem a tabela.
# contar número de linhas
nrow(table_raw)
## [1] 323
Sao 323 fundos. Quantos fundos em cada segmento?
# contagem de fundos por segmento
kable(
table_raw %>%
group_by(segmento) %>%
count() %>%
arrange(desc(n)) %>%
rename(Segmento = segmento,
Quantidade = n)
) %>%
kable_styling("striped", "bordered")
Segmento | Quantidade |
---|---|
Títulos e Val. Mob. | 97 |
Híbrido | 65 |
Lajes Corporativas | 48 |
Outros | 33 |
Shoppings | 25 |
Logística | 21 |
Residencial | 16 |
13 | |
Hospital | 3 |
Hotel | 2 |
A maior quantidade de fundos são os de papel. Fundos híbridos são, ao mesmo tempo, de tijolo e de papel. 13 fundos não foram agrupados em nenhum segmento pelo site Fundamentus.
Isto posto, que método poderemos utilizar para selecionar algum ou alguns fundos para candidatos em potencial a compor a nossa carteira de investimentos?
Agruparemos os fundos por segmento, para comparar fundos semelhantes entre si. Queremos fundos com elevados FFO Yield, Dividend Yield e Cap Ratio (ou seja, altos rendimentos sobre o fluxo de caixa, o valor de mercado e os ativos). Também queremos fundos com uma maior quantidade de imóveis, o que implica num impacto menor sobre a renda em caso de vacância. Selecionaremos fundos que apresentam valores acima do terceiro quartil nestas métricas. Ao mesmo tempo, queremos fundos que não apresentam vacância elevada, bem como cujas expectativas sobre o fundo não sejam tão elevadas (menor Preço/Valor Patrimonial). Assim, queremos fundos que se encontram abaixo do terceiro quartil em ambos os indicadores.
# aplicar filtros para selecionar potenciais investimentos
outcome_raw <- table_raw %>%
group_by(segmento) %>%
filter(ffo_yield > quantile(ffo_yield, .75),
dividend_yield > quantile(dividend_yield, .75),
qtd_de_imoveis > quantile(qtd_de_imoveis, .75),
cap_rate > quantile(cap_rate, .75),
p_vp < quantile(p_vp, .75),
vacancia_media < quantile(vacancia_media, .75))
# organizar os resultados
outcome_tidy <- outcome_raw %>%
select(papel:segmento,
ffo_yield:p_vp,
liquidez:qtd_de_imoveis,
cap_rate:vacancia_media) %>%
rename('Papel' = papel,
'Segmento' = segmento,
'FFO Yield' = ffo_yield,
'Dividend Yield' = dividend_yield,
'P/VP' = p_vp,
'Liquidez' = liquidez,
'Nº Imóveis' = qtd_de_imoveis,
'CAP Rate' = cap_rate,
'Vacância Média' = vacancia_media)
# apresentar os resultados
kable(head(outcome_tidy)) %>%
kable_styling("striped", "bordered")
Papel | Segmento | FFO Yield | Dividend Yield | P/VP | Liquidez | Nº Imóveis | CAP Rate | Vacância Média |
---|---|---|---|---|---|---|---|---|
BBPO11 | Lajes Corporativas | 0.1318 | 0.1312 | 0.90 | 1356700 | 63 | 0.1567 | 0 |
RZTR11 | Híbrido | 0.1137 | 0.1108 | 1.03 | 3947070 | 15 | 0.1304 | 0 |
No momento em que rodo essa análise, dois fundos obtiveram resultado positivo em nossos filtros: BBPO11 e RZTR11. Selecionaremos aleatoriamente o segundo para uma análise mais aprofundada. Ele se chama Riza Terrax (RZTR11) e se trata de um fundo híbrido. Atualmente ele proporciona renda anual de 11,07%, possui 15 propriedades e não apresenta vacância. Mas não podemos basear uma decisão tão importante como essa em uma simples análise numérica. Precisamos verificar outras informações e, neste momento, os dados disponibilizados pela Comissão de Valores Mobiliários poderão nos ser úteis.
Os arquivos da CVM sobre fundos imobiliários encontram-se em diretórios. Começaremos pelo diretório de nome “informação mensal”. Dentro dele, procuraremos pelos arquivos chamados “complemento”. Os arquivos da CVM são disponibilizados em formato compactado. Nós faremos o download dos arquivos compactados em um diretório de trabalho temporário. Em seguida, descompactaremos estes arquivos no mesmo diretório; e, por fim, o leremos para dentro do ambiente do R.
# armazenar o diretório temporário em um objeto do R
td <- tempdir()
# armazenar a webpage onde se encontram os arquivos
root <- 'http://dados.cvm.gov.br/dados/FII/DOC/INF_MENSAL/DADOS/'
# ler a página
doc <- htmlParse(root)
# obter o nome dos arquivos compactados
fnames <- xpathSApply(doc, '//a[@href]', xmlValue)
fnames <- grep('zip$', fnames, value = T)
# armazenar o endereço dos arquivos compactados
paths <- paste0(root, fnames)
# fazer o download de todos os arquivos compactados
mapply(download.file, url = paths, destfile = here(td, fnames))
# selecionar os arquivos compactados no diretório temporário do R
zipped <- list.files(td, pattern = ".zip", full.names = TRUE)
# descompactar os arquivos
plyr::ldply(.data = zipped, .fun = unzip, exdir = td)
# ler o banco de dados "complemento"
complemento_raw <-
list.files(td, full.names = TRUE, pattern = ".*complemento") %>%
map_df(~read_csv2(.x,
col_types = cols(.default = "c"),
locale = locale(encoding = "Latin1")))
Agora que temos o banco de dados, vamos organizá-lo e, enquanto isso, selecionamos apenas o fundo que queremos investigar melhor e as variáveis que usaremos. O CNPJ do fundo é 36.501.128/0001-86.
# organizar o banco de dados
complemento <- complemento_raw %>%
clean_names() %>%
filter(cnpj_fundo == "36.501.128/0001-86") %>%
select(data = data_referencia,
cnpj = cnpj_fundo,
ativo = valor_ativo,
patrimonio = patrimonio_liquido,
valor_patrim_cota = valor_patrimonial_cotas,
dividend_yield = percentual_dividend_yield_mes) %>%
mutate(data = as.Date(data)) %>%
mutate(across(ativo:dividend_yield, as.numeric))
# apresentar o banco de dados
kable(head(complemento)) %>%
kable_styling("striped", "bordered")
data | cnpj | ativo | patrimonio | valor_patrim_cota | dividend_yield |
---|---|---|---|---|---|
2020-10-01 | 36.501.128/0001-86 | 475110450 | 474661649 | 96.92258 | 0.000000 |
2020-11-01 | 36.501.128/0001-86 | 544267457 | 466705559 | 95.29800 | 0.000000 |
2020-12-01 | 36.501.128/0001-86 | 495792659 | 474380422 | 96.86515 | 0.000000 |
2021-01-01 | 36.501.128/0001-86 | 483935109 | 477482443 | 96.86515 | 0.008259 |
2021-02-01 | 36.501.128/0001-86 | 480077819 | 473429102 | 96.67090 | 0.008718 |
2021-03-01 | 36.501.128/0001-86 | 475733595 | 469216242 | 96.67090 | 0.008275 |
Agora vamos tirar proveito do nosso banco, por meio de visualizações das séries temporais:
# plotar ativo e patrimônio líquido
complemento %>%
select(data, ativo, patrimonio) %>%
pivot_longer(-data) %>%
mutate(value = value / 1000000,
name = recode(name,
ativo = "Ativo",
patrimonio = "Patrimônio Líquido")) %>%
ggplot(aes(x = data, y = value)) +
facet_wrap(~name) +
geom_col(fill = "royalblue4") +
scale_x_date(date_labels = "%b/%y") +
scale_y_continuous(labels = comma_format(
big.mark = ".",
decimal.mark = ",")) +
labs(x = "Data",
y = "R$ (milhões)",
title = "Fundo imobiliário Riza Terrax - Patrimônio Líquido")
O fundo teve início em out/2020 e, em abr/21, houve grande crescimento do ativo e do patrimônio líquido.
# plotar valor patrimonial da cota
complemento %>%
select(data, valor_patrim_cota) %>%
ggplot(aes(x = data, y = valor_patrim_cota)) +
geom_line(color = "royalblue4") +
geom_point(color = "royalblue4") +
scale_x_date(date_labels = "%b/%y") +
labs(x = "Data",
y = "Valor Patrimonial da Cota",
title = "Fundo imobiliário Riza Terrax - valor patrimonial da cota")
O valor patrimonial da cota variou entre 95 (nov/20) e 101 (dez/21), aproximadamente. Atualmente, está próximo de 99.
# plotar dividend yield
complemento %>%
ggplot(aes(x = data, y = dividend_yield)) +
geom_line(color = "royalblue4") +
geom_point(color = "royalblue4") +
scale_x_date(date_labels = "%b/%y") +
scale_y_continuous(labels = label_percent(accuracy = .1)) +
labs(x = "Data",
y = "Dividend Yield",
title = "Fundo imobiliário Riza Terrax - Dividend Yield")
O dividend yield está muito próximo da máxima, que é justamente o que o torna tão interessante. Detalhe, no patamar atual, a renda que ele proporciona é superior ao CDI, que está em 0,93% ao mês.
Vamos agora para um segundo diretório do sítio da CVM, chamado de informação anual. Para ler os dados no R, faremos o mesmo procedimento que fizemos com as informações mensais. Há 13 bancos de dados em cada arquivo compactado. Olharemos primeiro para o banco de nome “ativo adquirido”.
# armazenar a webpage onde se encontram os arquivos
root <- 'http://dados.cvm.gov.br/dados/FII/DOC/INF_ANUAL/DADOS/'
# ler a página
doc <- htmlParse(root)
# obter o nome dos arquivos compactados
fnames <- xpathSApply(doc, '//a[@href]', xmlValue)
fnames <- grep('zip$', fnames, value = T)
# armazenar o endereço dos arquivos compactados
paths <- paste0(root, fnames)
# download all zipped files
mapply(download.file, url = paths, destfile = here(td, fnames))
# select zipped files
zipped <- list.files(td, pattern = ".zip", full.names = TRUE)
# fazer o download de todos os arquivos compactados
map(zipped, unzip, exdir = td)
# ler o banco de dados "ativo adquirido"
adquirido_raw <-
list.files(td, full.names = TRUE, pattern = ".*adquirido") %>%
map_df(~read_csv2(.x,
col_types = cols(.default = "c"),
locale = locale(encoding = "Latin1")))
# organizar o banco de dados "ativo adquirido"
adquirido <- adquirido_raw %>%
clean_names() %>%
rename(cnpj = cnpj_fundo,
data = data_referencia,
ativo = nome_ativo) %>%
filter(cnpj == "36.501.128/0001-86") %>%
select(data, ativo, objetivos)
# apresentar o banco de dados
kable(adquirido) %>%
kable_styling("striped", "bordered")
data | ativo | objetivos |
---|---|---|
2021-06-01 | IMÓVEL - Fazenda Bonito - GO | AQUISIÇÃO DE ATIVOS IMOBILIÁRIOS CONFORME POLÍTICA DE INVESTIMENTOS |
2021-06-01 | IMÓVEL - Fazenda Santa Clara - PI | AQUISIÇÃO DE ATIVOS IMOBILIÁRIOS CONFORME POLÍTICA DE INVESTIMENTOS |
2021-06-01 | IMÓVEL - Fazenda Vale do Rio Celeste - MT | AQUISIÇÃO DE ATIVOS IMOBILIÁRIOS CONFORME POLÍTICA DE INVESTIMENTOS |
2021-06-01 | IMÓVEL - Fazenda Poranga II - MT | AQUISIÇÃO DE ATIVOS IMOBILIÁRIOS CONFORME POLÍTICA DE INVESTIMENTOS |
2021-06-01 | IMÓVEL - Fazenda São Martinho 1 - MT | AQUISIÇÃO DE ATIVOS IMOBILIÁRIOS CONFORME POLÍTICA DE INVESTIMENTOS |
2021-06-01 | IMÓVEL - Fazenda São Martinho 2 - MT | AQUISIÇÃO DE ATIVOS IMOBILIÁRIOS CONFORME POLÍTICA DE INVESTIMENTOS |
2021-06-01 | IMÓVEL - Fazenda São Paulo - GO | AQUISIÇÃO DE ATIVOS IMOBILIÁRIOS CONFORME POLÍTICA DE INVESTIMENTOS |
2021-06-01 | IMÓVEL - Fazenda Buriti - MT | AQUISIÇÃO DE ATIVOS IMOBILIÁRIOS CONFORME POLÍTICA DE INVESTIMENTOS |
2021-06-01 | IMÓVEL - Fazenda Ponte de Pedras - GO | AQUISIÇÃO DE ATIVOS IMOBILIÁRIOS CONFORME POLÍTICA DE INVESTIMENTOS |
2021-06-01 | IMÓVEL - Fazenda São Francisco - MA | AQUISIÇÃO DE ATIVOS IMOBILIÁRIOS CONFORME POLÍTICA DE INVESTIMENTOS |
2021-06-01 | IMÓVEL - Fazenda São Tomaz Cachoeirinha - GO | AQUISIÇÃO DE ATIVOS IMOBILIÁRIOS CONFORME POLÍTICA DE INVESTIMENTOS |
2021-06-01 | IMÓVEL - Fazenda Sto Antônio do Ouro - BA | AQUISIÇÃO DE ATIVOS IMOBILIÁRIOS CONFORME POLÍTICA DE INVESTIMENTOS |
Recapitulando, segundo o sítio Fundamentus, o fundo Riza Terrax possui 15 “imóveis”. Destes, 12 foram adquiridos em junho/2021, segundo a CVM. Trata-se de fazendas nos Estados do Mato Grosso, Goiás, Piauí e Bahia. Ou seja, o desempenho do fundo está muito ligado ao agronegócio brasileiro, que neste momento passa por um momento muito favorável, mas que não deixa de ser um setor de muito instável. O fato de o fundo possuir apenas 15 ativos também é um risco, pois a vacância em um deles pode impactar agudamente a distribuição de rendimentos.
Agora vamos para o banco de dados de nome “complemento”. Nele, veremos como a administração avalia seus resultados e a conjuntura do agronegócio.
# ler o banco de dados complemento
complemento_raw <-
list.files(td, full.names = TRUE, pattern = ".*complemento") %>%
map_df(~read_csv2(.x,
col_types = cols(.default = "c"),
locale = locale(encoding = "Latin1")))
# apresentar "valores" das variáveis selecionadas
complemento_raw %>%
clean_names() %>%
filter(cnpj_fundo == "36.501.128/0001-86") %>%
select(data = data_referencia,
resultado_exercicio_findo,
conjuntura_economica_periodo_findo,
perspectiva_periodo_seguinte) %>%
drop_na() %>%
kable() %>%
kable_styling("striped", "bordered")
data | resultado_exercicio_findo | conjuntura_economica_periodo_findo | perspectiva_periodo_seguinte |
---|---|---|---|
2021-06-01 | O fundo obteve resultado patrimonial no exercício de 2021 aproximadamente R$ 51 MM, impactado principalmente pelo rendimento auferido com investimento em Certificados de Recebíveis Imobiliáios. O total da distribuição no exercício foi de R$ 37 MM, considerando seu resultado caixa. | O atraso das chuvas em grande parte das áreas, fez com que o plantio da soja fosse postergado para o mês de novembro na região centro-oeste. Em alguns casos, tais condições levaram ao replantio das áreas dada falta de umidade no solo. O atraso do plantio, em geral, não afetou a primeira safra de soja, mas sim a safrinha ou segunda safra, tradicionais nos estados de GO e MT (responsável por grande parte do volume de milho produzido no país). Na região do MATOPIBA, as chuvas foram acima da média histórica e propiciaram o início do plantio da soja dentro da janela ideal e em ótimas condições, o que propiciou uma excelente safra para toda a região.O sul do país sofreu com o atraso no plantio devido à falta de chuva causada pelo efeito do fenômeno La Niña. Houve perdas expressivas na safra de milho e altas taxas de replantio para a soja, onerando a margem de lucro do agricultor nesta região. A valorização das commodities agrícolas nos mercados internacionais, potencializada no mercado brasileiro pela alta do dólar e a forte demanda dos países importadores trouxeram entusiasmo e confiança ao produtor rural. O lucro realizado na safra 2020/21 foi acima da média histórica, o que destravou os investimentos no campo e aqueceram o mercado imobiliário de terras. Essa classe de ativos se valorizou consideravelmente em todas as regiões do país. | A perspectiva para o agronegócio brasileiro segue bastante positiva. As previsões climáticas até o momento mostram que devemos ter um ano dentro da normalidade para as principais regiões produtoras. Os preços das commodities agrícolas seguem bastante elevados, o que deverá proporcionar uma safra com elevada rentabilidade para os produtores rurais que estão arrendando as terras do fundo. |
Notem bem o texto: “O lucro realizado na safra 2020/21 foi acima da média histórica”. É importante ter isso em mente, pois os bons resultados recentes não necessariamente se repetirão. Também deve ter ficado claro na leitura que o resultado do fundo é muito dependente das condições climáticas - que são cada vez mais imprevisíveis dado o fenômeno do aquecimento global - e do dólar. Ou seja, risco é o que não falta para o desempenho do fundo.
Ainda há um terceiro diretório a ser explorado no sítio da CVM, chamado “informe trimestral”. Contudo, já fizemos o bastante até aqui, e o objetivo do post não é tomar decisão sobre determinado investimento, mas ensinar o leitor sobre como pode fazê-lo por conta própria (inclusive, aplicando filtros totalmente diferentes dos que foram aplicados aqui).