No começo deste ano a BM&FBovespa publicou o tweet abaixo:
Bem, eu achei R$ 46 bi muita grana e decidi utilizar o pacote rbmfbovespa para realizar um exercício de validação desta informação. Para quem não conhece, ETF significa Exchanged Traded Funds e são fundos de ações que são negociados em bolsa, diferentes dos fundos de ações de cotas os quais montam uma carteira de ativos e vendem cotas.
A BM&FBovespa divulga arquivos de cotações históricas, os famigerados arquivos de comprimento fixo (FWF) COTAHIST. Estes arquivos são encontrados no site da empresa na seção de séries históricas do mercado a vista. Os dados históricos podem ser baixados em:
- séries anuais
- séries mensais
- séries diárias (do ano corrente)
Em particular os arquivos anuais são interessantes, apesar de grandes, por estarem disponíveis desde 1986.
Poucas séries no Brasil são disponíveis com históricos tão longos.
Para este exercício eu baixei o arquivo anual de 2016: COTAHIST_A2016.TXT
.
Antes de começar vamos carregar os pacotes utilizados: dplyr
e rbmfbovespa
.
library(dplyr)
library(rbmfbovespa)
Para ler o arquivo de cotações históricas utilizo o template COTAHIST
na função read_marketdata
.
ch_2016 <- read_marketdata('datasets/COTAHIST_A2016.TXT', 'COTAHIST')
ch_2016
## Part 1: Header [1 obs. of 5 variables]
## Part 2: Cotações históricas por papel-mercado [466734 obs. of 26 variables]
## Part 3: Trailer [1 obs. of 6 variables]
Como é possível observar acima, este dataset possui 3 partes: Header, Trailer e Cotações históricas por papel-mercado, e está última contém toda a informação de interesse com aproximadamente 500K linhas e 26 variáveis.
Tipos retornados pela função
read_marketdata
A função
read_marketdata
retorna 2 estruturas de dados:
data.frame
com as variáveis do datasetlist
contendodata.frame
em cada elemento para arquivos que possuam tratamentos distintos em partes diferentes dos arquivos
Vou utilizar ch_2016[[2]]
na análise pois a Part 2 contém as informações de interesse.
Na Part 2 encontro informações para todos os ativos negociado no segmento de ações da BM&FBovespa no ano de 2016.
O exercício é para validar as informações apenas das ETFs, portanto é necessário filtrar o dataset ch_2016[[2]]
para obter apenas as informações sobre ETFs.
No site da bolsa eu encontrei uma listagem com todas as ETFs
São 15 ETFs negociadas na bolsa.
O dataset ch_2016
possui 26 variáveis e para filtrar as inforações sobre ETFs eu vou utilizar os 3 filtros abaixo:
especificacao == 'CI'
porqueCI
identifica todos os ativos que são fundos de investimento, como as ETFstipo_mercado == 10
que identifica o mercado à vista (ainda há o mercado fracionário, de opções, de termo, futuros e outros)nome_empresa ~ ^(BB ETF|CAIXAETF|ISHARE|IT NOW)
o nome da empresa representa o nome do fundo e como se observa na tabela acima estes padrões cobrem todos as possibilidades.
etfs <- ch_2016[[2]] %>% filter(especificacao == 'CI',
tipo_mercado == 10,
stringr::str_detect(nome_empresa, "^(BB ETF|CAIXAETF|ISHARE|IT NOW)"))
Para verificar se eu obtive todas as ETFs que me interessam eu vou fazer um agrupamento pelas variáveis cod_negociacao
e nome_empresa
e aproveitando eu vou realizar uma contagem para saber quantos dias no ano de 2016 as ETFs apresentaram informações de negociação.
etfs %>%
group_by(cod_negociacao, nome_empresa) %>%
summarise(Count = n()) %>%
arrange(nome_empresa) %>%
formattable::formattable()
cod_negociacao | nome_empresa | Count |
---|---|---|
BBSD11 | BB ETF SP DV | 238 |
XBOV11 | CAIXAETFXBOV | 239 |
IVVB11 | ISHARE SP500 | 249 |
BOVA11 | ISHARES BOVA | 249 |
BRAX11 | ISHARES BRAX | 225 |
ECOO11 | ISHARES ECOO | 228 |
SMAL11 | ISHARES SMAL | 248 |
BOVV11 | IT NOW IBOV | 64 |
DIVO11 | IT NOW IDIV | 249 |
FIND11 | IT NOW IFNC | 223 |
GOVE11 | IT NOW IGCT | 242 |
MATB11 | IT NOW IMAT | 153 |
ISUS11 | IT NOW ISE | 246 |
PIBB11 | IT NOW PIBB | 249 |
SPXI11 | IT NOW SPXI | 245 |
O dataset etfs
possui todas as ETFs negociadas na bolsa, agora vou fazer uma agregação em todo o dataset somando as variáveis volume_titulos_negociados
e qtd_negocios
para verificar os dados publicados no tweet.
etfs %>%
summarise(Volume = sum(volume_titulos_negociados), Negocios = sum(qtd_negocios)) %>%
formattable::formattable(list(Volume = formattable::accounting, Negocios = formattable::accounting))
Volume | Negocios |
---|---|
46,458,279,244.30 | 2,864,856.00 |
Como é possível observar, preciso até a última casa!
Podemos ainda fazer o mesmo cálculo agregando novamente pelas variáveis cod_negociacao
e nome_empresa
para descobrir os volumes negociados em cada ativo.
etfs %>%
group_by(cod_negociacao, nome_empresa) %>%
summarise(Volume = sum(volume_titulos_negociados), Negocios = sum(qtd_negocios)) %>%
arrange(desc(Volume)) %>%
formattable::formattable(list(Volume = formattable::accounting, Negocios = formattable::accounting))
cod_negociacao | nome_empresa | Volume | Negocios |
---|---|---|---|
BOVA11 | ISHARES BOVA | 40,960,623,887.70 | 2,750,747.00 |
PIBB11 | IT NOW PIBB | 3,334,920,436.20 | 59,653.00 |
IVVB11 | ISHARE SP500 | 865,491,458.00 | 15,002.00 |
BOVV11 | IT NOW IBOV | 381,199,179.40 | 452.00 |
XBOV11 | CAIXAETFXBOV | 350,015,104.90 | 8,540.00 |
SPXI11 | IT NOW SPXI | 266,412,365.00 | 13,447.00 |
SMAL11 | ISHARES SMAL | 131,108,309.40 | 4,428.00 |
ECOO11 | ISHARES ECOO | 50,070,769.00 | 1,147.00 |
DIVO11 | IT NOW IDIV | 35,010,537.50 | 4,588.00 |
FIND11 | IT NOW IFNC | 28,748,255.70 | 1,682.00 |
ISUS11 | IT NOW ISE | 16,991,882.90 | 2,149.00 |
BRAX11 | ISHARES BRAX | 13,296,683.40 | 824.00 |
MATB11 | IT NOW IMAT | 8,606,861.20 | 524.00 |
GOVE11 | IT NOW IGCT | 8,202,764.30 | 868.00 |
BBSD11 | BB ETF SP DV | 7,580,749.70 | 805.00 |
O BOVA11 disparado na frente com o maior volume e quantidade de negócios. Até o sexto ETF, todos representam índices de ações conhecidos. Os ETFs BOVA11, BOVV11, XBOV11 tem o IBOVESPA como índice de referência, já os IVVB11 e SPXI11 tem o SP500 e o PIBB11 o IBrX-50. Os demais não estão diretamente relacionados a nenhum índice e apresentam motivações distintas formando carteiras com ações que pagam dividendos, ações de empresas sustentáveis, empresas do governo e por aí vai.