Skip to content

Commit

Permalink
Juncao de ETFs e Acoes
Browse files Browse the repository at this point in the history
E possível compensar perdas de acoes com lucros de ETFs, e vice-versa
  • Loading branch information
guilhermecgs committed Jan 8, 2024
1 parent 057a92a commit 34f6b47
Show file tree
Hide file tree
Showing 7 changed files with 27 additions and 28 deletions.
5 changes: 2 additions & 3 deletions src/calculo_ir.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ def calcula_ir_a_pagar_no_mes(self, data):
for tipo in TipoTicker:
prejuizo_acumulado = self.calcula_prejuizo_acumulado(data, tipo)
ir_a_pagar += calcula_ir_a_pagar(prejuizo_acumulado, tipo,
self.total_vendido_no_mes_por_tipo(data)[TipoTicker.ACAO])
self.total_vendido_no_mes_por_tipo(data)[TipoTicker.ACAO_OU_ETF])
return ir_a_pagar

def calcula_dedo_duro_no_mes(self, data):
Expand Down Expand Up @@ -117,13 +117,12 @@ def possui_vendas_no_mes(self, data):

def calcula_ir_a_pagar(lucro, tipo, vendas_acoes_no_mes=None):
if lucro > 0:
if tipo == TipoTicker.ACAO:
if tipo == TipoTicker.ACAO_OU_ETF:
if vendas_acoes_no_mes > 20000.0:
return lucro * 0.15
else:
return 0.0
if tipo == TipoTicker.BDR \
or tipo == TipoTicker.ETF \
or tipo == TipoTicker.FUTURO \
or tipo == TipoTicker.OPCAO:
return lucro * 0.15
Expand Down
4 changes: 2 additions & 2 deletions src/crawler_advfn.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ def __recupera_tipo_ticker(self):
return TipoTicker.FUTURO

if self.__ticker_eh_acao():
return TipoTicker.ACAO
return TipoTicker.ACAO_OU_ETF

if self.__ticker_eh_opcao():
return TipoTicker.OPCAO
Expand All @@ -89,7 +89,7 @@ def __recupera_tipo_ticker(self):
return TipoTicker.FII

if self.__ticker_eh_etf():
return TipoTicker.ETF
return TipoTicker.ACAO_OU_ETF

if self.__ticker_eh_bdr():
return TipoTicker.BDR
Expand Down
8 changes: 3 additions & 5 deletions src/relatorio.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ def relatorio_txt(ir):
relatorio.append(__tab(3) + 'Lucro/Prejuizo acumulado: ' + __format(ir.calcula_prejuizo_acumulado(data, tipo)))
relatorio.append(__tab(3) + 'IR no mês para ' + tipo.name + ': ' + __format(calcula_ir_a_pagar(ir.calcula_prejuizo_acumulado(data, tipo),
tipo,
ir.total_vendido_no_mes_por_tipo(data)[TipoTicker.ACAO])))
ir.total_vendido_no_mes_por_tipo(data)[TipoTicker.ACAO_OU_ETF])))

relatorio.append(__tab(2) + 'Dedo-Duro TOTAL no mês: ' + __format(ir.calcula_dedo_duro_no_mes(data)))
relatorio.append(__tab(2) + 'IR a pagar TOTAL no mês: ' + __format(ir.calcula_ir_a_pagar_no_mes(data)))
Expand Down Expand Up @@ -114,7 +114,7 @@ def relatorio_html(ir, numero_de_meses=None):
relatorio_mes += __p('Lucro/Prejuizo acumulado: ' + __format(ir.calcula_prejuizo_acumulado(data, tipo)), tab=3)
relatorio_mes += __p('IR no mês para ' + tipo.name + ': ' + __format(calcula_ir_a_pagar(ir.calcula_prejuizo_acumulado(data, tipo),
tipo,
ir.total_vendido_no_mes_por_tipo(data)[TipoTicker.ACAO])), tab=3)
ir.total_vendido_no_mes_por_tipo(data)[TipoTicker.ACAO_OU_ETF])), tab=3)

relatorio_mes += __p('Dedo-Duro TOTAL no mês: ' + __format(ir.calcula_dedo_duro_no_mes(data)), tab=2)
relatorio_mes += __p('IR a pagar TOTAL no mês: ' + __format(ir.calcula_ir_a_pagar_no_mes(data)), tab=2)
Expand Down Expand Up @@ -160,12 +160,10 @@ def __close_html():
def __cor_tabela(tipo=None):
if tipo is None:
return 'blue_light'
elif tipo == TipoTicker.ACAO:
elif tipo == TipoTicker.ACAO_OU_ETF:
return 'grey_light'
elif tipo == TipoTicker.FII:
return 'yellow_light'
elif tipo == TipoTicker.ETF:
return 'orange_light'
return 'blue_light'


Expand Down
7 changes: 3 additions & 4 deletions src/tipo_ticker.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,8 @@


class TipoTicker(Enum):
ETF = 1
FII = 2
ACAO = 3
ACAO_OU_ETF = 3
OPCAO = 4
FUTURO = 5
FIP = 6
Expand All @@ -29,10 +28,10 @@ def tipo_ticker(ticker):
return TipoTicker.FII

if e_tipo_etf(ticker):
return TipoTicker.ETF
return TipoTicker.ACAO_OU_ETF

if busca_preco_atual_yahoo(ticker):
return TipoTicker.ACAO
return TipoTicker.ACAO_OU_ETF

from src.crawler_advfn import advfn_tipo_ticker
return advfn_tipo_ticker(ticker)
13 changes: 8 additions & 5 deletions tests/test_calculo_ir.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@
class TestCalculoIr():

def test_acoes_deve_ter_percentual_de_15_perc(self):
assert calcula_ir_a_pagar(25000, TipoTicker.ACAO, 100000) == 3750.0
assert calcula_ir_a_pagar(25000, TipoTicker.ACAO_OU_ETF, 100000) == 3750.0

def test_acoes_isencao_ate_20_mil_de_vendas_no_mes(self):
assert calcula_ir_a_pagar(15000, TipoTicker.ACAO, 15000) == 0.0
assert calcula_ir_a_pagar(15000, TipoTicker.ACAO, 30000) == 2250.0
assert calcula_ir_a_pagar(15000, TipoTicker.ACAO_OU_ETF, 15000) == 0.0
assert calcula_ir_a_pagar(15000, TipoTicker.ACAO_OU_ETF, 30000) == 2250.0

@pytest.mark.parametrize("tipo_ticker",
filter(lambda tipo: tipo not in (TipoTicker.ACAO, TipoTicker.FIPIE),
filter(lambda tipo: tipo not in (TipoTicker.ACAO_OU_ETF, TipoTicker.FIPIE),
[tipo for tipo in TipoTicker if tipo]))
def test_apenas_acoes_possuem_isencao_de_vendas_ate_20_mil(self, tipo_ticker):
assert calcula_ir_a_pagar(10000, tipo_ticker, 15000) > 0.0
Expand All @@ -38,7 +38,7 @@ def test_deve_ser_zero_se_nao_tiver_lucro(self, tipo_ticker):
assert calcula_ir_a_pagar(0, tipo_ticker) == 0.0

def test_etf_deve_ter_percentual_de_15_perc(self):
assert calcula_ir_a_pagar(25000, TipoTicker.ETF) == 3750.0
assert calcula_ir_a_pagar(25000, TipoTicker.ACAO_OU_ETF) == 3750.0

def test_futuro_deve_ter_percentual_de_15_perc(self):
assert calcula_ir_a_pagar(25000, TipoTicker.FUTURO) == 3750.0
Expand All @@ -56,3 +56,6 @@ def test_tipos_isentos_devem_ter_imposto_zero(self):
# deve calcular prejuizo_por_tipo para um mes e tipo.
# deve considerar meses desde a primeira compra ate o dia atual
# deve testar todos os metodos publicos


# deve printar o calculo final em ordem decrescente, para sempre mostrar o mes mais atual em cima
6 changes: 3 additions & 3 deletions tests/test_crawlerAdvfn.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@ def test_busca_preco_atual(self):

def test_busca_tipo_ticker(self):
busca_parametros.clear_cache()
assert advfn_tipo_ticker('ALUP11') == TipoTicker.ACAO
assert advfn_tipo_ticker('ALUP11') == TipoTicker.ACAO_OU_ETF
assert advfn_tipo_ticker('SDIL11') == TipoTicker.FII
assert advfn_tipo_ticker('BOVA11') == TipoTicker.ETF
assert advfn_tipo_ticker('BOVA11') == TipoTicker.ACAO_OU_ETF
assert advfn_tipo_ticker('MAXR11') == TipoTicker.FII
assert advfn_tipo_ticker('ISPU' + ano_corrente()) == TipoTicker.FUTURO
assert advfn_tipo_ticker('INVALID') is None
assert advfn_tipo_ticker('ITSA4') == TipoTicker.ACAO
assert advfn_tipo_ticker('ITSA4') == TipoTicker.ACAO_OU_ETF
assert advfn_tipo_ticker('ITSA4') == advfn_tipo_ticker('itsa4')
assert advfn_tipo_ticker('AAPL34') == TipoTicker.BDR
assert advfn_tipo_ticker('BABA34') == TipoTicker.BDR
Expand Down
12 changes: 6 additions & 6 deletions tests/test_tipo_ticker.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,19 @@ def setup_method(self, method):
tipo_ticker.clear_cache()

def test_tipo_ticker(self):
assert tipo_ticker('ALUP11') is TipoTicker.ACAO
assert tipo_ticker('ALUP11') is TipoTicker.ACAO_OU_ETF
assert tipo_ticker('whgr11') is TipoTicker.FII
assert tipo_ticker('RZAG11') is TipoTicker.FII
assert tipo_ticker('AAZQ11') is TipoTicker.FII
assert tipo_ticker('IRDM11') is TipoTicker.FII
assert tipo_ticker('GRLV11') is TipoTicker.FII
assert tipo_ticker('VRTA11') is TipoTicker.FII
assert tipo_ticker('vrta11') is TipoTicker.FII
assert tipo_ticker('ITSA4') is TipoTicker.ACAO
assert tipo_ticker('PETR4') is TipoTicker.ACAO
assert tipo_ticker('CMIN3') is TipoTicker.ACAO
assert tipo_ticker('BOVA11') is TipoTicker.ETF
assert tipo_ticker('SPXI11') is TipoTicker.ETF
assert tipo_ticker('ITSA4') is TipoTicker.ACAO_OU_ETF
assert tipo_ticker('PETR4') is TipoTicker.ACAO_OU_ETF
assert tipo_ticker('CMIN3') is TipoTicker.ACAO_OU_ETF
assert tipo_ticker('BOVA11') is TipoTicker.ACAO_OU_ETF
assert tipo_ticker('SPXI11') is TipoTicker.ACAO_OU_ETF
assert tipo_ticker('MSFT34') is TipoTicker.BDR
assert tipo_ticker('invalid') is None
assert tipo_ticker('ISPU' + ano_corrente()) is TipoTicker.FUTURO
Expand Down

0 comments on commit 34f6b47

Please sign in to comment.