Skip to main content

python   MIT license   Code style: black   Checked with mypy  

tesouro_direto_br é uma biblioteca Python para executar cálculos para gerenciamento de carteira de Títulos Públicos Federais (TPFs) usando dados do Tesouro Direto. Com ela, você poderá:

  • inserir seus TPFs e montar uma carteira;
  • calcular o valor de mercado dos TPFs (marcação a mercado) e da carteira;
  • calcular retorno da carteira;
  • visualizar, de forma gráfica, a evolução do valor de mercado e do retorno;
  • detalhamento dos custos envolvidos: IOF, IRPF, taxa de custódia B3;
  • obter rentabilidade líquida e bruta da carteira/título;
  • você pode simular uma carteira hipotética de TPFs;
  • você pode comparar com benchmarks como: CDI, ibovespa, IMA-B, IMA-B 5 e IMA-B 5+;

Instalação

Usando pip

Pode usar o comando:

pip install tesouro_direto_br

Alternativamente, obter diretamente do Github:

pip install https://github.com/rafa-rod/tesouro_direto_br/archive/refs/heads/main.zip

Por que é importante?

Notei que algumas corretoras mostraram a rentabilidade da carteira de forma equivocada. Algumas mostram apenas de um título, não da carteira.

Examplos

Importe a biblioteca e insira titulos publicos a uma carteira vazia:

import tesouro_direto_br as tesouro_direto

#Criar uma carteira vazia:
carteira = tesouro_direto.Carteira(tesouro_direto.Titulo())

#Adicionar titulos publicos:
titulo1 = tesouro_direto.Titulo("Tesouro IPCA+", "2026-08-15", "2021-07-08", 33.65)
titulo2 = tesouro_direto.Titulo("Tesouro Selic", "2025-03-01", "2021-07-08", 50)

carteira.add(titulo1)
carteira.add(titulo2)

Com a carteira montada, é hora de calcular o valor de mercado da carteira (marcação a mercado):

carteira_tesouro_direto = pd.DataFrame()
for tpf in carteira.titulos:
	tipo_titulo = tpf["Tipo"]
	quantidade = tpf["Quantidade"]
	data_investimento = tpf["Data Investimento"]
	vencimento = tpf["Vencimento"]

	mtm_completo_titulo, mtm_titulo = tesouro_direto.calcula_mtm_titulo(tipo_titulo, quantidade, data_investimento, vencimento)

	carteira_tesouro_direto = pd.concat([carteira_tesouro_direto, mtm_titulo], axis=1)

Com os valores de mercado, é possível obter a rentabilidade da carteira:

retorno_carteira, retorno_titulos_acumulado = tesouro_direto.calcula_mtm_carteira(carteira_tesouro_direto)

ano, mes, dia = str(retorno_carteira.index[0]).split('-')
dia = dia.split(" ")[0]
retorno_periodo = retorno_carteira.iloc[-1]*100
print(f"Retorno da Carteira é de {round(retorno_periodo,2)}% desde {dia}/{mes}/{ano}")

Se desejar obter a rentabilidade por período específico (como as corretoras fazem):

import numpy as np

rentabilidades = pd.DataFrame(data= np.array([[retorno_periodo,
                    tesouro_direto.calcula_retorno_carteira(carteira_tesouro_direto, periodo=21),
                    tesouro_direto.calcula_retorno_carteira(carteira_tesouro_direto, periodo=126),
                    tesouro_direto.calcula_retorno_carteira(carteira_tesouro_direto, periodo=252),
                    tesouro_direto.calcula_retorno_carteira(carteira_tesouro_direto, periodo=504)]]),
            index=["23/01/2023"], 
            columns=[f"Rentabilidade desde {dia}/{mes}/{ano}",
                                            "Rentabilidade 21m",
                                            "Rentabilidade 126m",
                                            "Rentabilidade 252du",
                                            "Rentabilidade 504du"])

print(rentabilidades.T)

A análise melhora se você comparar com um benchmark como o CDI:

import matplotlib.pyplot as plt
import comparar_fundos_br as comp

cdi, cdi_acumulado = comp.get_benchmark(str(retorno_carteira.index[0]).split(" ")[0], 
                                        str(retorno_carteira.index[-1]).split(" ")[0], 
                                        benchmark = "cdi")
retorno_cdi = (cdi_acumulado-1)*100

plt.figure(figsize=(17,5))
plt.title("Rentabilidade da Carteira")
plt.plot(retorno_carteira*100)
plt.plot(retorno_cdi, color="red", linestyle="--", lw=1)
plt.legend(["Carteira", "CDI"], frameon=False, loc="center right")
plt.show()

Se precisar plotar cada TPF de forma individual e ver os custos de cada um:

carteira_tesouro_direto = pd.DataFrame()
for tpf in carteira.titulos:
    tipo_titulo = tpf["Tipo"]
    quantidade = tpf["Quantidade"]
    data_investimento = tpf["Data Investimento"]
    vencimento = tpf["Vencimento"]

    mtm_completo_titulo, mtm_titulo = tesouro_direto.calcula_mtm_titulo(tipo_titulo, quantidade, data_investimento, vencimento)

    tesouro_direto.plot_mtm(mtm_completo_titulo, data_investimento, investimento)

    tesouro_direto.plot_taxas(tipo_titulo, data_investimento, vencimento)

    custos, detalhamento_custos = tesouro_direto.get_custos( mtm_titulo, investimento, data_investimento, vencimento )

O scritp anterior mostra os custos totais se você permanecer até o vencimento, caso deseje simular desfazer hoje do título, altere a data de vencimento:

carteira_tesouro_direto = pd.DataFrame()
for tpf in carteira.titulos:
    tipo_titulo = tpf["Tipo"]
    quantidade = tpf["Quantidade"]
    data_investimento = tpf["Data Investimento"]
    vencimento = tpf["Vencimento"]

    mtm_completo_titulo, mtm_titulo = tesouro_direto.calcula_mtm_titulo(tipo_titulo, quantidade, data_investimento, vencimento)

    tesouro_direto.plot_mtm(mtm_completo_titulo, data_investimento, investimento)

    tesouro_direto.plot_taxas(tipo_titulo, data_investimento, vencimento)

    custos, detalhamento_custos = tesouro_direto.get_custos( mtm_titulo, investimento, data_investimento, "2023-02-08" )
  

O IOF segue uma tabela regressiva de taxa cobrada e é zerada após 30 dias. Já o importo de renda é diminui após dois anos atingindo o mínimo de 15%. As taxas da B3 são cobradas em Janeiro e Julho de cada ano sobre o valor investido.

Estou considerando 0% a taxa da corretora.

Metadata

Release files for tesouro_direto_br 0.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for tesouro_direto_br 0.0.0
File Size Uploaded
tesouro_direto_br-0.0.0.tar.gz 5.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for tesouro_direto_br 0.0.0
File Interpreter ABI Platform
tesouro_direto_br-0.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 9.4 kB

Release files / tesouro_direto_br-0.0.0.tar.gz

Download URL tesouro_direto_br-0.0.0.tar.gz
Size 5.1 kB
Tags Source
SHA-256 checksum
How to use checksums
0ab651b915383305919552f957abc05adcc669444ceec5fcebc7331b93b70735
BLAKE2b-256 checksum
How to use checksums
135de61f4d5cebcdc5162ff4c2b3a03e5960fe11f3e6363194c666e5a350dbcf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.8.5

Release files / tesouro_direto_br-0.0.0-py3-none-any.whl

Download URL tesouro_direto_br-0.0.0-py3-none-any.whl
Size 4.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
18faaac42cadb752ee4cfc135a7559e29cd074e0843b0a180482c02a1f136029
BLAKE2b-256 checksum
How to use checksums
1ce279c1540857226bf28113d54ca93615ef949d81092db273ddb0026aff6e8e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.8.5

Release history Release notifications | RSS feed

0.3.5

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3

2 release files

0.2

2 release files

0.1.1

2 release files

This release

0.0.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page