Extraindo dados das suas notas de corretagem em compra e venda de ações com R

Neste post mostramos como ler e extrair informações de uma nota de corretagem (padrão SINACOR) no R.

Miguel Cleaver
06-17-2020

Com os juros em queda, o mercado de ações tem ganhado atratividade. Operações de compra e venda de ações exigem que a pessoa física tenha controle de suas operações, de seus prejuízos e de seus lucros, seja porque é necessário apurar o imposto de renda, seja porque deseja-se acompanhar o próprio desempenho no mercado de ações.

Um procedimento comum para fazer o controle consiste em criar uma planilha e lançar as operações manualmente. É um procedimento relativamente tranquilo se a pessoa opera com pouca frequência. Contudo, à medida que a frequência de operações aumenta, o trabalho aumenta e a ideia de automatizar o processo se torna interessante. Nos procedimentos manuais ainda existe o risco de se lançar um valor errado (errar é da natureza humana), o que reforça a ideia de que seria interessante ter esse processo automatizado.

Neste post não veremos como automatizar esse processo, mas mostraremos como ler uma nota de corretagem (extensão em pdf) para dentro do R e extrair e organizar as informações da nota em um data frame. A partir do entendimento de como ler uma nota por meio do R se torna mais fácil visualizar como automatizar o processo. Basicamente, é necessário criar uma função e iterá-la para cada nota de corretagem.

Para este post usaremos como referência uma nota de corretagem da Clear com apenas uma operação relativa ao mercado de ações (padrão SINACOR). Além disso, é importante ressaltar que os dados da nota que usaremos foram mascarados, enquanto outros foram modificados.

Para replicar os resultado deste post, o ideal é que você use uma nota da Clear com apenas uma operação, mas se não tiver nenhuma nota de corretagem da Clear, use uma nota de corretagem no padrão SINACOR de outra corretora e é bem possível que com pequenos ajustes no código você consiga ler a sua nota.

Primeiros passos

Crie um projeto no Rstudio. Se possível selecione uma nota de corretagem (o arquivo deve ter extensão pdf) com apenas uma operação (de ações) e coloque na pasta que você acabou de criar o projeto.

Agora crie um script de R. Nele você fará os experimentos que iremos desenvolver aqui.

Leitura do pdf e padronização

Além do pacote tidyverse, carreguemos também o pacote readtext, o qual nos ajudará com a leitura do pdf.


library(tidyverse)
library(readtext)

Se você seguiu os passos até aqui corretamente, o objeto de nome arquivo deve ter tamanho 1 e deve ter o nome da nota de corretagem que você quer ler.


arquivo <- list.files(pattern = "pdf$")

length(arquivo)

[1] 1

Para ler a nota vamos fazer o seguinte:


out <- readtext(arquivo)[[2]]

Ao dar print no objeto out você verá a nota de corretagem no console do R com uma formatação cheia de \r, \n e espaços. Abaixo, basta rolar a barra de rolagem para a direita para ver como nossa nota foi lida para dentro do R. Observa-se que um dos problemas de trazer a nota para o R é que as informações estão completamente desorganizadas. Isso não é culpa do R, mas da estrutura do PDF.


print(out)

[1] "                                            NOTA DE CORRETAGEM\r\n                                                                                                                                                                                 Nr. nota              Folha     Data pregão\r\n                                                                                                                                                                                      00000010                1      18/06/2020\r\n                                                  CLEAR CORRETORA - GRUPO XP\r\n                                                  Av. Presidente Juscelino Kubitschek - Torre Sul, 1909 - 29º ANDAR VILA OLIMPIA                                   4543-907                            SAO PAULO - SP\r\n                                                  Tel. 4003-6245 Fax: (55 ) -\r\n                                                  Internet: www.clear.com.br SAC: 0800-774-0404                                                                    e-mail: atendimento@clear.com.br\r\n                                                  C.N.P.J: 02.332.886/0011-78                                                                                      Carta Patente:\r\n                                                  Ouvidoria: Tel. 0800.774.0404                                                                                    e-mail ouvidoria: ouvidoria@clear.com.br\r\nCliente                                                                                                                                                                        C.P.F./C.N.P.J/C.V.M./C.O.B.\r\n  0000xx                                            FULANO DA SILVA                                                                                         000.000.000-00\r\n                                                     ENDEREÇO DO FULANO                                             Tel. (0xx) xxxx-xxxx           Código cliente                       Assessor\r\n                                                     CEP CIDADE DO FULANO                                                                                                              000-0 000xxxx                      0\r\nParticipante destino do repasse                                                                    Cliente                               Valor                                 Custodiante                                C.I\r\n                                                                                                   -                                     0                                                                                     N\r\nBanco           Agência                                   Conta corrente                           Acionista                             Administrador                         Complemento nome                           P. Vinc\r\nxxx             xxxxx                                     xxxx                                                                                                                                                                N\r\nNegócios realizados\r\n Q Negociação                    C/V Tipo mercado                       Prazo        Especificação do título                    Obs. (*) Quantidade            Preço / Ajuste         Valor Operação / Ajuste                  D/C\r\n       1-BOVESPA                   C VISTA                                           ITAUSA          PN ED N1                                              100                11,92                              1.192,00        D\r\nResumo dos Negócios                                                                                                             Resumo Financeiro\r\nDebêntures                                                                                                                 0,00 Clearing\r\nVendas à vista                                                                                                             0,00 Valor líquido das operações                                                        1.192,00       D\r\nCompras à vista                                                                                                       1.192,00  Taxa de liquidação                                                                       0,32     D\r\nOpções - compras                                                                                                           0,00 Taxa de Registro                                                                         0,00     D\r\nOpções - vendas                                                                                                            0,00 Total CBLC                                                                         1.192,32       D\r\nOperações à termo                                                                                                          0,00 Bolsa\r\nValor das oper. c/ títulos públ. (v. nom.)                                                                                 0,00 Taxa de termo/opções                                                                     0,00     D\r\nValor das operações                                                                                                   1.192,00  Taxa A.N.A.                                                                              0,00     D\r\n                                                                                                                                Emolumentos                                                                              0,04     D\r\n                                                                                                                                Total Bovespa / Soma                                                                     0,04     D\r\nEspecificações diversas                                                                                                         Corretagem / Despesas\r\n                                                                                                                                Clearing                                                                                 0,00 D\r\n                                                                                                                                Execução                                                                                 0,00\r\nA coluna Q indica liquidação no Agente do Qualificado.                                                                          Execução casa                                                                            0,00\r\n                                                                                                                                Impostos                                                                                 0,00\r\n                                                                                                                                I.R.R.F. s/ operações, base R$0,00                                                       0,00\r\n                                                                                                                                Outras Bovespa                                                                           0,00 D\r\n                                                                                                                                Total corretagem / Despesas                                                              0,00 D\r\n (*) Observações                                             A - Posição futuro                  T - Liquidação pelo Bruto      Líquido para                                                             1.192,36 D\r\n                                                                                                                                Observação: (1) As operações a termo não são computadas no líquido da fatura.\r\n 2 - Corretora ou pessoa vinculada atuou na contra parte.    C - Clubes e fundos de Ações        I - POP\r\n # - Negócio direto                                          P - Carteira Própria\r\n 8 - Liquidação Institucional                                H - Home Broker\r\n D - Day Trade                                               X - Box\r\n F - Cobertura                                               Y - Desmanche de Box\r\n B - Debêntures                                              L - Precatório\r\nCapitais e regiões metropolitanas: 4003-6245 Demais localidades: 0800-887-9107 SAC: 0800-774-0404 Ouvidoria: 0800-200-5550\r\n"

Assim, primeiramente vamos buscar padronizar esse objeto por meio da eliminação de espaços desnecessários e da transformação de todas as letras para caixa baixa.


out <- out %>% 
  str_squish() %>% 
  str_to_lower()

out

[1] "nota de corretagem nr. nota folha data pregão 00000010 1 18/06/2020 clear corretora - grupo xp av. presidente juscelino kubitschek - torre sul, 1909 - 29º andar vila olimpia 4543-907 sao paulo - sp tel. 4003-6245 fax: (55 ) - internet: www.clear.com.br sac: 0800-774-0404 e-mail: atendimento@clear.com.br c.n.p.j: 02.332.886/0011-78 carta patente: ouvidoria: tel. 0800.774.0404 e-mail ouvidoria: ouvidoria@clear.com.br cliente c.p.f./c.n.p.j/c.v.m./c.o.b. 0000xx fulano da silva 000.000.000-00 endereço do fulano tel. (0xx) xxxx-xxxx código cliente assessor cep cidade do fulano 000-0 000xxxx 0 participante destino do repasse cliente valor custodiante c.i - 0 n banco agência conta corrente acionista administrador complemento nome p. vinc xxx xxxxx xxxx n negócios realizados q negociação c/v tipo mercado prazo especificação do título obs. (*) quantidade preço / ajuste valor operação / ajuste d/c 1-bovespa c vista itausa pn ed n1 100 11,92 1.192,00 d resumo dos negócios resumo financeiro debêntures 0,00 clearing vendas à vista 0,00 valor líquido das operações 1.192,00 d compras à vista 1.192,00 taxa de liquidação 0,32 d opções - compras 0,00 taxa de registro 0,00 d opções - vendas 0,00 total cblc 1.192,32 d operações à termo 0,00 bolsa valor das oper. c/ títulos públ. (v. nom.) 0,00 taxa de termo/opções 0,00 d valor das operações 1.192,00 taxa a.n.a. 0,00 d emolumentos 0,04 d total bovespa / soma 0,04 d especificações diversas corretagem / despesas clearing 0,00 d execução 0,00 a coluna q indica liquidação no agente do qualificado. execução casa 0,00 impostos 0,00 i.r.r.f. s/ operações, base r$0,00 0,00 outras bovespa 0,00 d total corretagem / despesas 0,00 d (*) observações a - posição futuro t - liquidação pelo bruto líquido para 1.192,36 d observação: (1) as operações a termo não são computadas no líquido da fatura. 2 - corretora ou pessoa vinculada atuou na contra parte. c - clubes e fundos de ações i - pop # - negócio direto p - carteira própria 8 - liquidação institucional h - home broker d - day trade x - box f - cobertura y - desmanche de box b - debêntures l - precatório capitais e regiões metropolitanas: 4003-6245 demais localidades: 0800-887-9107 sac: 0800-774-0404 ouvidoria: 0800-200-5550"

A seguir veremos que, apesar das informações desorganizadas, ainda será possível extrair informações da nota de corretagem.

Extração de dados

Agora podemos extrair as informações relevantes sobre nossa nota. Vamos supor que o nosso primeiro objetivo seja extrair o número da nota e a data do pregão. Como podemos fazer isso? Se você inspecionar o objeto out no console do R verá que o número da nota aparece imediatamente depois do termo “data pregão” e a data do pregão (formato dd/mm/aaaa) aparece depois do número da nota, mas antes do termo “clear corretora”. Com um pouco de conhecimento de regex, podemos fazer o seguinte:


info_nota <- out %>% 
  str_extract("data pregão .+?(clear)")

info_nota

[1] "data pregão 00000010 1 18/06/2020 clear"

No objeto info_nota temos as duas informações que queremos. O número da nota e a data do pregão. Abaixo mostramos uma das formas de extrair cada uma das informações.


numero_nota <- info_nota %>% 
  str_extract("data pregão [0-9\\/\\.]+") %>% 
  str_extract("[0-9\\/\\.]+")

data_pregao <- info_nota %>% 
  str_extract("[0-9]{2}/[0-9]{2}/[0-9]{4}")

Uma observação que pode não ter ficado clara é que nós sabemos que 00000010 é o número da nota a partir da nota original no formato pdf.


print(numero_nota)

[1] "00000010"

Da mesma forma, sabemos que a data do pregão é a data contida na string info_nota, pois é assim que consta na nota original. É importante bater as correspondências com a nota original para saber onde a informação se encontra no string que criamos.


print(data_pregao)

[1] "18/06/2020"

Agora vamos para o que de fato importa. Ao analisar o objeto out é possível notar que os dados da operação da nota de corretagem estão entre o termo “q negociação” e “resumo dos negócios” (isso será mais fácil de ver no seu próprio console do R). Portanto, uma forma de obter os dados de nossa operação consiste em fazer o seguinte:


dados_operacao <- out %>% 
  str_extract("q negociação.+(resumo dos negócios)") %>% 
  str_extract("(?<=c ).+") %>% 
  str_split("(?<=[0-9] )[cd]{1} ") %>% 
  .[[1]] %>% 
  .[1] %>% 
  str_squish()

dados_operacao

[1] "1-bovespa c vista itausa pn ed n1 100 11,92 1.192,00"

Se você inspecionar o objeto dados_operacao notará que é um segmento de texto que começa com “1-bovespa” e termina com o valor da transação. Em seguida, é necessário remover os pontos dos números, pois para nós os pontos são separadores de milhares, mas para o R os pontos indicam o início da parte decimal dos números. Se sua operação foi abaixo dos R$ 1000 não haverá separador de milhares, mas ainda assim é interessante manter o código abaixo para o caso de quando isso aconteça.


string <- dados_operacao %>% 
  str_remove_all("\\.")

string

[1] "1-bovespa c vista itausa pn ed n1 100 11,92 1192,00"

Agora vamos extrair o “c” (compra) ou “v” (venda) da nossa operação com:


cv <- string %>% 
  str_extract("(?<= )[cv]{1}(?= )")

cv

[1] "c"

Por fim, extraímos o nome da empresa e os valores de quantidade, preço e valor:


tipo_mercado <- "vista"

padrao_temp <- paste0("(?<=", tipo_mercado, " ).+?(?= [0-9]+ [0-9]+,)")

especificacao_titulo <- string %>% 
  str_extract(padrao_temp)

padrao_temp <- paste0("(?<=", especificacao_titulo, ").+")

valores <- string %>% 
  str_extract(padrao_temp) %>% 
  str_extract_all("(?<= )[0-9,\\.]+") %>% 
  .[[1]]
  
quantidade <- valores[1] %>% 
  as.numeric()

preco <- valores[2] %>% 
  str_replace(",", ".") %>% 
  as.numeric()

valor <- valores[3] %>% 
  str_remove("\\.") %>% 
  str_replace(",", ".") %>% 
  as.numeric()

A partir do código acima, podemos construir um objeto com as informações que extraímos:


operacoes <- tibble(
  numero = numero_nota,
  data = data_pregao,
  compra_venda = cv,
  tipo_mercado = tipo_mercado,
  especificacao_titulo = especificacao_titulo,
  quantidade = quantidade,
  preco = preco,
  valor = valor
)

rmarkdown::paged_table(operacoes)  

Conclusão

Neste post mostramos como ler uma nota de corretagem da Clear. Adicionalmente, requisitamos que a nota contenha apenas uma operação (de ações). Com isso, esperamos ter simplificado o exercício o suficiente tornar o aprendizado mais fácil. Até a próxima!

via GIPHY

Citation

For attribution, please cite this work as

Cleaver (2020, June 17). Fulljoin: Extraindo dados das suas notas de corretagem em compra e venda de ações com R. Retrieved from https://www.fulljoin.com.br/posts/2020-06-17-leitura-de-notas-de-corretagem/

BibTeX citation

@misc{cleaver2020extraindo,
  author = {Cleaver, Miguel},
  title = {Fulljoin: Extraindo dados das suas notas de corretagem em compra e venda de ações com R},
  url = {https://www.fulljoin.com.br/posts/2020-06-17-leitura-de-notas-de-corretagem/},
  year = {2020}
}