Listar FIIs como um supermercado
Já se imaginou dentro de um supermercado de FIIs?
Página ainda em construção. Ainda não divulgada. 🚧👷🛠🚧
Passeando pelos corredores do setor de Logística, há nas prataleiras:
- FII A com 5,0% Dividend Yield e 20% do caixa disponível e;
- FII B com 6,0% Dividend Yield e 1% do caixa disponível.
Perceba que ao analisar a embalagem você facilmente pode mudar de opinião de qual produto levar para casa.
Aqui neste post do blog I’m GK! eu ajudarei você a fazer uma lista completa de todos os FIIs negociáveis na Bovespa, e quem escolhe as informações da embalagem é você!
Introdução
Eu lembro que após terminada a leitura do livro do Marcelo Fayh sobre FIIs eu pensei: certo, agora como vou achá-los? A principal vantagem de quando elaborei a tabela pela primeira vez foi ter em mãos a lista de todos os FIIs negociáveis, porque eu pensava: procurando no YouTube ou em sites especializados eu sei da existência FII A, B, C - mas serão todos? Eu quero saber de todos!
E se existir um FII que estivesse fazendo uma diferença para você, mas você não está vendo-o?
Mas com o motor do R
para nos auxiliar, não nos contentaremos somente com a lista de todos os FIIs negociáveis. Vamos para os indicadores deles também! Vamos montar nosso supermercado de FIIs! Veja abaixo:
Você pode visualizar a tabela completa aqui.
Embalagem dos FIIs
No nosso supermercado de FIIs somos nós que escolhemos as embalagens! Escolheremos os indicadores abaixo:
- Ticker
- Nome
- Setor
- Administrador
- Cotação
- MM200Delta1
- Volume médio diário (em milhões)
- Dividend Yield
- P/VP
- Valor em caixa
- Payback (anos)
MM200Delta: medir o quanto a cota está “espichada” para cima ou para baixo. É usado média móvel de 200 períodos. Quanto maior o indicador, mais a cota subiu recentemente. Usaremos metodologia análoga ao JdK RS-Momentum usado no Relative Rotation Graphs (RRG). Quanto menor, melhor.
Payback (anos): payback em anos de quanto você recuperaria o valor do valor da cota com os rendimentos do FII adquirido. Medida simplista, não é medido com reinvestimento e é dado como premissa que o dividend yield é constante durante o período. Quanto menor, melhor.
Kairós
Kairós foi na mitologia grega o deus do tempo oportuno, hoje também referido como “medida certa”.
Nós iniciaremos nosso caminho pela programação R
, mas se você não é usuário da linguagem e somente quer usar o conteúdo demonstrado no artigo para gerar as suas tabelas periodicamente, veja abaixo:
- Veja este vídeo aqui para instalar o R + RStudio + MT5 + mt5R. (7min) ##TODO
- Veja este vídeo aqui de X minutos para rodar o código sem saber de
R
. (4min) ##TODO
Pronto! Espero que eu tenha ajudado as suas decisões de investimento! ❤️
Mas se você quer programar as suas próprias embalagens, continue lendo! ⛏
As ferramentas
- R + RStudio
- MT5
- mt5R (0.1.5 ou superior)
Faremos uso de técnicas de web scrapping nos seguintes sites:
Dois excelentes sites que eu recomendo muito!
Você pode acessar o código R
completo que será usado aqui.
O começo
O nosso pipeline está resumidamente abaixo. A ferramenta e a informação que iremos obter.
- mt5R: ticker
- Web scraping: verificar quem é FII pelo statusinvest
- Web scraping: setor, administrador, DY12m, P/VP e valor em caixa pelo statusinvest
- mt5R: cotação, MM200Delta e Volume
- Web scrapping: nome do FII pelo clubefii
Vamos começar! Carregaremos os pacotes que serão usados.
library(mt5R)
library(stringr)
library(dplyr)
Verificamos se o mt5R está no MT5:
MT5.Ping()
#> [1] TRUE
1. mt5R: ticker
Aqui iremos somente extrair os tickers candidatos (possivelmente FIIs) do MetaTrader 5, usando MT5.AllSymbols()
.
## Pegaremos o Ticker de todos os ativos negociaveis na B3
sTodosTickers = MT5.AllSymbols()
## Queremos somente aqueles que possuam '11' no nome
sTodosTickers = sTodosTickers[str_detect(sTodosTickers, "11")]
## Podem vir opções junto, tiramos pelo tamanho do nome
sTodosTickers = sTodosTickers[str_length(sTodosTickers) >= 5 & str_length(sTodosTickers) <= 6]
Vamos dar uma espiada nos tickers candidatos que provavelmente são FIIs.
head(sTodosTickers)
#> [1] "ABCP11" "ALUP11" "BBAS11" "BBPO11" "BBRC11" "BDRX11"
length(sTodosTickers)
#> [1] 361
Percebam que há outros ativos que não-FIIs que também foram contemplados, percebam no BBAS11 (Banco do Brasil) acima. Em seguida temos a quantidade dos nossos candidatos usando length(sTodosTickers)
.
2. Web scraping: verificar quem é FII
Iremos de ticker em ticker com ajuda da página statusinvest para saber quem é FII. Caso a página retorne que o ticker informado não foi encontrado o retiraremos da lista. A nossa premissa é que o site saiba quem é FII ou não.
Veja aqui a página do statusinvest quando o FII não é encontrado.
## Criaremos um vetor para armazenar se é realmente FII
bQuaisSaoFII = rep(TRUE, length.out = length(sTodosTickers))
for(i in 1:length(sTodosTickers))
{
## Iremos de nome em nome
sAtivo = sTodosTickers[i]
scrape_url = paste0("https://statusinvest.com.br/fundos-imobiliarios/", str_to_lower(sAtivo))
flat_html = base::readLines(con = scrape_url, encoding="UTF-8")
## Verificar se realmente é FII
if(any(str_detect(flat_html, "o encontramos o que vo") == T))
{
## Se o statusinvest.com.br informar que não encontrou o ticker
bQuaisSaoFII[i] = FALSE
}else
{
## Caso contrário, é FII!
bQuaisSaoFII[i] = TRUE
}
}
Vamos dar uma espiada nos tickers que sobraram.
## Filtrar aqueles que verdadeiramente são FIIs
sTodosOsFIIs = sTodosTickers[bQuaisSaoFII]
head(sTodosOsFIIs)
#> [1] "ABCP11" "BBPO11" "BBRC11" "BMII11" "BNFS11" "BPFF11"
length(sTodosOsFIIs)
#> [1] 261
Sucesso! Temos agora os tickers de todos os FIIs disponíveis!
3. Web scraping: setor, administrador, DY12m, P/VP e valor em caixa
Aqui exploraremos mais profundamente com o web scrapping! Funções específicas que serão usadas: PegarTextoNegrito()
para obter textos que estejam em negrito; e PegarSetor()
para capturar o setor do FII.
O web scrapping é uma tarefa simples em que você precisa saber um pouco como a página foi estruturada (não é nada complicado, verifique a estrutura do flat_html
). Perceba que para achar um indicador em específico é obtida a localização do indicador e a localização de todas os textos em negrito, e assim mapear a localização da string desejada.
PegarTextoNegrito = function(flat_html, sQualIndicador, iQualNaSequencia = 1)
{
# flat_html: é a página obtida pelo base::readLines
# sQualIndicador: qual indicador estamos atrás
# iQualNaSequencia: o indicador pode aparecer diversas vezes na pagina. Escolha em qual você está interessado.
iOnde_AproxIndicador = which(str_detect(flat_html, regex(sQualIndicador, ignore_case = T)))
iOnde_EstaoNegritos = which(str_detect(flat_html, "</strong>"))
sTexto = flat_html[iOnde_EstaoNegritos[iOnde_EstaoNegritos > iOnde_AproxIndicador[iQualNaSequencia]][1]]
iMarcadores = str_locate_all(sTexto, ">")[[1]][,1]
iOndeTermina = str_locate_all(sTexto, "</strong>")[[1]][1]
iOndeComeca = tail(subset(iMarcadores, iMarcadores < iOndeTermina),1)
sTexto_Quero = str_sub(sTexto, iOndeComeca + 1, iOndeTermina - 1)
if(length(sTexto_Quero)<1)sTexto_Quero = NA; ## não achou
return(sTexto_Quero)
}
Capturar o setor na página requer uma outra função separada, por causa da estrutura de texto na página. O conceito é o mesmo usado na função acima, entretanto usaremos o rastreio das barras para nos balizar onde está a string do setor.
PegarSetor = function(flat_html)
{
iOnde_AproxIndicador = which(str_detect(flat_html, regex(">Segmento</span>", ignore_case = T)))[1]
iOnde_BarraInversa = which(str_detect(flat_html, '\"'))
sTexto = flat_html[iOnde_BarraInversa[iOnde_BarraInversa > iOnde_AproxIndicador][1]]
iOnde_BarraDir = str_locate_all(sTexto, "/")[[1]]
## Procura por aspas
iOndeTermina = str_locate_all(sTexto, '"')[[1]][2]
iOnde_Comeca = tail(iOnde_BarraDir[iOnde_BarraDir < iOndeTermina],1)
sTexto_Quero = str_sub(sTexto, iOnde_Comeca + 1, iOndeTermina - 1)
return(sTexto_Quero)
}
Vamos usar o XPML11 como exemplo para testarmos as funções acima. Iremos obter o seu P/VP e o setor do FII. Inicialmente baixamos a página do XPML11 no statusinvest.
scrape_url = "https://statusinvest.com.br/fundos-imobiliarios/xpml11"
flat_html = base::readLines(con = scrape_url, encoding="UTF-8")
Usamos PegarTextoNegrito()
e PegarSetor()
.
PVP = PegarTextoNegrito(flat_html, "P/VP")
print(PVP)
#> [1] "0,93"
Setor = PegarSetor(flat_html)
print(Setor)
#> [1] "shoppings"
Fantástico! Verificando e estudando a estrutura dos sites disponíveis na internet para se orientar, qualquer informação está a sua disposição no R
. Você pode fazer o mesmo com outras estruturas de dados, como pdf
.
Vamos agora pegar os dados de todos os FIIs negociáveis então! Traçaremos um looping para percorrer o vetor de tickers (sTodosOsFIIs
) e gravar todas as informações em df_todos_fiis
.
## data frame em que iremos colocar todas as informacoes
df_todos_fiis = data.frame()
for(i in 1:length(sTodosOsFIIs))
{
## Iremos de ticker em ticker
sFII = sTodosOsFIIs[i]
scrape_url = paste0("https://statusinvest.com.br/fundos-imobiliarios/", str_to_lower(sFII))
flat_html = base::readLines(con = scrape_url, encoding="UTF-8")
df_fii = data.frame(Ticker = sFII,
Nome = NA,
Setor = NA,
Adm = NA,
Cotacao = NA,
MM200Delta = NA,
Vol = NA,
DY12m = NA,
P_VP = NA,
VALOR_EM_CAIXA = NA)
### Nome
# Deixaremos para outro bloco usando o site clubefii
### Setor
# Remover "-" caso tenha na string
# Colocar primeira letra maiúscula
# Remove espaços no inicio e no final, se atribuível
sSetor = PegarSetor(flat_html) %>% str_replace_all(., "-", " ") %>% str_to_title(.) %>% str_trim(.)
df_fii$Setor = sSetor
### Administrador
# Usar somente as duas primeiras palavras
sAdm = PegarTextoNegrito(flat_html, "ADMINISTRADOR") %>% word(., 1,2)
df_fii$Adm = sAdm
### Cotacao
### MM200Delta
### Vol
# Deixaremos para o próximo bloco, onde voltaremos a usar o MT5R.
### DY12m
# Trocar virgula por ponto para o R entender que é um numérico
# Transformar em numerico
fDY12 = PegarTextoNegrito(flat_html, "DIVIDEND YIELD") %>% str_replace_all(., "\\,", "\\.") %>% as.numeric(.)
df_fii$DY12m = fDY12
### P/VP
# Trocar virgula por ponto para o R entender que é um numérico
# Transformar em numerico
fPVP = PegarTextoNegrito(flat_html, "P/VP") %>% str_replace_all(., "\\,", "\\.") %>% as.numeric(.)
df_fii$P_VP = fPVP
### Valor em caixa
# Trocar virgula por ponto para o R entender que é um numérico
# Transformar em numerico
fValorEmCaixa = PegarTextoNegrito(flat_html, "VALOR EM CAIXA") %>% str_replace_all(., "\\,", "\\.") %>% as.numeric(.)
df_fii$VALOR_EM_CAIXA = fValorEmCaixa
## Adiciona no data.frame final
df_todos_fiis = rbind(df_todos_fiis, df_fii)
}
Verificamos o data.frame
o gerado.
head(df_todos_fiis)
#> Ticker Nome Setor Adm Cotacao MM200Delta Vol DY12m P_VP VALOR_EM_CAIXA
#> 1 ABCP11 NA Shoppings RIO BRAVO NA NA NA 3.56 0.90 1.21
#> 2 BBPO11 NA Agencias De Bancos VOTORANTIM ASSET NA NA NA 11.31 1.13 5.05
#> 3 BBRC11 NA Agencias De Bancos VOTORANTIM ASSET NA NA NA 9.59 1.07 3.78
#> 4 BMII11 NA Lajes Corporativas RIO BRAVO NA NA NA 0.00 NA 0.12
#> 5 BNFS11 NA Agencias De Bancos OLIVEIRA TRUST NA NA NA 9.47 1.18 4.68
#> 6 BPFF11 NA Fundo De Fundos GENIAL INVESTIMENTOS NA NA NA 8.35 0.89 5.67
A nossa tabela está tomando rosto! Vamos continuar!
4. mt5R: cotação, MM200Delta e Volume
Usaremos o mt5R
para fazer download e calcular as demais métricas que utilizem a cotação e o volume do FII.
## Como já temos o df_todos_fiis com todos os tickers, nós agora vamos fazer o looping em cima deste data.frame
for(i in 1:dim(df_todos_fiis)[1])
{
sTicker = df_todos_fiis$Ticker[i]
## Verificamos se ele está no Marketwatch do MT5
bEstaMW = MT5.SymbolInMarketwatch(sTicker)
if(bEstaMW == FALSE)
{
MT5.MarketwatchAdd(sTicker)
Sys.sleep(0.2) ##Esperamos o MT5 baixar os dados
}
## 1440 é o diario e queremos 200 rows para fazer a média móvel de 200
Cotacao = MT5.GetSymbol(sTicker, iTF = 1440, iRows = 200)
## Alguns FIIs podem nao ter nenhuma cotacao, como algum muito recente
if(dim(Cotacao)[1]>0)
{
## Cotacao
df_todos_fiis$Cotacao[i] = tail(Cotacao$Close, 1)
## Cotacao atual sobre a média móvel de 200 períodos, caso tenha 200 linhas
df_todos_fiis$MM200Delta[i] = ifelse(length(Cotacao$Close)<200, NA, tail(Cotacao$Close, 1) / mean(Cotacao$Close))
## Volume medio em 200 dias, em milhoes
df_todos_fiis$Vol[i] = mean(Cotacao$Close * Cotacao$Volume) / 1000000
}
if(bEstaMW == FALSE)
{
## Se nao estava no Marketwatch, remove
MT5.MarketwatchRemove(sTicker)
}
}
Verificamos novamente como está ficando a tabela.
head(df_todos_fiis)
#> Ticker Nome Setor Adm Cotacao MM200Delta Vol DY12m P_VP VALOR_EM_CAIXA
#> 1 ABCP11 NA Shoppings RIO BRAVO 78.95 0.9992906 0.022346880 3.56 0.90 1.21
#> 2 BBPO11 NA Agencias De Bancos VOTORANTIM ASSET 113.75 0.8915737 0.224470517 11.31 1.13 5.05
#> 3 BBRC11 NA Agencias De Bancos VOTORANTIM ASSET 120.98 0.8899606 0.019274848 9.59 1.07 3.78
#> 4 BMII11 NA Lajes Corporativas RIO BRAVO NA NA NA 0.00 NA 0.12
#> 5 BNFS11 NA Agencias De Bancos OLIVEIRA TRUST 122.69 1.0180007 0.009168159 9.47 1.18 4.68
#> 6 BPFF11 NA Fundo De Fundos GENIAL INVESTIMENTOS 76.91 0.9528783 0.056224943 8.35 0.89 5.67
Para buscar o nome utilizaremos o clubefii por motivos de ensino. Perceba que é bem simples:
PegarNome = function(sTickerFII)
{
pagina_url = paste0("https://www.clubefii.com.br/fiis/", str_to_lower(sTickerFII))
pagina_flat = base::readLines(con = pagina_url, encoding="UTF-8", warn=F)
iOnde_AproxIndicador = which(str_detect(pagina_flat, regex(sTickerFII, ignore_case = T)))
##Verifiquei que é na 4a posicao
sTexto = pagina_flat[iOnde_AproxIndicador[4]]
## Procura por aspas
iOndeEstao_simbolo_menos = str_locate_all(sTexto, '-')[[1]][,1]
sNomeFII = str_sub(sTexto, iOndeEstao_simbolo_menos[1] + 2, iOndeEstao_simbolo_menos[2] - 2)
return(sNomeFII)
}
for(i in 1:dim(df_todos_fiis)[1])
{
sTicker = df_todos_fiis$Ticker[i]
### Nome
df_todos_fiis$Nome[i] = PegarNome(sTicker)
}
E como último tratamento de dados, vamos:
- Remover aqueles FIIs que não estão sendo negociados:
df_todos_fiis = df_todos_fiis[!is.na(df_todos_fiis$Cotacao),]
- Vamos escalar
MM200Delta
e centralizá-los em 100 para entendimento melhor ao visualizá-lo:
df_todos_fiis$MM200Delta = scale(df_todos_fiis$MM200Delta, center = 0) * 100
- Indicador extra, payback em anos, simplista e sem reinvestimentos, do valor da cota pelo dividend yield.
df_todos_fiis$PB_Anos = round(df_todos_fiis$Cotacao / (df_todos_fiis$DY12m / 100 * df_todos_fiis$Cotacao), 1)
Tabela de web scrapping completada. Vamos dar uma olhada?
head(df_todos_fiis)
#> Ticker Nome Setor Adm Cotacao MM200Delta Vol DY12m P_VP VALOR_EM_CAIXA PB_Anos
#> 1 ABCP11 Grand Plaza Shopping Shoppings RIO BRAVO 78.95 100.56482 0.022346880 3.56 0.90 1.21 28.1
#> 2 BBPO11 BB Progressivo II Agencias De Bancos VOTORANTIM ASSET 113.75 89.72460 0.224470517 11.31 1.13 5.05 8.8
#> 3 BBRC11 BB Renda Corporativa Agencias De Bancos VOTORANTIM ASSET 120.98 89.56227 0.019274848 9.59 1.07 3.78 10.4
#> 5 BNFS11 Banrisul Novas Fronteiras Agencias De Bancos OLIVEIRA TRUST 122.69 102.44774 0.009168159 9.47 1.18 4.68 10.6
#> 6 BPFF11 Brasil Plural Absoluto Fundo de Fundos Fundo De Fundos GENIAL INVESTIMENTOS 76.91 95.89407 0.056224943 8.35 0.89 5.67 12.0
#> 7 BRCR11 BTG Pactual Corporate Office Fund Lajes Corporativas BTG PACTUAL 81.55 94.53748 0.366565195 6.85 0.76 0.80 14.6
A nossa tabela está finalizada! 📑
Para salvar no computador a tabela e saber exatamente em que pasta será salvo, use os blocos seguintes:
write.csv2(df_todos_fiis, file = "tabela_fiis.csv", row.names = FALSE)
print(getwd())
Análise dos dados
Faremos breves buscas de informações e o uso de tabelas por dplyr
e gráficos por ggplot2
. Segue:
- Qual é a mediana de dividend yield de todos os FIIs disponíveis que pagam rendimentos?
median(df_todos_fiis$DY12m, na.rm=T)
#> [1] 5.87
A mediana de dividend yield de todos os FIIs que pagam rendimentos é de 5,87%.
- Qual FII tem mais valor em caixa?
df_todos_fiis[which.max(df_todos_fiis$VALOR_EM_CAIXA), ]
#> Ticker Nome Setor Adm Cotacao MM200Delta Vol DY12m P_VP VALOR_EM_CAIXA PB_Anos
#> 255 BTAL11 Btg Pactual Agro Logística Imoveis Industriais E Logisticos BTG PACTUAL 103.98 NA 0.09221891 0.15 1.04 77.83 666.7
O BTAL11 aparenta ter sido criado recentemente e tem impressionantes 77,8% em caixa.
- Qual FII tem a cota mais esticada para cima neste momento que escrevo esse artigo?
df_todos_fiis[which.max(df_todos_fiis$MM200Delta), ]
#> Ticker Nome Setor Adm Cotacao MM200Delta Vol DY12m P_VP VALOR_EM_CAIXA PB_Anos
#> 144 HCTR11 HECTARE CE Papeis VORTX DISTRIBUIDORA 145.05 128.0504 0.3160115 14.89 1.23 28.95 6.7
Não surpreendente, o HCTR11 com DY de 14,89% é o FII com a cota mais esticada para cima.
Tabela gerada por dplyr
para resumir por setor, o número de FIIs, o dividend yield e o MM200Delta
.
Tabela_Dinamica = df_todos_fiis %>%
dplyr::group_by(Setor) %>%
dplyr::summarise(.groups = 'drop',
n = n(),
DY12m_median = median(DY12m, na.rm=TRUE),
MM200Delta_median = median(MM200Delta, na.rm=TRUE)
) %>% dplyr::filter(n >= 2) %>% dplyr::arrange(desc(MM200Delta_median)) %>% print(n = Inf)
#> # A tibble: 15 x 4
#> Setor n DY12m_median MM200Delta_median
#> <chr> <int> <dbl> <dbl>
#> 1 Papeis 50 7.07 108.
#> 2 Imoveis Comerciais Outros 2 3.56 108.
#> 3 Hospitalar 5 6.44 107.
#> 4 Imoveis Residenciais 2 2.40 104.
#> 5 Imoveis Industriais E Logisticos 30 6.06 101.
#> 6 Indefinido 8 5.5 99.2
#> 7 Fundo De Fundos 27 6.48 99.2
#> 8 Shoppings 24 2.96 98.1
#> 9 Misto 10 4.41 96.5
#> 10 Educacional 4 7.08 95.9
#> 11 Lajes Corporativas 45 6.46 94.9
#> 12 Fundo De Desenvolvimento 26 1.69 92.1
#> 13 Varejo 3 7.32 91.8
#> 14 Agencias De Bancos 4 9.70 91.0
#> 15 Hoteis 3 0.4 90.6
Note que enquanto este post está sendo produzido, os fundos de “Papeis” são os mais esticados para cima e os “Hoteis” são os mais esticados para baixo (veja a coluna MM200Delta_median
).
Note que existem 50 FIIs (!) de papéis disponíveis e que os FIIs de shopping estão pagando dividend yield em mediana de 2,95%!
O gráfico abaixo sucinta de forma gráfica os setores. Perceba os quadrantes.
Quadrantes
- Esquerda e acima: baixo yield e preços esticados para cima
- Direita e acima: alto yield e preço esticado para cima
- Esquerda e abaixo: baixo yield e preços esticados para baixo
- Direita e abaixo: alto yield e preço esticado para baixo
Note no gráfico acima que os FIIs do setor de “Imoveis Comerciais” estão bem esticados para cima (vertical), quase como os de “Papeis”, mas não possuem o Dividend Yield (horizontal) que o de “Papeis” têm.
Conclusões
As informações e ferramentas acima irão catapultá-lo para ter um vislumbre melhor do mercado de FIIs. Além de visões macro como o gráfico acima, há a tabela gerada, onde pode ver cada FII por vez. Sempre estude bem os produtos que você irá adquirir, recomendo os sites usados nesse artigo como statusinvest e clubefii, para ter ainda mais informações micro.
Para os meus investimentos pessoais, eu utilizo sim a tabela gerada, entretanto eu busco ainda mais informações: mediana dos yields mensais, payback e outros. A tabela gerada neste artigo é somente uma base, a embalagem base. Agora é com você, crie a sua própria também!
A programação R usada neste artigo tem total finalidade de simplificar o processo. Programadores mais experientes de R
ao lerem este artigo podem notar a possibilidade de vetorizar muitos dos processos usados, há bastante redundância de loopings e a troca de <-
para =
foi intencional dada finalidade do artigo.
Espero que tenham gostado! GK
Gostou do artigo? Quer comentar ou dar sugestões? Por favor, deixe suas sugestões e comentários aqui.
Dado \(P_t\) a cotação ativo em \(t \in \mathbb N^{+}\) e \(P_T\) a cotação de hoje, \(\frac{\frac{(\sum_{i=0}^{199} P_{T-i})}{200}}{P_{T}}\) ou “o resultado da média móvel 200 sobre a última cotação”.↩︎