library(dplyr)
library(dbplyr)
library(tidyr)
library(furrr)
library(reactable)
library(htmltools)
library(ggplot2)
library(scales)
library(ggimprensa)
library(zoo)
library(echarts4r)
# Conectando a base de dados
<- DBI::dbConnect(duckdb::duckdb(),
con dbdir = "fundos_db.duckdb",
read_only = FALSE)
Desde que concluí minha tese sobre fundos de investimento, no início de 2014, venho considerando publicar posts regulares sobre o tema. O objetivo é construir uma base de conhecimento e compartilhar insights relevantes. Embora existam páginas que comparam fundos, ainda são raras as discussões que abordam a indústria de forma mais abrangente, analisando aspectos como captação, rentabilidade, risco e diversas outras métricas. Neste espaço, a proposta é analisar os dados de forma agregada, sem focar em fundos individuais.
Neste primeiro post, abordaremos questões mais técnicas, como o download dos dados, tratamento, integração de bases e outros processos necessários para nossas análises. Começaremos analisando as três principais classes de fundos: renda fixa, multimercados e ações. Esta será a primeira de uma série de três publicações, cada uma dedicada a uma das classes mencionadas.
Vamos cobrir todas as etapas do processo, como coleta dos dados, limpeza, manipulação e armazenamento. Além do processamento dos dados, vamos criar nossas análises sobre essas informações, a fim de entender o comportamento da indústria de fundos.
Este primeiro post será mais extenso, pois abrangerá mais etapas do processo de análise e processamento dos dados. Peço a compreensão de todos e convido-os a continuarem acompanhando as próximas etapas.
Fonte de Dados
Vamos utilizar como base de dados primária os dados presentes na CVM, de onde pegaremos todos os dados referentes aos dados de cotas, dados cadastrais e o que é chamado de extrato de informações. Além disso, vamos utilizar dados fornecidos pela ANBIMA. Vamos utilizar as classificações dos fundos presentes nos dados cadastrais que a instituição utiliza. A escolha de utilização da classificação ANBIMA, está no fato de que durante o processo de tratamento de dados em minha tese de doutorado, percebi algumas inconsistências na base da CVM.
Aquisição de dados
Os primeiros dados que iremos baixar são aqueles referentes às cotas, ao PL e à captação dos fundos de investimento disponíveis no portal de dados abertos da CVM. O nome da base é: Informe Diário.
A CVM nos alerta que esses dados podem ser reapresentados em até M-11, além de dividi-los em dois repositórios: um contendo dados históricos desde 2000 até 2020, e outro com dados de 2021 até os dias atuais. Vamos baixar ambos. Faremos o download de arquivos compactados, que serão descompactados e carregados em nossa base de dados. Após a descompactação, uniremos todos os arquivos em uma única base.
Para lidar com o grande volume de dados, vamos paralelizar nossa execução utilizando o pacote furrr
. Esse pacote permite baixar vários meses de uma só vez, reduzindo consideravelmente o tempo de download. Após obter os dados da CVM, vamos unir todas as bases e, em seguida, salvar os dados em um banco de dados conhecido como DuckDB.
Depois de consolidar os dados, teremos aproximadamente 70 milhões de linhas, o que dificulta o tratamento diretamente no R. O DuckDB nos permite manipular esses dados com mais agilidade, pois é um banco otimizado para lidar com grandes volumes de informação.
Primeira coisa que vamos fazer é carrregar os pacotes necessários e conectar ao nosso banco. Lembro que se você for fazer isos em sua máquina o caminho que está sendo utilizando no parâmetro dbdir
tem que ser relativo a sua própria pasta.
Para obter o conjunto completo de dados, vamos acessar os endereços HIST e DADOS para baixar todos os arquivos disponíveis. Para otimizar essa etapa, utilizaremos as funções de paralelização do pacote furrr
, configurando quatro clusters para realizar as requisições simultaneamente e, assim, agilizar o processo de download.
# Criando a sequência de datas para criar as urls de download
<- seq(2000,2020,1)
anos_download <- format(seq(as.Date("2021-01-01"),
meses_download as.Date("2025-01-01"),
by = "month"),
"%Y%m")
# Definindo o número de workers
::plan(future::multisession,
futureworkers = 6)
# Fazendo donwload dos arquivos de 2000 a 2020
::future_walk(anos_download, function(ano){
furrroptions(timeout = 600)
<- paste0("https://dados.cvm.gov.br/dados/FI/DOC/INF_DIARIO/DADOS/HIST/inf_diario_fi_",
url
ano,".zip")
<- paste0("./informe_diario/",ano,".zip")
destfile ::download.file(url,destfile,mode = "wb")
utils.progress = T)
},
# Fazendo donwload dos arquivos de 2021 a janeiro de 2025
::future_walk(meses_download, function(mes){
furrroptions(timeout = 600)
<- paste0("https://dados.cvm.gov.br/dados/FI/DOC/INF_DIARIO/DADOS/inf_diario_fi_",
url
mes,".zip")
<- paste0("./informe_diario/",mes,".zip")
destfile download.file(url,destfile)
},.progress = T)
# Dezipando arquivos
<- list.files("./informe_diario/",full.names = T,pattern = ".zip")
zipfiles
::future_walk(zipfiles,function(path){
furrrunzip(path,exdir = "./informe_diario/")
})
# Deletando arquivos baixados
invisible(file.remove(list.files("./posts/desempenho_fundos_rf/informe_diario/",
full.names = T)))
# Excluindo os workers da paralelização
::plan(future::sequential) future
Precisamos configurar o tempo máximo de espera (timeout) em cada solicitação de download, já que alguns links podem levar mais tempo do que o habitual para responder. Quando esse limite não é definido, a função pode falhar caso a resposta ultrapasse o tempo padrão de espera, o que já nos causou problemas em situações de atraso na transferência dos arquivos.
Depois de baixar todos os arquivos, precisamos ler cada um dos CSVs e unificá-los em um único objeto. Essa etapa pode ser bastante exigente em termos de recursos e, por isso, pode não rodar tão facilmente em alguns computadores. No meu caso, como a minha máquina tem 32 GB de memória, consegui processar tudo sem maiores problemas.
# Lista todos os arquivos CSV da pasta "informe_diario"
<- list.files("./informe_diario/", full.names = TRUE, pattern = ".csv")
arquivos_csv
# Configura o plano de execução paralela com 6 núcleos (multisession é compatível com Windows)
::plan(future::multisession, workers = 6)
future
# Lê todos os arquivos CSV em paralelo e armazena os resultados como uma lista de dataframes
::future_map(arquivos_csv, function(arquivo) {
furrr::read_delim(arquivo,
readrdelim = ";", escape_double = FALSE, trim_ws = TRUE)
.progress = TRUE) -> informes_diarios
},
# Restaura o plano de execução para modo sequencial após a paralelização
::plan(future::sequential)
future
# Junta todos os dataframes da lista em um único dataframe consolidado
%>%
informes_diarios bind_rows() -> informes_diarios
Deletando o objeto com todos os CSVs lidos.
::dbWriteTable(con,"informes_diarios",informes_diarios)
DBIrm(informes_diarios)
ETL dos Dados
O primeiro passo para iniciarmos o ETL dos nossos dados consiste em nos conectarmos à base de dados. Vamos utilizar a função tbl
do pacote dplyr
, que nos permite manipular a tabela do banco DuckDB como se fosse um data frame dentro do nosso projeto.
Os arquivos que baixamos contêm todos os tipos de fundos. Aqui, vamos nos concentrar nos fundos de investimento tradicionais, conhecidos por fazerem parte da Instrução CVM 175. Para isso, vamos filtrar a base, selecionando apenas os fundos com a designação FI.
<- tbl(con,"informes_diarios") informes_diarios
Vamos começar integrando a base de dados fornecida pela ANBIMA. Primeiro, leremos o arquivo e o salvaremos em nossa base do DuckDB. Em seguida, faremos a união das duas fontes de dados, o que nos permitirá filtrar apenas as classes de fundos desejadas para este primeiro momento, com foco nos fundos de renda fixa.
<- readxl::read_excel("fundos-175-caracteristicas-publico-22-02-2025-12-01-14.xlsx")
fundos_175_anbima ::dbWriteTable(con,"fundos_175_anbima",fundos_175_anbima)
DBIrm(fundos_175_anbima)
Aqui, como os dados filtrados resultaram em uma quantidade menor, o tamanho da base nos permite trabalhar tudo dentro do R sem problemas de desempenho. O DuckDB
é fundamental para filtrar e unir as bases, pois o tempo de execução é bastante reduzido devido à sua maior eficiência ao lidar com grandes volumes de dados. Apenas a base de FI, por exemplo, possui cerca de 20 milhões de linhas, o que tornaria a análise diretamente no R muito lenta. Ao reduzir o tamanho da base, passamos a poder trabalhar tudo dentro do próprio R, sem precisar utilizar o DuckDB
. É isso que fazemos a seguir.
%>%
informes_diarios # Substitui valores ausentes em CNPJ_FUNDO e TP_FUNDO pelos valores da classe correspondente
mutate(
CNPJ_FUNDO = case_when(is.na(CNPJ_FUNDO) ~ CNPJ_FUNDO_CLASSE,
.default = CNPJ_FUNDO),
TP_FUNDO = case_when(is.na(TP_FUNDO) ~ TP_FUNDO_CLASSE,
.default = TP_FUNDO)
%>%
) # Remove qualquer caractere que não seja número do CNPJ_FUNDO usando expressão regular SQL
mutate(CNPJ_FUNDO = sql("regexp_replace(CNPJ_FUNDO, '[^0-9]', '', 'g')")) %>%
# Junta com a tabela fundos_175_anbima para enriquecer os dados com metainformações dos fundos
left_join(
tbl(con, "fundos_175_anbima") %>%
filter(`CNPJ do Fundo` != "58137699000116") %>% # Esse fundo em especifico possuia valores duplicados
select(
`Código ANBIMA`, Estrutura, `CNPJ do Fundo`, `Nome Comercial`, Status,
`Categoria ANBIMA`, `Tipo ANBIMA`, `Composição do Fundo`,
`Aberto Estatutariamente`, `Tributação Alvo`, `Primeiro Aporte`,
`Tipo de Investidor`, `Característica do Investidor`,
`Cota de Abertura`, `Aplicação Inicial Mínima`,
`Prazo Pagamento Resgate em dias`
),by = c("CNPJ_FUNDO" = "CNPJ do Fundo")
%>%
)
# Filtra apenas fundos classificados como "Renda Fixa"
filter(`Categoria ANBIMA` == "Renda Fixa") %>%
# Coleta os dados do banco (conversão para tibble local)
collect() -> fundos_rf
Depois de realizar esses processamentos, vamos conferir a quantidade de fundos com os quais trabalharemos.
Mostrar código
%>%
fundos_rf distinct(CNPJ_FUNDO, `Categoria ANBIMA`, `Tipo ANBIMA`) %>%
count(`Categoria ANBIMA`, `Tipo ANBIMA`) %>%
arrange(-n) %>%
rename(Quantidade = n) %>%
mutate(`Part (%)` = Quantidade / sum(Quantidade) * 100) %>%
mutate(`Part Acum (%)` = cumsum(`Part (%)`)) %>%
::reactable(
reactablepagination = FALSE,
defaultColDef = colDef(minWidth = 120),
resizable = TRUE,
columns = list(
`Categoria ANBIMA` = colDef(width = 120),
`Tipo ANBIMA` = colDef(width = 360),
Quantidade = colDef(
width = 120,
align = "right",
format = colFormat(separators = TRUE),
footer = function(values) {
::tags$b("Total: ") %>%
htmltools::tagAppendChildren(htmltools::tags$span(sum(values)))
htmltools
}
),`Part (%)` = colDef(
width = 80,
align = "right",
format = colFormat(suffix = "%", digits = 2),
footer = function(values) {
::tags$b("100%")
htmltools
}
),`Part Acum (%)` = colDef(
width = 120,
align = "right",
format = colFormat(suffix = "%", digits = 2),
footer = function(values) {
::tags$b("100%")
htmltools
}
)
) )
Ao analisar os dados que relacionam as novas classificações da ANBIMA para fundos de Renda Fixa às quantidades de fundos em cada categoria, percebe-se novamente um predomínio significativo dos fundos classificados como “Renda Fixa Duração Livre Crédito Livre”, que totalizam 2.011 fundos. Em seguida, destacam-se os 909 fundos enquadrados em “Renda Fixa Duração Livre Grau de Investimento” e os 512 em “Renda Fixa Duração Baixa Grau de Investimento”.
Categorias como “Renda Fixa Duração Livre Soberano” (341 fundos) e “Renda Fixa Duração Baixa Soberano” (259 fundos) possuem presença intermediária. Outras categorias, como “Renda Fixa Indexados” (194 fundos), “Renda Fixa Simples” (147 fundos) e “Renda Fixa Investimento no Exterior” (131 fundos), também apresentam relevância expressiva, assim como “Renda Fixa Duração Média Grau de Investimento” (117 fundos).
Por outro lado, categorias como “Renda Fixa Duração Alta Grau de Investimento” (62 fundos), “Renda Fixa Duração Baixa Crédito Livre” (43 fundos), “Renda Fixa Duração Média Crédito Livre” (41 fundos), “Renda Fixa Duração Alta Crédito Livre” (33 fundos), “Renda Fixa Duração Média Soberano” (18 fundos), “Renda Fixa Duração Alta Soberano” (17 fundos) e “Renda Fixa Dívida Externa” (5 fundos) continuam sendo menos representativas.
Essa distribuição evidencia uma preferência pelas categorias que oferecem maior flexibilidade na gestão dos recursos e exposição ao crédito privado ou grau de investimento. Em contraste, estratégias específicas ou nichos, como fundos de dívida externa ou soberanos com maior duração, reúnem poucos produtos, demonstrando que gestores e investidores optam predominantemente por categorias mais flexíveis e diversificadas em termos de risco e alocação.
Extrato de Infomações
Neste estudo, utilizo como referência o arquivo disponibilizado pela ANBIMA, que traz informações qualitativas relevantes sobre os fundos de investimento. A base escolhida é o arquivo Extrato de Informações, que contém diversas informações qualitativas sobre os fundos de investimento. Trata-se de uma base extensa, com 117 colunas, da qual utilizei apenas as informações consideradas mais relevantes para este estudo.
Recomendo ao leitor interessado acessar diretamente o arquivo completo caso deseje explorar detalhadamente todas as informações disponíveis.
Vamos baixar os dados da CVM diretamente em nossa máquina, porém não utilizaremos todas as 117 colunas disponíveis. Com base na documentação das variáveis disponibilizada pela Comissão de Valores Mobiliários (CVM) no link Documentação das Variáveis do Extrato de Informações, faremos uma seleção das variáveis consideradas mais relevantes para a análise desenvolvida neste estudo:
- PUBLICO_ALVO: público a que se destina o fundo de investimento.
- DISTRIB: forma principal de distribuição do fundo.
- POLIT_INVEST: política de investimento adotada.
- FUNDO_COTAS: indicação se o fundo investe predominantemente em cotas de outros fundos.
- FUNDO_ESPELHO: indicação se o fundo replica a carteira de outro fundo (fundo espelho).
- APLIC_MIN: valor mínimo exigido para investimento inicial no fundo.
- ATUALIZ_DIARIA_COTA: frequência da atualização e divulgação da cota do fundo.
- TAXA_SAIDA_PAGTO_RESGATE: prazo efetivo para pagamento do resgate a partir da data de pedido.
- TAXA_ADM: percentual cobrado como taxa de administração.
- EXISTE_TAXA_PERFM: indicação da existência de taxa de performance.
- TAXA_PERFM: valor percentual cobrado como taxa de performance.
- PARAM_TAXA_PERFM: parâmetro utilizado para cobrança da taxa de performance.
- CALC_TAXA_PERFM: método utilizado para calcular a taxa de performance.
- EXISTE_TAXA_INGRESSO: indicação da existência de taxa de ingresso.
- EXISTE_TAXA_SAIDA: indicação da existência de taxa de saída.
- INVEST_EXTERIOR: indicação se o fundo realiza investimentos no exterior.
- ATIVO_CRED_PRIV: indicação se o fundo investe em ativos de crédito privado.
Creio que com essas variáveis vamos conseguir ter um bom raio x dos fundos de renda fixa.
<- readr::read_delim("./extrato_fi.csv",
extrato_fi delim = ";",
escape_double = FALSE,
locale = readr::locale(encoding = "WINDOWS-1252"),
trim_ws = TRUE,
quote = "") %>%
mutate(CNPJ_FUNDO_CLASSE = stringr::str_remove_all(CNPJ_FUNDO_CLASSE,"\\.|/|-"))
Após baixar os dados, vamos unir com nossa base de fundos para que possamos ver qualitativamente os fundos de renda fixa.
%>%
fundos_rf left_join(
%>%
extrato_fi select(CNPJ_FUNDO_CLASSE,PUBLICO_ALVO, DISTRIB, POLIT_INVEST,
FUNDO_COTAS,FUNDO_ESPELHO, APLIC_MIN, ATUALIZ_DIARIA_COTA,
TAXA_SAIDA_PAGTO_RESGATE, TAXA_ADM, EXISTE_TAXA_PERFM,
TAXA_PERFM, PARAM_TAXA_PERFM, CALC_TAXA_PERFM,
EXISTE_TAXA_INGRESSO, EXISTE_TAXA_SAIDA,
INVEST_EXTERIOR, ATIVO_CRED_PRIV),by = c("CNPJ_FUNDO" = "CNPJ_FUNDO_CLASSE")
-> fundos_rf )
No geral, a explicação fornecida pela descrição das variáveis já permite uma interpretação direta do tipo de informação transmitida. Entretanto, as políticas de investimento exigem um detalhamento maior, pois sua compreensão não é tão imediata. No documento publicado pela Comissão de Valores Mobiliários (CVM), disponível em Resumo CVM Instrução CVM 175, são apresentados pontos essenciais sobre o regime informacional aplicável aos fundos de investimento regulamentados pela Instrução CVM nº 555. Entre os tópicos abordados estão as principais políticas de investimento adotadas pelos fundos, que podem ser resumidas da seguinte forma:
Tipos de Políticas de Investimento
Ativa e Referenciada:
Fundos que adotam gestão ativa, com o objetivo de obter retornos superiores a um índice de referência específico (benchmark). Embora busquem superá-lo, a estratégia permanece atrelada ao índice escolhido.Ativa e Não Referenciada:
Fundos com gestão ativa, sem utilizar um índice específico como parâmetro para os resultados. A seleção dos investimentos é livre, não sendo direcionada à replicação ou superação de benchmarks definidos.Passiva:
Fundos que utilizam gestão passiva, com o objetivo de acompanhar a variação de um índice de referência. Não possuem a intenção explícita de superar esse índice, replicando geralmente a sua composição.Enhanced:
Fundos que integram estratégias ativas e passivas, buscando retornos acima do índice de referência, porém mantendo características semelhantes ao índice replicado, especialmente no que diz respeito ao perfil de risco e composição da carteira.
Com essas informações em mãos, podemos agora analisar de forma quantitativa o perfil desses fundos de investimento. O primeiro ponto que quero abordar consiste na distribuição entre público-alvo e políticas de investimento. Isso nos permitirá entender melhor se há uma tendência de política de investimentos a depender do público-alvo do fundo. O código a seguir vai selecionar somente as colunas de interesse. Como nossa base é grande, principalmente devido às informações diárias dos fundos de investimento, precisamos selecionar as colunas relevantes e, assim, obter apenas os valores únicos para cada fundo de investimento.
Mostrar código
%>%
fundos_rf distinct(CNPJ_FUNDO,`Tipo de Investidor`,`Característica do Investidor`) %>%
count(`Tipo de Investidor`,`Característica do Investidor`) %>%
arrange(-n) %>%
rename(Quantidade = n) %>%
::reactable(
reactablepagination = FALSE, # Desativa a paginação da tabela
resizable = TRUE, # Permite redimensionamento das colunas
columns = list(
Quantidade = colDef(
align = "right", # Alinha os valores numéricos à direita
format = colFormat(separators = TRUE), # Formata os números com separadores de milhar
footer = function(values) { # Adiciona um rodapé à coluna Quantidade
$b("Total: ") %>% # Coloca a palavra "Total" em negrito
tagstagAppendChildren(tags$span(sum(values))) # Adiciona a soma total ao lado
}
)
) )
Os dados da tabela que nos apresenta o Tipo e a Característica do Investidor revela uma forte concentração dos fundos abertos ao público geral, especialmente na combinação “Não Há Restrição - Geral”, que conta com um total de 2.137 fundos (2.002 + 135). Outra parcela significativa é formada pelos fundos destinados ao investidor profissional, com destaque para as categorias “Exclusivo - Profissional” com 1.110 fundos e “Reservado - Profissional”, que possui 570 fundos.
Destaca-se também o número expressivo de fundos destinados a investidores qualificados na categoria “Não Há Restrição - Qualificado”, que soma 410 fundos, além dos fundos reservados e exclusivos para investidores profissionais (Reservado - Profissional com 570 fundos e Exclusivo - Profissional com 1.110 fundos).
Por outro lado, fundos voltados especificamente para investidores qualificados nas modalidades reservada (Reservado - Qualificado) e exclusiva (Exclusivo - Qualificado) possuem representação relativamente baixa, com 110 e 42 fundos, respectivamente. Também aparece com pouca representatividade a combinação “Reservado - Geral”, com apenas 14 fundos.
Não é nenhuma surpresa que os fundos destinados ao público em geral sejam predominantes entre os fundos de investimento. Chama a atenção a grande quantidade de fundos Exclusivos voltados para investidores profissionais, representando quase metade dos fundos destinados ao público em geral. Dada a característica desses fundos, aparentemente este é um mecanismo utilizado por classes profissionais e que pode ser objeto de um estudo mais aprofundado no futuro, com o objetivo de compreender melhor as razões por trás desse fenômeno.
Mostrar código
%>%
extrato_fi distinct(DT_COMPTC, CNPJ_FUNDO_CLASSE, POLIT_INVEST, FUNDO_ESPELHO, FUNDO_COTAS) %>%
filter(CNPJ_FUNDO_CLASSE %in% distinct(fundos_rf, CNPJ_FUNDO)$CNPJ_FUNDO) %>%
mutate(DT_COMPTC = as.Date(DT_COMPTC)) %>% # Converte a data para o formato adequado
arrange(DT_COMPTC) %>% # Ordena as datas de competência
group_by(CNPJ_FUNDO_CLASSE) %>%
summarise_all(last) %>% # Mantém apenas a última entrada por fundo
ungroup() %>%
mutate(
FUNDO_ESPELHO = case_when(
is.na(FUNDO_ESPELHO) ~ "Não",
== "N" ~ "Não",
FUNDO_ESPELHO .default = "Sim"
),FUNDO_COTAS = case_when(
== "N" ~ "Não",
FUNDO_COTAS .default = "Sim"
)%>%
) count(POLIT_INVEST, FUNDO_ESPELHO, FUNDO_COTAS) %>%
rename(
`Política de Investimento` = POLIT_INVEST,
`Fundo Espelho` = FUNDO_ESPELHO,
`Fundo de Cotas` = FUNDO_COTAS,
Quantidade = n
%>%
) reactable(
pagination = FALSE, # Desativa a paginação
resizable = TRUE, # Permite redimensionamento das colunas
columns = list(
`Política de Investimento` = colDef(width = 250), # Define largura da coluna
`Fundo Espelho` = colDef(width = 150), # Define largura da coluna
`Fundo de Cotas` = colDef(width = 150), # Define largura da coluna
Quantidade = colDef(
align = "right", # Alinha os valores numéricos à direita
format = colFormat(separators = TRUE), # Formata os números com separadores de milhar
footer = function(values) { # Adiciona um rodapé à coluna Quantidade
$b("Total: ") %>% # Deixa a palavra "Total" em negrito
tagstagAppendChildren(tags$span(sum(values))) # Exibe a soma total ao lado
}
)
) )
Ao tratarmos sobre as Política de Investimento dos fundos, juntamente com as características Fundo Espelho e Fundo de Cotas, podemos ver claramente uma concentração predominante nos fundos com gestão “Ativa e Não-Referenciada”, especialmente aqueles que não são fundos espelho nem fundos de cotas, com um total expressivo de 1.522 fundos. A seguir, destacam-se fundos com a mesma política de gestão, mas que são fundos de cotas (577 fundos).
Outro grupo com alta representatividade são os fundos com política de investimento Ativa e Referenciada, principalmente aqueles que não são fundos espelho nem de cotas (881 fundos), seguidos por aqueles que são fundos de cotas (246 fundos). Ainda nessa política de gestão, há uma menor presença dos fundos que são ao mesmo tempo fundos espelho e fundos de cotas, com apenas 44 fundos.
Entre os fundos com política Passiva, percebe-se uma divisão mais equilibrada entre aqueles que são fundos de cotas (358 fundos) e os que não são (333 fundos). Já na categoria Enhanced, há uma participação bastante reduzida, sendo apenas 25 fundos não espelho e não fundos de cotas, 11 fundos que são apenas fundos de cotas, e apenas 1 fundo que combina ambas características.
Como podemos ver, o número de fundos foi reduzido em cerca de 800. Isso se deve ao fato de termos filtrado os fundos que não possuíam dados referentes à política de investimento, os quais foram removidos, mantendo essa filtragem ao longo da análise. A ideia é termos uma amostra mais concisa, tratando apenas dos fundos que possuem todas as informações disponíveis, a fim de garantir uma comparação mais justa entre os fundos de investimento.
No geral, fica clara a preferência dos gestores e investidores pela política de gestão ativa, sobretudo não referenciada, enquanto estratégias mais específicas e menos convencionais, como a gestão “Enhanced” ou fundos espelho com cotas, mantêm representatividade bastante limitada. Esses dados indicam que o mercado brasileiro de fundos ainda prioriza estratégias tradicionais e ativas de investimento. Ainda mais surpreendente é o fato de priorizarem a característica de fundos não referenciados, considerando a própria natureza do mercado de renda fixa, no qual os juros são a principal referência.
Mostrar código
%>%
extrato_fi filter(CNPJ_FUNDO_CLASSE %in% distinct(fundos_rf, CNPJ_FUNDO)$CNPJ_FUNDO) %>%
distinct(DT_COMPTC,
CNPJ_FUNDO_CLASSE,
POLIT_INVEST,
EXISTE_TAXA_INGRESSO,
EXISTE_TAXA_PERFM, %>%
EXISTE_TAXA_SAIDA) count(POLIT_INVEST,
EXISTE_TAXA_INGRESSO,
EXISTE_TAXA_PERFM, %>%
EXISTE_TAXA_SAIDA) mutate(
EXISTE_TAXA_INGRESSO = case_match(
EXISTE_TAXA_INGRESSO, "S" ~ "Sim",
"N" ~ "Não",
.default = EXISTE_TAXA_INGRESSO),
EXISTE_TAXA_PERFM = case_match(
EXISTE_TAXA_PERFM, "S" ~ "Sim",
"N" ~ "Não",
.default = EXISTE_TAXA_PERFM),
EXISTE_TAXA_SAIDA = case_match(
EXISTE_TAXA_SAIDA, "S" ~ "Sim",
"N" ~ "Não",
.default = EXISTE_TAXA_SAIDA)
%>%
) rename(
`Política de Investimento` = POLIT_INVEST,
`Taxa de Ingresso` = EXISTE_TAXA_INGRESSO,
`Taxa de Performance` = EXISTE_TAXA_PERFM,
`Taxa de Saída` = EXISTE_TAXA_SAIDA,
Quantidade = n
%>%
) reactable(
pagination = FALSE, # Desativa a paginação
resizable = TRUE, # Permite redimensionamento das colunas
columns = list(
`Política de Investimento` = colDef(width = 300), # Define largura da coluna
`Taxa de Ingresso` = colDef(width = 120), # Define largura da coluna
`Taxa de Performance` = colDef(width = 120), # Define largura da coluna
`Taxa de Saída` = colDef(width = 120), # Define largura da coluna
Quantidade = colDef(
align = "right", # Alinha os valores numéricos à direita
format = colFormat(separators = TRUE), # Formata os números com separadores de milhar
footer = function(values) { # Adiciona um rodapé à coluna Quantidade
$b("Total: ") %>% # Deixa a palavra "Total" em negrito
tagstagAppendChildren(tags$span(sum(values))) # Exibe a soma total ao lado
}
)
) )
A análise dos dados referentes às políticas de investimento e taxas associadas aos fundos revela uma expressiva predominância dos fundos com política de investimento “Ativa e Não-Referenciada” sem incidência de taxas, que totalizam 1.757 fundos. Destacam-se também, nessa mesma categoria, os fundos que cobram taxa de performance (407 fundos). Contudo, a cobrança de taxa de saída permanece pouco utilizada nesses fundos, com apenas 12 casos sem taxa de performance e 4 fundos com ambas as taxas.
A segunda categoria mais representativa é composta pelos fundos com política “Ativa e Referenciada”, com destaque para fundos que não cobram taxas adicionais (803 fundos). Já a aplicação de taxas extras é menos frequente nessa política, indicando que gestores desses fundos preferem estruturas de custo mais simples ou tradicionais.
Por outro lado, os fundos de política “Passiva” aparecem em número intermediário, destacando-se aqueles que não têm taxas (669 fundos). A aplicação de taxa de performance também é pouco comum nessa categoria, contando com apenas 35 fundos, enquanto a cobrança simultânea de taxa de performance e de saída ocorre em apenas 2 fundos.
Esses resultados indicam claramente que os fundos ativos são predominantes no mercado, especialmente os não-referenciados, sugerindo uma maior preferência dos investidores por estratégias flexíveis. Além disso, fundos com menor cobrança de taxas (taxa de ingresso, performance ou saída) apresentam uma quantidade significativamente superior, apontando uma preferência por estruturas mais simples em termos de custos associados ao investimento.
A seguir vamos ver o comportamento da captação destes fundos desde 2010.
Mostrar código
%>%
fundos_rf filter(!is.na(POLIT_INVEST)) %>%
mutate(Competência = as.yearqtr(DT_COMPTC)) %>%
filter(Competência >= "2010 Q1" & Competência <= "2024 Q4") %>%
summarise(
= sum(CAPTC_DIA) / 1e9,
Captação Resgates = -sum(RESG_DIA) / 1e9,
.by = c("Competência", "Categoria ANBIMA")
%>%
) mutate(CAPTC_LIQ = Captação + Resgates) %>%
pivot_wider(
names_from = "Categoria ANBIMA",
values_from = "CAPTC_LIQ"
%>%
) rename(`Captação líquida` = `Renda Fixa`) %>%
arrange(Competência) %>%
mutate(`Captação líquida acumulada` = cumsum(`Captação líquida`),
= as.Date(Competência)) %>%
Competência arrange(Competência) %>%
e_charts(Competência) %>%
e_bar(Captação, name = "Captação",
color = "steelblue",
stack = "total") %>%
e_bar(Resgates,
name = "Resgates",
color = "tomato",
stack = "total") %>%
e_line(`Captação líquida`,
name = "Captação líquida",
color = "darkgreen") %>%
e_line(`Captação líquida acumulada`,
name = "Captação líquida acumulada",
color = "purple") %>%
e_title(
text = "Histórico de Captação",
subtext = "Captação e Resgates com sua evolução trimestral desde o início de 2010"
%>%
) e_legend(right = TRUE) %>%
e_tooltip(trigger = "axis") %>%
e_y_axis(
axisLabel = list(formatter = JS("function(value){ return value + ' B'; }"))
%>%
) e_x_axis(axisLabel = list(rotate = 45)) %>%
e_grid(left = "10%", right = "10%")
Desde o início de 2010, o mercado de fundos de investimento tem apresentado um crescimento expressivo, evidenciado pelo aumento contínuo dos volumes de captação e resgates. Esse comportamento reflete a crescente participação dos investidores nesse segmento, com um aumento da movimentação financeira ao longo dos anos.
Ao analisar a captação líquida, observamos que, embora haja oscilações ao longo do tempo, os fluxos de entrada e saída se mantêm relativamente equilibrados. Esse comportamento sugere que, apesar de períodos de maior atratividade dos fundos e momentos de maior aversão ao risco por parte dos investidores, o mercado tem demonstrado resiliência.
A captação líquida acumulada, por sua vez, segue uma trajetória ascendente, indicando que, no agregado, a captação tem superado os resgates. Essa tendência reflete um aumento estrutural no volume de recursos alocados em fundos de investimento, impulsionado por fatores como o amadurecimento do mercado financeiro, a diversificação dos produtos disponíveis e o maior interesse dos investidores institucionais e individuais.
A crise decorrente da pandemia da COVID-19, por volta de 2020, teve um impacto significativo no comportamento dos fluxos financeiros. Nesse período, houve uma queda na captação líquida acumulada, sinalizando uma maior retirada de recursos em um contexto de incerteza econômica global. No entanto, nos anos subsequentes, observou-se uma retomada no crescimento, indicando um processo de recuperação do setor.
Nos últimos anos, nota-se ainda um aumento na volatilidade da captação líquida, o que pode estar relacionado a fatores macroeconômicos, como oscilações nas taxas de juros, mudanças regulatórias e o próprio comportamento dos investidores em relação ao cenário econômico. Esse padrão reforça a necessidade de uma análise constante do setor, especialmente no que diz respeito às estratégias de captação e retenção de recursos por parte das gestoras de fundos.
Dessa forma, a evolução da captação e dos resgates demonstra não apenas a expansão do mercado de fundos no Brasil, mas também a sua capacidade de adaptação diante de diferentes cenários econômicos.
Mostrar código
%>%
fundos_rf filter(!is.na(POLIT_INVEST)) %>%
mutate(Competência = as.yearqtr(DT_COMPTC)) %>%
filter(Competência >= "2010 Q1" & Competência <= "2024 Q4") %>%
mutate(
`Tipo ANBIMA` = case_when(
`Tipo ANBIMA` %in% c(
"Renda Fixa Duração Livre Crédito Livre",
"Renda Fixa Duração Livre Grau de Investimento",
"Renda Fixa Duração Baixa Grau de Investimento",
"Renda Fixa Duração Livre Soberano",
"Renda Fixa Duração Baixa Soberano",
"Renda Fixa Indexados",
"Renda Fixa Simples"
~ `Tipo ANBIMA`,
) TRUE ~ "Outros"
)%>%
) summarise(
= sum(CAPTC_DIA) / 1e9,
Captação Resgates = -sum(RESG_DIA) / 1e9,
.by = c("Competência", "Tipo ANBIMA")
%>%
) mutate(
CAPTC_LIQ = Captação + Resgates,
= as.Date(Competência)
Competência %>%
) arrange(Competência) %>%
group_by(`Tipo ANBIMA`) %>%
e_charts(Competência) %>%
e_bar(CAPTC_LIQ, stack = "total", series = "Tipo ANBIMA") %>%
e_tooltip(trigger = "axis") %>%
e_title("Captação Líquida por Tipo ANBIMA ao Longo do Tempo") %>%
e_x_axis(name = "Competência") %>%
e_y_axis(name = "Captação Líquida (em bilhões)") %>%
e_legend(
orient = "horizontal",
bottom = 10,
left = "center"
%>%
) e_grid(
bottom = 120,
top = 60
)
Nos primeiros anos do gráfico (2010 até cerca de 2016), a captação líquida se manteve relativamente estável, com oscilações modestas e predominância de entradas líquidas positivas. A partir de 2017, observa-se um aumento na volatilidade, com períodos de captação elevada, seguidos por momentos de fortes resgates. Essa tendência se intensifica após 2020, com variações muito mais expressivas entre meses ou trimestres.
Durante os anos de 2020 e 2021, destacam-se movimentos de captação extremamente positivos, especialmente nos fundos de Renda Fixa Duração Baixa Soberano e Renda Fixa Simples, que aparecem com barras altas e frequentes nesse período. No entanto, a partir de 2022, há uma mudança significativa, com diversos episódios de captação negativa, indicando grandes volumes de resgates — particularmente visíveis nas categorias de Renda Fixa Duração Baixa Soberano, Duração Livre Grau de Investimento e Renda Fixa Simples.
Outra informação importante a ser analisada consiste no PL por tipo ANBIMA, onde podemos ver como o PL dos fundos de renda fixa por tipo evoluiu ao longo dos anos.
Mostrar código
%>%
fundos_rf filter(!is.na(POLIT_INVEST)) %>%
mutate(Competência = as.yearqtr(DT_COMPTC)) %>%
filter(Competência >= "2010 Q1" & Competência <= "2024 Q4") %>%
mutate(
`Tipo ANBIMA` = case_when(
`Tipo ANBIMA` %in% c(
"Renda Fixa Duração Livre Crédito Livre",
"Renda Fixa Duração Livre Grau de Investimento",
"Renda Fixa Duração Baixa Grau de Investimento",
"Renda Fixa Duração Livre Soberano",
"Renda Fixa Duração Baixa Soberano",
"Renda Fixa Indexados",
"Renda Fixa Simples"
~ `Tipo ANBIMA`,
) TRUE ~ "Outros"
)%>%
) summarise(`Custódia` = sum(VL_PATRIM_LIQ),
.by = c("Competência","Tipo ANBIMA")) %>%
arrange(Competência) %>%
mutate(Competência = as.Date(Competência),
`Custódia` = `Custódia` / 1e9) %>%
group_by(`Tipo ANBIMA`) %>%
e_charts(Competência) %>%
e_bar(`Custódia`,stack = "total",series = "Tipo ANBIMA") %>%
e_tooltip(trigger = "axis") %>%
e_title("Patrimônio Líquido por Tipo ANBIMA ao Longo do Tempo") %>%
e_x_axis(name = "Competência",type = "time") %>%
e_y_axis(name = "Custódia (em bilhões)") %>%
e_legend(
orient = "horizontal",
bottom = 10,
left = "center"
%>%
) e_grid(
bottom = 120,
top = 60
)
Entre as categorias analisadas, os fundos de Renda Fixa Duração Livre Grau de Investimento se destacam como uma das classes que mais cresceu nos últimos anos, especialmente a partir de 2021, assumindo uma participação significativa no total. Da mesma forma, os fundos de Renda Fixa Duração Livre Soberano também apresentaram expansão expressiva, principalmente após 2020, refletindo a busca por alternativas mais flexíveis dentro da renda fixa.
Os fundos de Renda Fixa Duração Baixa Soberano e Renda Fixa Duração Baixa Grau de Investimento mantêm uma presença constante e relevante ao longo do tempo. Destaca-se que o fundo soberano sofreu variações mais marcantes em certos períodos, como uma queda perceptível em 2021 seguida de uma posterior recuperação. Já as categorias de Renda Fixa Simples e Outros mostram trajetórias distintas: enquanto os “Outros” crescem de forma estável, os fundos “Simples” surgem mais recentemente no gráfico, apresentando uma evolução rápida e relevante.
Por fim, os fundos de Renda Fixa Duração Livre Crédito Livre e Renda Fixa Indexados possuem participação menor no total, mas também mostram crescimento consistente, com destaque para o primeiro, que vem ganhando espaço de forma gradual. Em resumo, o gráfico revela um mercado de fundos de renda fixa em expansão no Brasil, com destaque para fundos de duração livre, que oferecem maior flexibilidade de gestão e têm atraído cada vez mais recursos, possivelmente em resposta à volatilidade econômica e à busca por rentabilidade com controle de risco.
Por último, vamos analisar as rentabilidades anuais em comparação com o CDI, o principal benchmark desse mercado, além de observar como as rentabilidades desses fundos estão distribuídas. Para isso, optamos por excluir da amostra todos os fundos que apresentaram uma rentabilidade anual acima de 50% em qualquer período. Dada a natureza dos fundos de renda fixa, rentabilidades superiores a 50% tendem a ser pouco realistas ou situações muito pontuais, tema que aprofundaremos em postagens futuras.
Mostrar código
%>%
fundos_rf mutate(Competência = as.yearqtr(DT_COMPTC)) %>%
filter(Competência >= "2010 Q1" & Competência <= "2024 Q4") %>%
select(DT_COMPTC, CNPJ_FUNDO, VL_QUOTA) %>%
mutate(Ano = lubridate::year(DT_COMPTC)) %>%
arrange(Ano, CNPJ_FUNDO, DT_COMPTC) %>%
summarise(`Rent (%)` = ((last(VL_QUOTA)/first(VL_QUOTA)) - 1)*100,
.by = c("Ano", "CNPJ_FUNDO")) %>%
left_join(
%>%
fundos_rf distinct(CNPJ_FUNDO, `Tipo ANBIMA`) %>%
mutate(
`Tipo ANBIMA` = case_when(
`Tipo ANBIMA` %in% c(
"Renda Fixa Duração Livre Crédito Livre",
"Renda Fixa Duração Livre Grau de Investimento",
"Renda Fixa Duração Baixa Grau de Investimento",
"Renda Fixa Duração Livre Soberano",
"Renda Fixa Duração Baixa Soberano",
"Renda Fixa Indexados",
"Renda Fixa Simples"
~ `Tipo ANBIMA`,
) TRUE ~ "Outros"
))%>%
) left_join(
::get_series(4391) %>%
rbcbmutate(Ano = lubridate::year(date)) %>%
filter(Ano >= 2010) %>%
summarise(CDI = last((cumprod((`4391`/100)+1)-1)*100),
.by = Ano)
-> rentabilidade_anual_fundos_rf
)
%>%
rentabilidade_anual_fundos_rf mutate(Outlier = case_when(`Rent (%)` > 50 | `Rent (%)` < -50 ~ "Out",
.default = "In")) %>%
filter(Outlier == "Out") %>%
distinct(CNPJ_FUNDO) -> fundos_out
<- rentabilidade_anual_fundos_rf %>%
linhas_cdi filter(`Tipo ANBIMA` %in% c(
"Renda Fixa Duração Livre Crédito Livre",
"Renda Fixa Duração Livre Grau de Investimento",
"Renda Fixa Duração Baixa Grau de Investimento",
"Renda Fixa Duração Livre Soberano"
%>%
)) distinct(`Tipo ANBIMA`, Ano, CDI) %>%
mutate(
x = as.factor(Ano),
x_num = as.numeric(x)
)
%>%
rentabilidade_anual_fundos_rf filter(!CNPJ_FUNDO %in% fundos_out$CNPJ_FUNDO) %>%
filter(`Tipo ANBIMA` %in% c(
"Renda Fixa Duração Livre Crédito Livre",
"Renda Fixa Duração Livre Grau de Investimento",
"Renda Fixa Duração Baixa Grau de Investimento",
"Renda Fixa Duração Livre Soberano")) %>%
ggplot(aes(x = factor(Ano), y = `Rent (%)`)) +
geom_violin(fill = "skyblue", color = "gray30", alpha = 0.8, draw_quantiles = c(0.25, 0.5, 0.75)) +
geom_segment(
data = linhas_cdi,
aes(x = x_num - 0.6, xend = x_num + 0.6, y = CDI, yend = CDI),
color = "red", linewidth = 0.6,
inherit.aes = FALSE
+
) facet_wrap(~ `Tipo ANBIMA`, scales = "free_y", ncol = 2) +
labs(
title = "Distribuição da Rentabilidade por Tipo ANBIMA e Ano",
x = "Ano",
y = "Rentabilidade (%)"
+
) theme_minimal(base_size = 12) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
strip.text = element_text(face = "bold"),
panel.spacing = unit(1, "lines")
)
A distribuição da rentabilidade anual dos fundos de Renda Fixa, segundo a classificação ANBIMA, entre 2010 e 2024, revela padrões distintos de comportamento entre os diferentes tipos de estratégias. Os dados, representados em gráficos do tipo violino, permitem observar tanto a mediana dos retornos quanto a dispersão e densidade dos resultados ao longo do tempo.
Os fundos de Renda Fixa Duração Baixa Grau de Investimento apresentaram, de forma geral, retornos historicamente positivos e consistentes. Entre 2010 e 2019, as medianas de rentabilidade mantiveram-se majoritariamente entre 7% e 12%, com baixa dispersão, indicando um perfil de risco mais conservador. A partir de 2020, observa-se uma leve redução na mediana e um aumento na variabilidade dos retornos. Em 2024, entretanto, há uma recuperação, com boa concentração de retornos positivos.
No caso dos fundos de Renda Fixa Duração Livre Crédito Livre, verifica-se uma rentabilidade historicamente mais volátil. Embora alguns anos, como 2013 a 2017, tenham registrado medianas elevadas (acima de 10%), os períodos de 2021 e 2022 marcaram fortes perdas para muitos fundos da categoria. Em 2024, a mediana volta a ser positiva, ainda que com ampla dispersão entre os fundos, o que sinaliza uma recuperação heterogênea dentro do segmento.
Os fundos de Renda Fixa Duração Livre Grau de Investimento seguiram trajetória semelhante à dos de duração baixa, com rentabilidades estáveis e positivas até 2019. A partir de 2020, o cenário se altera, com redução das medianas e aumento na dispersão dos resultados, indicando maior influência das condições macroeconômicas sobre o desempenho. Os anos de 2022 e 2023 registram medianas próximas de zero, com recuperação parcial em 2024, mas ainda acompanhada de significativa variabilidade entre os fundos.
Por fim, os fundos de Renda Fixa Duração Livre Soberano, historicamente mais previsíveis e conservadores, também passaram a apresentar maior volatilidade a partir de 2017. Houve anos de retorno negativo, como em 2020 e 2021, e a mediana de rentabilidade manteve-se em patamares mais baixos nos últimos anos. Em 2024, observa-se leve recuperação, embora com alta dispersão, possivelmente refletindo diferentes estratégias adotadas dentro da própria categoria.
Em síntese, os dados mostram que, mesmo entre os fundos de perfil mais conservador, houve aumento da dispersão e redução na previsibilidade dos retornos após 2020. Esse cenário reflete os desafios enfrentados pelo mercado de renda fixa nos últimos anos, incluindo oscilações na taxa de juros, incertezas macroeconômicas e reavaliações de risco de crédito. Ainda assim, o ano de 2024 apresenta sinais de retomada da rentabilidade em todas as categorias, embora com comportamentos bastante distintos entre os fundos.
Mostrar código
<- rentabilidade_anual_fundos_rf %>%
linhas_cdi filter(!`Tipo ANBIMA` %in% c(
"Renda Fixa Duração Livre Crédito Livre",
"Renda Fixa Duração Livre Grau de Investimento",
"Renda Fixa Duração Baixa Grau de Investimento",
"Renda Fixa Duração Livre Soberano"
%>%
)) distinct(`Tipo ANBIMA`, Ano, CDI) %>%
mutate(
x = as.factor(Ano),
x_num = as.numeric(x)
)
%>%
rentabilidade_anual_fundos_rf filter(!CNPJ_FUNDO %in% fundos_out$CNPJ_FUNDO) %>%
filter(!`Tipo ANBIMA` %in% c(
"Renda Fixa Duração Livre Crédito Livre",
"Renda Fixa Duração Livre Grau de Investimento",
"Renda Fixa Duração Baixa Grau de Investimento",
"Renda Fixa Duração Livre Soberano")) %>%
ggplot(aes(x = factor(Ano), y = `Rent (%)`)) +
geom_violin(fill = "skyblue",
color = "gray30",
alpha = 0.8,
draw_quantiles = c(0.25, 0.5, 0.75)) +
geom_segment(
data = linhas_cdi,
aes(x = x_num - 0.6, xend = x_num + 0.6, y = CDI, yend = CDI),
color = "red", linewidth = 0.6,
inherit.aes = FALSE
+
) facet_wrap(~ `Tipo ANBIMA`, scales = "free_y", ncol = 2) +
labs(
title = "Distribuição da Rentabilidade por Tipo ANBIMA e Ano",
x = "Ano",
y = "Rentabilidade (%)"
+
) theme_minimal(base_size = 12) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
strip.text = element_text(face = "bold"),
panel.spacing = unit(1, "lines")
)
A categoria Outros engloba fundos de Renda Fixa que não se enquadram nas classificações padronizadas da ANBIMA, podendo incluir estratégias mais específicas ou híbridas. A rentabilidade média ao longo dos anos foi positiva, com medianas geralmente entre 7% e 15%, demonstrando relativa consistência. Em certos anos, como 2013, 2018 e 2022, a dispersão dos retornos foi mais acentuada, indicando uma maior heterogeneidade entre os fundos da categoria. Em 2024, a rentabilidade permanece positiva, com uma distribuição moderadamente ampla.
A classe Renda Fixa Duração Baixa Soberano apresenta um histórico de retornos estáveis e conservadores, condizente com a alocação predominante em títulos públicos de curto prazo. As medianas de rentabilidade permanecem entre 7% e 10% na maior parte dos anos, com baixa variação entre os fundos. A partir de 2023, os retornos voltam a se alinhar ao padrão histórico, sugerindo uma normalização após o período de instabilidade econômica.
Os fundos da categoria Renda Fixa Indexados, que acompanham índices de preços ou de mercado, apresentaram uma maior variabilidade nos resultados, tanto em dispersão quanto em mediana. Em diversos anos, como 2013, 2015 e 2020, observa-se ampla faixa de rentabilidade — com fundos registrando desde perdas até ganhos superiores a 25%. A mediana dos retornos caiu acentuadamente entre 2020 e 2022, com início de recuperação observado em 2023 e 2024.
A categoria Renda Fixa Simples, voltada para investidores de perfil conservador, apresentou menor dispersão e retornos mais modestos ao longo do tempo. As medianas de rentabilidade oscilaram entre 5% e 10%, com exceção dos anos entre 2020 e 2022, quando houve queda significativa. A partir de 2023, nota-se uma recuperação consistente, com as medianas retornando à faixa de 10% e menor variação entre os fundos.
Em síntese, enquanto categorias como Renda Fixa Simples e Renda Fixa Duração Baixa Soberano mantêm um comportamento mais previsível e conservador, outras, como Renda Fixa Indexados e Outros, apresentam maior volatilidade. Apesar das dificuldades enfrentadas entre 2020 e 2022, os anos de 2023 e 2024 indicam uma retomada generalizada da rentabilidade nos fundos de Renda Fixa, ainda que com diferentes padrões de dispersão, refletindo o perfil e a estratégia específica de cada classe.
Conclusões
Podemos analisar aqui um pouco do perfil dos fundos de investimento de renda fixa. A ideia é apresentar um enfoque didático sobre o processo de análise de dados, sem aprofundar demasiadamente o tema nesta etapa. Ao longo do tempo, pretendo desenvolver estudos mais completos, focando na extração de insights a partir dos dados e menos na parte técnica do código.
Gostaria de destacar alguns pontos. Em primeiro lugar, constatamos que a maioria dos fundos de renda fixa adota políticas de investimento ativas e não referenciadas. Isso desperta a curiosidade acerca do motivo pelo qual, mesmo sendo uma categoria naturalmente atrelada às taxas de juros, os fundos optam por se classificar dessa maneira.
Outro aspecto notável diz respeito à distribuição dos retornos. Embora grande parte deles se concentre próxima ao CDI, ocorrem distorções significativas tanto para cima quanto para baixo. Surge então a questão de saber se essas discrepâncias são inerentes à indústria ou se podem refletir inconsistências nos dados. Uma análise mais aprofundada será necessária para entender melhor essa dinâmica.
Encerro aqui nossa análise e fico à disposição para discutirmos qualquer aspecto do código ou dos dados. No próximo post, trataremos agora dos fundos multimercados. Agradeço a todos que dedicaram um tempo para ler este texto e nos encontramos em breve.