Giter Site home page Giter Site logo

guilhermecgs / ir Goto Github PK

View Code? Open in Web Editor NEW
166.0 17.0 45.0 390 KB

Projeto de calculo de Imposto de Renda em operacoes na bovespa automaticamente. Tags:canal eletronico do investidor, CEI, selenium, bovespa, IRPF, IR, imposto de renda, finance, yahoo finance, acao, fii, etf, python, crawler, webscraping, calculadora ir

License: Mozilla Public License 2.0

Python 99.38% Makefile 0.62%
imposto-de-renda cei bovespa canal-eletronico-investidor irpf finance b3 fii acoes calculadora-ir

ir's Introduction

ir - Projeto de calculo de Imposto de Renda em operacoes na bovespa automaticamente

o que se propoe a fazer

  • Automaticamente busca todos as suas operacoes na bolsa no site do canal eletronico do investidor (CEI) (https://cei.b3.com.br/)
  • Apos buscar os trades no CEI, salva tudo em um arquivo csv no dropbox da sua conta
  • Todo dia 5 de cada mes executa e calcula (automaticamente):
    • Preco medio de compra
    • Preco medio de venda
    • Lucro/Prejuizo no mes
    • IR a pagar, ja considerando o possivel prejuizo acumulado
    • Tabela com a custodia atual para conferencia
    • Envia email com todas as informacoes para voce pagar o imposto
  • A ideia é ser TUDO automatico, mas ainda ter a opcao de voce manualmente ter controle de tudo via um arquivo csv caso algum papel sofra desdobramento ou mude o ticker de negociacao
  • Funciona com FIIs, ETFs, Acoes e Opcoes. Em desenvolvimento (FIP, FIPIE, Futuros)
  • Funciona com qualquer corretora. (Na verdade, nao depende da corretora)
  • Como alternativa a busca automática no CEI, é possível exportar as negociações manualmente para Excel (XSLX) e importar na aplicação

o que voce vai precisar

exemplo do relatorio gerado no seu email

https://github.com/guilhermecgs/ir/blob/master/exemplo_relatorio_automatico.pdf

Exemplo de variáveis de ambiente:

  • DROPBOX_FILE_LOCATION:/Finance/GCGS/export_operacoes_gcgs.txt
  • DROPBOX_API_KEY:jOznaw_xxxxxxxxxxxxxxxxxxxxtkw9ox_a9I_8-_aU2xw1xxxxxxxxxxKWek69Z
  • SEND_TO:[email protected]
  • CPF:00098765434
  • SENHA_CEI:minha_senha_cei
  • SMTP_USER=[email protected]
  • SMTP_PASSWORD=passkkk
  • SMTP_SERVER=smtp.elasticemail.com
  • SMTP_PORT=2525

Além da definição das configurações do sistema via variáveis de ambiente, também é possível utilizar um arquivo de configuração .env:

DROPBOX_FILE_LOCATION=/Finance/GCGS/export_operacoes_gcgs.txt
DROPBOX_API_KEY=jOznaw_xxxxxxxxxxxxxxxxxxxxtkw9ox_a9I_8-_aU2xw1xxxxxxxxxxKWek69Z

Variáveis não definidas assumem os valores padrões definidos no arquivo config.py. Sendo que as únicas variáveis obrigatórias são: DROPBOX_FILE_LOCATION e DROPBOX_API_KEY.

Exemplo de importação manual de negociações

  1. Exporte as negociações do site da bovespa acessando https://www.investidor.b3.com.br/extrato/negociacao Extrato Negociações Exportar Negociações

  2. Copie o arquivo exportado para pasta importar

  3. Execute o comando para importar os arquivos: python ./ir.py --do importar_negociacoes

  4. Remova os arquivos da pasta importar

disclaimer

  • Aceito PRs :-) Eu fiz o software pensando em automatizar exatamente como eu fazia as coisas manualmente
  • Nao funciona com daytrade e aluguel de acoes/fii
  • Desconsidera custos e emolumentos para simplificação do calculo!

To do list

- Incluir desconto de taxas, emolumentos e dedo duro - http://www.b3.com.br/pt_br/produtos-e-servicos/tarifas/listados-a-vista-e-derivativos/renda-variavel/tarifas-de-acoes-e-fundos-de-investimento/a-vista/
- Incluir opcao completa ou so ultimos x meses

techstack

- python
- selenium
- gitlab ci
- beautifulsoap
- pandas

Exemplos de Ajustes manuais

Na maioria das vezes, nenhuma intervenção manual é necessária. Apenas algumas situaçoes (listadas abaixo) será preciso alterar alguma coisa no csv de dados de forma pontual. Geralmente só acrescentando uma linha a mais com a compra/venda já resolve.

  • Subscricao de titulos (nao existe essa informacao no cei; é necessário acrescentar uma linha com dos dados da compra)
  • Venda de direitos subscricao
  • IPOs
  • Mudança no ticker de negociacao
  • Desdobramento do ticker
  • Na primeira execução, é intessante bater a custódia calculada com o que aparece na sua corretora

tags

canal eletronico do investidor, CEI, selenium, bovespa, IRPF, IR, imposto de renda, finance, yahoo finance, acao, fii, etf, python, crawler, webscraping, calculadora ir

(algumas) fontes para consulta utilizadas

ir's People

Contributors

atatab avatar dependabot[bot] avatar guilhermecgs avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ir's Issues

Sugestões de desenvolvimento

Guilherme, bom dia,

Parabéns por sua iniciativa com este projeto, sensacional sua ideia.

Eu fiz muitas operações nestes meses e minhas notas de corretagem ficou uma bagunça.
Conseguir aproveitar o carregamento dos dados na CEI e organizar aqui minhas informações.

Os problemas que eu tive foram os seguintes:

  • Não reconheceu os Tickers de opções - eu removi manualmente para continuar rodando
  • Ocorreram operações que fiz mais de uma compra no mesmo dia com preços diferentes, não foi possível calcular o preço médio.
  • Poderia existir um filtro para operações de Day-trade, calcular o saldo remanescente dos papeis que ficam para os próximos dias. (Por exemplo: na minha estrategia de operação, entro comprado com 300 contratos, então no mesmo dia se a operação andar, faço parcial, vendo 200 contratos para reduzir o risco da operação e sobram 100 contratos para swing-trade).
  • Fazer o calculo de IR para daytrade seria muito bom.

-Gostaria muito de poder contribuir, fazer uma interface talvez para o usuário poder acompanhar seu desempenho, muitos traders carregam prejuízos que poderiam compensar no IR, mas é muito complicado fazer isso manualmente...

Valeu!

Erro no parsing

Primeiramente parabéns pela excelente ideia do projeto.

Meu "busca_tardes_e_faz_merge_operacoes" está retornando o seguinte erro que acredito ser de parsing(estou meio sem tempo pra olhar o código então estou abrindo essa issue)

DevTools listening on ws://127.0.0.1:5277/devtools/browser/6d52fa1e-2f52-4612-83e6-e3cb4d52f03e
[0228/180544.403:INFO:CONSOLE(0)] "Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.", source:  (0)
[0228/180544.409:INFO:CONSOLE(0)] "Creating Application Cache with manifest https://cei.b3.com.br/CEI_Responsivo/manifest/cei.appcache", source: https://cei.b3.com.br/CEI_Responsivo/ (0)
[0228/180544.412:INFO:CONSOLE(0)] "Application Cache Checking event", source: https://cei.b3.com.br/CEI_Responsivo/ (0)
[0228/180544.687:INFO:CONSOLE(0)] "Application Cache Error event: Manifest fetch failed (404) https://cei.b3.com.br/CEI_Responsivo/manifest/cei.appcache", source: https://cei.b3.com.br/CEI_Responsivo/ (0)
[0228/180601.151:INFO:CONSOLE(0)] "Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.", source:  (0)
[0228/180601.322:INFO:CONSOLE(0)] "Creating Application Cache with manifest https://cei.b3.com.br/CEI_Responsivo/manifest/cei.appcache", source: https://cei.b3.com.br/CEI_Responsivo/home.aspx (0)
[0228/180601.354:INFO:CONSOLE(0)] "Application Cache Checking event", source: https://cei.b3.com.br/CEI_Responsivo/home.aspx (0)
[0228/180601.370:INFO:CONSOLE(0)] "Application Cache Error event: Manifest fetch failed (404) https://cei.b3.com.br/CEI_Responsivo/manifest/cei.appcache", source: https://cei.b3.com.br/CEI_Responsivo/home.aspx (0)
[0228/180602.914:INFO:CONSOLE(0)] "Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.", source:  (0)
[0228/180602.982:INFO:CONSOLE(0)] "Creating Application Cache with manifest https://cei.b3.com.br/CEI_Responsivo/manifest/cei.appcache", source: https://cei.b3.com.br/CEI_Responsivo/negociacao-de-ativos.aspx (0)
[0228/180602.999:INFO:CONSOLE(0)] "Application Cache Checking event", source: https://cei.b3.com.br/CEI_Responsivo/negociacao-de-ativos.aspx (0)
[0228/180603.000:INFO:CONSOLE(0)] "Application Cache Error event: Manifest fetch failed (404) https://cei.b3.com.br/CEI_Responsivo/manifest/cei.appcache", source: https://cei.b3.com.br/CEI_Responsivo/negociacao-de-ativos.aspx (0)
Traceback (most recent call last):
  File ".\ir.py", line 81, in <module>
    main(sys.argv[1:])
  File ".\ir.py", line 26, in main
    do_busca_trades_e_faz_merge_operacoes()
  File ".\ir.py", line 43, in do_busca_trades_e_faz_merge_operacoes
    df_cei = crawler_cei.busca_trades()
  File "C:X\ir-master\src\crawler_cei.py", line 32, in busca_trades
    raise ex
  File "C:\X\ir-master\src\crawler_cei.py", line 28, in busca_trades
    self.__abre_consulta_trades()
  File "C:\ir-master\src\crawler_cei.py", line 64, in __abre_consulta_trades
    ddlAgentes.select_by_value('3')
  File "C:\X\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\support\select.py", line 87, in select_by_value
    raise NoSuchElementException("Cannot locate option with value: %s" % value)
selenium.common.exceptions.NoSuchElementException: Message: Cannot locate option with value: 3

Melhoria de titulos

Estou projetando um outro scraper que receberá o arquivo pdf, pensando que poderá receber arquivos de outras corretoras, gostaria de sugerir a criação de novos titulos a serem adicionados.

Estes são os titulos do dataframe.
'Código Negociação': 'ticker',
'Compra/Venda': 'operacao',
'Quantidade': 'qtd',
'Data do Negócio': 'data',
'Preço (R$)': 'preco',
'Valor Total(R$)': 'valor'

Os novos titulos que gostaria de adicionar são:

  • uma string que contera banco, agencia e conta da corretora (ex. BBB-AAAA-CCCC)
  • Taxas
  • Afim de facilitar a conferencia salvar outra string com numero da nota e numero da pagina ( ex. 123456-1)

Pontos observados:

  • a string do banco poderia ser customizada para as informações de cada crawler.

Afim de garantir a exatidão dos numeros os numeros com casas decimais serão salvos com o modulo decimals

Como eu crio o arquivo variavel de ambiente

Joia Guilherme!
Boa tarde , como eu posso criar a variável de ambiente para fazer rodar o programa ?
Ela tem que ter um nome especial ?
Eu preciso importar ela aonde?
Obrigado e grande abraço.

Pull request a caminho

Vou iniciar um trabaho para trazer as informações apartir do PDF das notas de corretagem da corretora RICO.

Premissas:

  • Poderar ser usado para consolidar diferentes corretoras. Por isso deverá trazer de forma padronizada.
  • Para informações da instituição será usado uma string com a seguinte composicao BANCO-AG-CC.
  • Irei trazer o Número da nota.

TO-DO:

  • scrap da tabela de resumo finaceiro com taxas e emolumentos

Obs: ainda nao fiz o commit, estou acertando os detalhes locais

Participar no Hacktoberfest 2020 Ajudando a desenvolver

Olá Guilherme.

Como posso contribuir com o seu projeto, esta muito bacana, parabéns.

Poderia me explicar qual a necessidade de upgrade testes ou novas funcionalidades necessárias para o projeto avançar?

Obrigado

Adalberto

Conteinerização

Olá

Alguém poderia disponibilizar os arquivos dockerfile e docker-compose para subir o projeto com docker?

Estou com dificuldade de subir o projeto

DownloadError('path', LookupError('not_found', None)

Quando rodo o busca_trades_e_faz_merge_operacoes estou recebendo a seguinte mensagem. Retirei a chamada da variável em dbx.files_download_to_file pra ficar testando e até agora não consegui acertar. Nessas mudanças recebi também o erro 'malformed_path'.

Como deve ser o formato do caminho especificado? Ele pode apontar pra qualquer pasta dentro do Dropbox?

[0302/095639.279:INFO:CONSOLE(0)] "Application Cache Checking event", source: https://cei.b3.com.br/CEI_Responsivo/negociacao-de-ativos.aspx (0)
[0302/095639.312:INFO:CONSOLE(0)] "Application Cache Error event: Manifest fetch failed (404) https://cei.b3.com.br/CEI_Responsivo/manifest/cei.appcache", source: https://cei.b3.com.br/CEI_Responsivo/negociacao-de-ativos.aspx (0)
Traceback (most recent call last):
  File ".\ir.py", line 81, in <module>
    main(sys.argv[1:])
  File ".\ir.py", line 26, in main
    do_busca_trades_e_faz_merge_operacoes()
  File ".\ir.py", line 46, in do_busca_trades_e_faz_merge_operacoes
    download_dropbox_file()
  File "C:\Users\X\Dropbox\X\ir-master\src\dropbox_files.py", line 11, in download_dropbox_file
    dbx.files_download_to_file(OPERATIONS_FILEPATH,'/Apps')
  File "C:\Users\X\AppData\Local\Programs\Python\Python36-32\lib\site-packages\dropbox\base.py", line 1238, in files_download_to_file
    None,
  File "C:\Users\X\AppData\Local\Programs\Python\Python36-32\lib\site-packages\dropbox\dropbox.py", line 296, in request
    user_message_locale)
dropbox.exceptions.ApiError: ApiError('1b103089b3d2c6617dad9ddfdce21cc1', DownloadError('path', LookupError('not_found', None)))

Arquivo inicial no dropbox

Olá Guilherme.
Encontrei seu projeto e gostaria de fazer uso, e quem sabe contribuir se meu nivel permitir. Encontrei o seguinte erro ao executar pela primeira vez. Saberia o motivo? Tenho um arquivo no dropbox que não possui dados nenhum. (um caracter para não dizer que está vazio). Esperava que ele fosse substituido por um arquivo atualizado do CEI, mas parece que ele está dando erro nesse ponto. Ou estou fazendo algo errado antes de executar pela primeira vez.
Segue a msg de erro.

"PS D:\Nuvem\OneDrive\Financas\Imposto_de_Renda\IR_MASTER\ir-master> python ./ir.py --do busca_trades_e_faz_merge_operacoes

DevTools listening on ws://127.0.0.1:60205/devtools/browser/1c5d60e8-0392-43fd-992e-32ee9df35a15
[0502/202720.682:ERROR:gpu_init.cc(426)] Passthrough is not supported, GL is swiftshader
Traceback (most recent call last):
File "./ir.py", line 77, in
main(sys.argv[1:])
File "./ir.py", line 25, in main
do_busca_trades_e_faz_merge_operacoes()
File "./ir.py", line 48, in do_busca_trades_e_faz_merge_operacoes
df = merge_operacoes(df, df_cei)
File "D:\Nuvem\OneDrive\Financas\Imposto_de_Renda\IR_MASTER\ir-master\src\stuff.py", line 154, in merge_operacoes
if not len(df) and not len(other_df):
TypeError: object of type 'NoneType' has no len()
PS D:\Nuvem\OneDrive\Financas\Imposto_de_Renda\IR_MASTER\ir-master>"

Login CEI-B3 com reCAPTCHA

Opa, beleza guilherme e comunidade, tudo bem?

Já conversamos há um tempo sobre o sistema de cálculo de imposto que estamos fazendo parecido.

To criando essa issue para perguntar se vocês já se depararam com uma característica nova agora do login no cei-b3, o sistema está requerindo uma solução de recaptcha. Vocês já chegaram a implementar algo para isso? Eu ainda estou pensando em como fazer isso, queria trocar umas ideias para ver qual seria a melhor solução para isso.... Esbarrei com esse problema hoje ao testar o sistema (https://github.com/renanleonellocastro/darf_generator). Criei uma issue para isso tbm lá.

RIP CEI e mudança no modelo de Excel de negociação da B3

Olá.
Primeiramente, projeto muito interessante. Foi o único que encontrei até agora.
Segundo, estou seguindo a importação manual dos dados de negociação da B3 usando a função importar_negociacoes, porém as colunas dos dados do excel se alteraram e acaba levantando um erro no Python:

As novas colunas no arquivo dado pela B3 são:

Código de Negociação
Período (Inicial)
Período (Final)
Instituição
Quantidade (Compra)
Quantidade (Venda)
Quantidade (Líquida)
Preço Médio (Compra)
Preço Médio (Venda)

Se você tiver algum arquivo antigo ainda, talvez seja possível comparar para fazer o depara corretamente. Ao mesmo tempo vou buscar no código os lugares para realizar a adaptação.

Além disso, tive problemas ao usar as versões sugeridas em requirements.txt. Estava tendo problemas com a biblioteca pywin32, erro de DLL (import win32file ImportError: DLL load failed while importing win32file: Não foi possível encontrar o procedimento especificado.). Estou rodando em venv, e aparentemente consegui resolver dando upgrade em todas as libs (veja função abaixo, achei interessante:


# Abrir o arquivo requirements.txt e ler todas as linhas
with open('requirements.txt') as f:
    packages = f.readlines()

# Iterar sobre todas as bibliotecas e atualizar cada uma
for package in packages:
    package_name = package.split('==')[0]
    subprocess.check_call(["pip", "install", "--upgrade", package_name])

Ultima coisa, estou explorando o código e notei que tem trechos remanescentes que puxa dados do CEI. Como o site não existe mais, não consegui ainda tentar transpor o código para a versão nova da B3 para manter a equivalência do processo (onde ir, onde clicar, quais dados pegar etc...). As vezes nem precisa, pois notei que vc já implementou algumas coisas para o site do Portal do Investidor da B3 (vide classe ImportadorNegociacaoB3). Quando eu puder, vou tentar explorar mais para tentar ajudar no projeto, mas saberia me dizer de antemão se o código funciona no geral com a versão nova do site (claro, com exceção do problema de importação manual acima)?
Abs!

Dúvida de configuração

Prezado Guilherme,
Agradeço sua paciência e orientações até o momento. No entanto, estou enfrentando algumas dificuldades com o Dropbox e gostaria de esclarecer algumas dúvidas para garantir que estou configurando tudo corretamente.
Primeiramente, criei uma conta no Dropbox e também criei um aplicativo nele, como sugerido.
Com relação ao token, segui as instruções fornecidas no link, e obtive um TOKEN. Minha dúvida é: eu devo inserir esse token na configuração do arquivo "Makefile"? Fiz isso corretamente?

Aqui estão as variáveis de ambiente que configurei:

DROPBOX_FILE_LOCATION: /Finance/GCGS/export_operacoes_gcgs.txt
DROPBOX_API_KEY: "TOKEN" (este é o token que obtive no link)
SEND_TO:[email protected]
CPF: [MEU CPF]
SENHA_CEI: [MINHA senha CEI]
SMTP_USER: smtp.mail.yahoo.com
SMTP_PASSWORD: [sua senha de email ou a senha obtida no Elasticemail?]
SMTP_SERVER: smtp.elasticemail.com
SMTP_PORT: 2525

No Dropbox, eu criei um aplicativo, mas ainda estou um pouco confuso sobre como os arquivos com as transações serão enviados para lá. Eles precisam ser encaminhados manualmente, ou a configuração que fiz cuidará disso automaticamente?
Peço desculpas se minhas dúvidas parecem básicas, estou em processo de aprendizado e quero garantir que todas as configurações estejam corretas. Agradeço muito por sua ajuda.

Reconhecimento - Projetos parecidos

Opa guilherme, beleza?

Primeiramente peço desculpas por ter entrado em contato via "Issues". Talvez devido a minha falta de conhecimento, não encontrei outra forma de prestar reconhecimento ao seu trabalho e também mostrar meu interesse no seu projeto.

Parabéns pelo seu projeto. Eu, infelizmente, estou trabalhando em um projeto muito parecido com o seu, diria até que praticamente idêntico (Gerador de DARF). Na época cheguei a procurar por bastante tempo sobre projetos parecidos, para não reimplementar algo já existente, mas infelizmente não encontrei o seu. Se o tivesse encontrado antes, teria contribuído com o seu projeto ao invés de criar outro.

Apesar deste contexto, fiquei muito feliz em ter encontrado o seu projeto. Dei uma olhada na sua implementação e achei muito bem feita e estruturada, parabéns. Estou neste momento com cerca de 60% da ideia inicial do meu projeto concluída, ainda restanto adicionar testes e implementar a funcionalidade de "crawler" do sistema do CEI-B3. Se você permitir, pretendo estudar a sua implementação de comunicação com o sistema CEI para tentar utilizá-la no meu sistema também.

Espero que possamos entrar em contato para discutirmos novidades e novas ideias para esses projetos.

Atenciosamente,
Renan

problemas a utilizar.

Olá, Boa tarde, tudo bem? amigo guilherme, aqui é o Junior, eu não sou programador python, mais me interessei pelo seu tema aqui na aplicação , então quero saber se vc pode me dar uma dica mais pratica de como o executar e realizar as devidas configurações, tudo bem ?
Desde já obrigado.

Problemas com as variáveis de ambiente

Boa noite Guilherme,

Estou com uma dúvida nas várias de ambiente. Eu crio o caminho no windows porém não quando rodo o comando não encontra, tenho que fazer mais algum setup?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.