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)
| File | Size | Uploaded | |
|---|---|---|---|
| tesouro_direto_br-0.0.0.tar.gz | 5.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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
|