O problema
Solução:
Bibliotecas utilizadas:
# Desabilita o warning do request sem verificar certificado do servidor:
# requests.get(url,verify=False) dispensa a verificaçao de certificado
import urllib3
urllib3.disable_warnings()
# Bibliotecas
import json # Utilizada para converter json em um dicionário em Python
import requests # Utilizada para fazer consultas em url
import pandas as pd # Utilizada para tabular dados
# Acessando a API do Tesouro Direto
# Endereço
url = 'https://www.tesourodireto.com.br/json/br/com/b3/tesourodireto/service/api/treasurybondsinfo.json'
resp_requ = requests.get(url,verify=False) # Objeto contendo dados do request
resp_dict = resp_requ.json() # Dados no formato de dicionário Python
print('Tipo resp_requ:', type(resp_requ))
print('Tipo resp_dict:', type(resp_dict))
Tipo resp_requ: <class 'requests.models.Response'> Tipo resp_dict: <class 'dict'>
Obs.: Podemos criar diretamente o request em formato dicionário aplicando o método .json():
resp_dict = requests.get(url, verify=False).json()
print('Número de chaves em "resp_dict":', len(resp_dict))
for key in resp_dict:
print('-' + key)
Número de chaves em "resp_dict": 4 -responseStatus -responseStatusText -statusInfo -response
# responseStatus: 200
resp_dict['responseStatus']
200
# responseStatusText: 'success'
resp_dict['responseStatusText']
'success'
# statusInfo: 'OK'
resp_dict['statusInfo']
'OK'
print("Chaves dentro de resp_dict['response']:")
for key in resp_dict['response']: print('-' + key)
Chaves dentro de resp_dict['response']: -BdTxTp -TrsrBondMkt -TrsrBdTradgList -BizSts
resp_dict['response']['BdTxTp']
{'cd': 0}
print('Data e horário de abertura, fechamento e atualização; mercado Aberto ou Fechado:')
resp_dict['response']['TrsrBondMkt']
Data e horário de abertura, fechamento e atualização; mercado Aberto ou Fechado:
{'opngDtTm': '2022-06-17T09:25:00',
'clsgDtTm': '2022-06-20T05:00:00',
'qtnDtTm': '2022-06-17T15:31:15.957',
'stsCd': 4,
'sts': 'Fechado'}
# Para acessar o status do mercado, basta acrescentar a chave ['sts']
resp_dict['response']['TrsrBondMkt']['sts']
'Fechado'
Como o nome diz, trata-se de uma lista contendo todos os títulos que podem ser comprados ou vendidos. Na seção seguinte iremos explorar essa lista.
print('Tamanho da lista "TrsrBdTradgList":', len(resp_dict['response']['TrsrBdTradgList']))
Tamanho da lista "TrsrBdTradgList": 29
# Na chave 'BizSts' acessamos o horário de atualização dos preços
print('Data e horário da consulta:')
resp_dict['response']['BizSts']
Data e horário da consulta:
{'cd': '0', 'dtTm': '2022-06-18T20:02:16'}
n_titulos = len(resp_dict['response']['TrsrBdTradgList'])
print('Número de títulos:', n_titulos)
Número de títulos: 29
resp_dict['response']['TrsrBdTradgList'][0]['TrsrBd']
{'cd': 159,
'nm': 'Tesouro Selic 2023',
'featrs': 'Título com rentabilidade diária vinculada à taxa de juros da economia (taxa Selic). Isso significa que se a taxa Selic aumentar a sua rentabilidade aumenta e se a taxa Selic diminuir, sua rentabilidade diminui.',
'mtrtyDt': '2023-03-01T00:00:00',
'minInvstmtAmt': 0.0,
'untrInvstmtVal': 0.0,
'invstmtStbl': 'Esse investimento garante que, mesmo em caso de resgate antecipado, o montante do dinheiro resgatado será superior ao inicialmente investido. Como não paga juros semestrais, é mais interessante para quem pode deixar o dinheiro render até o vencimento do investimento.',
'semiAnulIntrstInd': False,
'rcvgIncm': 'Indicado para aqueles que querem realizar investimentos de curto prazo.',
'anulInvstmtRate': 0.0,
'anulRedRate': 0.044,
'minRedQty': 0.01,
'untrRedVal': 11789.59,
'minRedVal': 117.9,
'isinCd': 'BRSTNCLF1R82',
'FinIndxs': {'cd': 17, 'nm': 'SELIC'},
'wdwlDt': '2019-02-01T01:00:00'}
Nota: Os títulos que saíram de negociação de compra apresentam a última chave 'wdwlDt', contendo a data em que o título foi removido (withdrawal) das negociações. Esses títulos são acessados através da aba "Resgatar" na página do Tesouro Direito: https://www.tesourodireto.com.br/titulos/precos-e-taxas.htm
# Vamos listar cada chave contendo informações de um título público
itens = [] # Lista para armazenar as chaves
for item in resp_dict['response']['TrsrBdTradgList'][2]['TrsrBd']:
itens.append(item) # Armazena a chave
print(item) # print da chave
cd nm featrs mtrtyDt minInvstmtAmt untrInvstmtVal invstmtStbl semiAnulIntrstInd rcvgIncm anulInvstmtRate anulRedRate minRedQty untrRedVal minRedVal isinCd FinIndxs
# Listando o conteúdo de um dos títulos
conteudos = [] # Lista para armazenar o conteúdo de cada chave
for item in itens: # Para cada chave em itens, acesse seu conteúdo:
conteudo = resp_dict['response']['TrsrBdTradgList'][17]['TrsrBd'][item]
conteudos.append(conteudo) # armazena
# Criando uma legenda para o código das chaves
description = ['Code',
'Name',
'Features',
'Maturity date',
'Min. Inv. Amount',
'Unitary Value',
'Inv. Suitability',
'Semi annual interest pay',
'Recomendation',
'Anual interest rate',
'Anual interest rate (sell)',
'Min. sell amount',
'Unitary sell value (sell)',
'Min. sell value',
'ISIN code',
'Indexation'
]
# Criando uma descrição das chaves
descricao = ['Código',
'Nome',
'Características',
'Vencimento',
'Investimento mínimo',
'Preço unitário',
'Adequação',
'Juros semestrais',
'Recomendação',
'Taxa de juros anual',
'Taxa de juros (Resgate)',
'Quantidade mínima (Resgate)',
'Preço unitário (Resgate)',
'Preço mínimo (Resgate)',
'Código ISIN do título',
'Indexação'
]
# Tabelando as informações
df_info_titulos = pd.DataFrame()
df_info_titulos['Chave'] = itens
df_info_titulos['Legenda'] = description
df_info_titulos['Descrição'] = descricao
df_info_titulos['Exemplo'] = conteudos
display(df_info_titulos)
| Chave | Legenda | Descrição | Exemplo | |
|---|---|---|---|---|
| 0 | cd | Code | Código | 170 |
| 1 | nm | Name | Nome | Tesouro IPCA+ 2026 |
| 2 | featrs | Features | Características | Título pós-fixado, uma vez que parte do seu re... |
| 3 | mtrtyDt | Maturity date | Vencimento | 2026-08-15T00:00:00 |
| 4 | minInvstmtAmt | Min. Inv. Amount | Investimento mínimo | 32.08 |
| 5 | untrInvstmtVal | Unitary Value | Preço unitário | 3208.18 |
| 6 | invstmtStbl | Inv. Suitability | Adequação | Aumenta o poder de compra do seu dinheiro, poi... |
| 7 | semiAnulIntrstInd | Semi annual interest pay | Juros semestrais | False |
| 8 | rcvgIncm | Recomendation | Recomendação | Indicado para aqueles que querem realizar inve... |
| 9 | anulInvstmtRate | Anual interest rate | Taxa de juros anual | 5.3 |
| 10 | anulRedRate | Anual interest rate (sell) | Taxa de juros (Resgate) | 5.42 |
| 11 | minRedQty | Min. sell amount | Quantidade mínima (Resgate) | 0.01 |
| 12 | untrRedVal | Unitary sell value (sell) | Preço unitário (Resgate) | 3193.04 |
| 13 | minRedVal | Min. sell value | Preço mínimo (Resgate) | 31.93 |
| 14 | isinCd | ISIN code | Código ISIN do título | BRSTNCNTB4W2 |
| 15 | FinIndxs | Indexation | Indexação | {'cd': 22, 'nm': 'IPCA'} |
print('\033[1m'+'Títulos do Tesouro:'+'\033[0m')
for i in range(n_titulos):
nome = resp_dict['response']['TrsrBdTradgList'][i]['TrsrBd']['nm']
print('-' + nome)
Títulos do Tesouro:
-Tesouro Selic 2023
-Tesouro Selic 2024
-Tesouro Selic 2025
-Tesouro Selic 2027
-Tesouro Prefixado 2023
-Tesouro Prefixado com Juros Semestrais 2023
-Tesouro Prefixado 2024
-Tesouro Prefixado 2025
-Tesouro Prefixado com Juros Semestrais 2025
-Tesouro Prefixado 2026
-Tesouro Prefixado com Juros Semestrais 2027
-Tesouro Prefixado 2029
-Tesouro Prefixado com Juros Semestrais 2029
-Tesouro Prefixado com Juros Semestrais 2031
-Tesouro Prefixado com Juros Semestrais 2033
-Tesouro IPCA+ 2024
-Tesouro IPCA+ com Juros Semestrais 2024
-Tesouro IPCA+ 2026
-Tesouro IPCA+ com Juros Semestrais 2026
-Tesouro IPCA+ com Juros Semestrais 2030
-Tesouro IPCA+ com Juros Semestrais 2032
-Tesouro IPCA+ 2035
-Tesouro IPCA+ com Juros Semestrais 2035
-Tesouro IPCA+ com Juros Semestrais 2040
-Tesouro IPCA+ 2045
-Tesouro IPCA+ com Juros Semestrais 2045
-Tesouro IPCA+ com Juros Semestrais 2050
-Tesouro IPCA+ com Juros Semestrais 2055
-Tesouro IGPM+ com Juros Semestrais 2031
Nota: Os títulos em negociação possuem valor de compra 'untrInvstmtVal', a qual é zero para os títulos somente disponíveis para resgate. Podemos usar esse valor como critério para filtrar os títulos.
print('\033[1m'+'Títulos em negociação:'+'\033[0m')
for i in range(n_titulos):
nome = resp_dict['response']['TrsrBdTradgList'][i]['TrsrBd']['nm']
valor = resp_dict['response']['TrsrBdTradgList'][i]['TrsrBd']['untrInvstmtVal']
if valor != 0:
print('-' + nome)
Títulos em negociação:
-Tesouro Selic 2025
-Tesouro Selic 2027
-Tesouro Prefixado 2025
-Tesouro Prefixado 2029
-Tesouro Prefixado com Juros Semestrais 2033
-Tesouro IPCA+ 2026
-Tesouro IPCA+ com Juros Semestrais 2032
-Tesouro IPCA+ 2035
-Tesouro IPCA+ com Juros Semestrais 2040
-Tesouro IPCA+ 2045
-Tesouro IPCA+ com Juros Semestrais 2055
print('\033[1m'+'Títulos somente disponíveis para resgate:'+'\033[0m')
for i in range(n_titulos):
nome = resp_dict['response']['TrsrBdTradgList'][i]['TrsrBd']['nm']
valor = resp_dict['response']['TrsrBdTradgList'][i]['TrsrBd']['untrInvstmtVal']
if valor == 0:
print('-' + nome)
Títulos somente disponíveis para resgate:
-Tesouro Selic 2023
-Tesouro Selic 2024
-Tesouro Prefixado 2023
-Tesouro Prefixado com Juros Semestrais 2023
-Tesouro Prefixado 2024
-Tesouro Prefixado com Juros Semestrais 2025
-Tesouro Prefixado 2026
-Tesouro Prefixado com Juros Semestrais 2027
-Tesouro Prefixado com Juros Semestrais 2029
-Tesouro Prefixado com Juros Semestrais 2031
-Tesouro IPCA+ 2024
-Tesouro IPCA+ com Juros Semestrais 2024
-Tesouro IPCA+ com Juros Semestrais 2026
-Tesouro IPCA+ com Juros Semestrais 2030
-Tesouro IPCA+ com Juros Semestrais 2035
-Tesouro IPCA+ com Juros Semestrais 2045
-Tesouro IPCA+ com Juros Semestrais 2050
-Tesouro IGPM+ com Juros Semestrais 2031
# Listas para armezar informações dos títulos
tipos = []
nomes = []
tx_compras = []
tx_vendas = []
p_compras = []
p_vendas = []
vencimentos = []
for i in range(n_titulos):
tipos.append(resp_dict['response']['TrsrBdTradgList'][i]['TrsrBd']['FinIndxs']['nm']) # nome do indexador
nomes.append(resp_dict['response']['TrsrBdTradgList'][i]['TrsrBd']['nm']) # nome do título
vencimentos.append(resp_dict['response']['TrsrBdTradgList'][i]['TrsrBd']['mtrtyDt']) # vencimento
tx_compras.append(resp_dict['response']['TrsrBdTradgList'][i]['TrsrBd']['anulInvstmtRate'])# Taxa de juros (compra)
p_compras.append(resp_dict['response']['TrsrBdTradgList'][i]['TrsrBd']['untrInvstmtVal']) # Preço de compra
tx_vendas.append(resp_dict['response']['TrsrBdTradgList'][i]['TrsrBd']['anulRedRate']) # Taxa de juros (venda)
p_vendas.append(resp_dict['response']['TrsrBdTradgList'][i]['TrsrBd']['untrRedVal']) # Preço de venda
# Tabelando os dados em um dataframe
df = pd.DataFrame()
df['Tipo'] = tipos
df['Título'] = nomes
df['Vencimento'] = pd.to_datetime(vencimentos)
df['Rentabilidade (Compra)'] = tx_compras
df['Preço R$ (Compra)'] = p_compras
df['Rentabilidade (Venda)'] = tx_vendas
df['Preço R$ (Venda)'] = p_vendas
display(df)
| Tipo | Título | Vencimento | Rentabilidade (Compra) | Preço R$ (Compra) | Rentabilidade (Venda) | Preço R$ (Venda) | |
|---|---|---|---|---|---|---|---|
| 0 | SELIC | Tesouro Selic 2023 | 2023-03-01 | 0.000 | 0.00 | 0.0440 | 11789.59 |
| 1 | SELIC | Tesouro Selic 2024 | 2024-09-01 | 0.000 | 0.00 | 0.1028 | 11766.61 |
| 2 | SELIC | Tesouro Selic 2025 | 2025-03-01 | 0.112 | 11757.60 | 0.1220 | 11754.42 |
| 3 | SELIC | Tesouro Selic 2027 | 2027-03-01 | 0.164 | 11703.08 | 0.1740 | 11697.60 |
| 4 | PREFIXADO | Tesouro Prefixado 2023 | 2023-01-01 | 0.000 | 0.00 | 13.6600 | 933.23 |
| 5 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2023 | 2023-01-01 | 0.000 | 0.00 | 13.6700 | 1027.32 |
| 6 | PREFIXADO | Tesouro Prefixado 2024 | 2024-07-01 | 0.000 | 0.00 | 13.0900 | 779.99 |
| 7 | PREFIXADO | Tesouro Prefixado 2025 | 2025-01-01 | 12.640 | 739.47 | 12.7600 | 737.47 |
| 8 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2025 | 2025-01-01 | 0.000 | 0.00 | 12.8100 | 988.90 |
| 9 | PREFIXADO | Tesouro Prefixado 2026 | 2026-01-01 | 0.000 | 0.00 | 12.6900 | 655.15 |
| 10 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2027 | 2027-01-01 | 0.000 | 0.00 | 12.8600 | 953.96 |
| 11 | PREFIXADO | Tesouro Prefixado 2029 | 2029-01-01 | 12.770 | 456.99 | 12.8900 | 453.84 |
| 12 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2029 | 2029-01-01 | 0.000 | 0.00 | 12.9200 | 925.70 |
| 13 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2031 | 2031-01-01 | 0.000 | 0.00 | 13.0000 | 900.90 |
| 14 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2033 | 2033-01-01 | 12.960 | 885.43 | 13.0800 | 879.72 |
| 15 | IPCA | Tesouro IPCA+ 2024 | 2024-08-15 | 0.000 | 0.00 | 5.8100 | 3521.21 |
| 16 | IPCA | Tesouro IPCA+ com Juros Semestrais 2024 | 2024-08-15 | 0.000 | 0.00 | 5.8400 | 4069.90 |
| 17 | IPCA | Tesouro IPCA+ 2026 | 2026-08-15 | 5.300 | 3208.18 | 5.4200 | 3193.04 |
| 18 | IPCA | Tesouro IPCA+ com Juros Semestrais 2026 | 2026-08-15 | 0.000 | 0.00 | 5.4600 | 4133.52 |
| 19 | IPCA | Tesouro IPCA+ com Juros Semestrais 2030 | 2030-08-15 | 0.000 | 0.00 | 5.5600 | 4171.73 |
| 20 | IPCA | Tesouro IPCA+ com Juros Semestrais 2032 | 2032-08-15 | 5.530 | 4200.28 | 5.6500 | 4163.90 |
| 21 | IPCA | Tesouro IPCA+ 2035 | 2035-05-15 | 5.680 | 1953.75 | 5.8000 | 1925.44 |
| 22 | IPCA | Tesouro IPCA+ com Juros Semestrais 2035 | 2035-05-15 | 0.000 | 0.00 | 5.7500 | 4092.15 |
| 23 | IPCA | Tesouro IPCA+ com Juros Semestrais 2040 | 2040-08-15 | 5.690 | 4198.43 | 5.8100 | 4145.30 |
| 24 | IPCA | Tesouro IPCA+ 2045 | 2045-05-15 | 5.680 | 1126.18 | 5.8000 | 1097.37 |
| 25 | IPCA | Tesouro IPCA+ com Juros Semestrais 2045 | 2045-05-15 | 0.000 | 0.00 | 5.9000 | 4055.29 |
| 26 | IPCA | Tesouro IPCA+ com Juros Semestrais 2050 | 2050-08-15 | 0.000 | 0.00 | 5.9400 | 4097.28 |
| 27 | IPCA | Tesouro IPCA+ com Juros Semestrais 2055 | 2055-05-15 | 5.820 | 4110.68 | 5.9400 | 4041.90 |
| 28 | IGP-M | Tesouro IGPM+ com Juros Semestrais 2031 | 2031-01-01 | 0.000 | 0.00 | 5.5800 | 9512.96 |
# Operação pode ser de compra ou venda/resgate
# Se solicitamos compra, somente vemos os títulos disponíveis para compra
op = 'C' # compra 'C', venda 'V' ou '' sem restrições (exibe compra e venda)
# Tipo de título pode ser SELIC, PREFIXADO ou IPCA/IGPM
tp = 'S' # selic 'S', prefixado 'P', ipca 'I' ou '' exibe todos
# Ajuste dos parâmetros
op = '' # String vazia: sem filtro de compra ou venda
tp = '' # String vazia: sem filtro por tipo de título
# Abaixo, criamos um DF2 com informações filtradas
# Fazemos primeiro a seleção pelo tipo de título
if tp == 'S':
df2 = df.iloc[df[df['Tipo']=='SELIC'].index] # Selecionamos pelos índices de interesse
elif tp == 'P':
df2 = df.iloc[df[df['Tipo']=='PREFIXADO'].index] # Selecionamos pelos índices de interesse
elif tp == 'I':
df2 = df.iloc[df[df['Tipo']=='IPCA'].index] # Selecionamos pelos índices de interesse
else:
df2 = df.copy()
# Fazemos a seleção segundo compra ou venda
if op == 'C':
df2 = df2[df2['Preço R$ (Compra)']!=0].drop(df2.columns[[5, 6]],axis=1) # exclusão colunas de venda
display(df2)
elif op == 'V':
df2 = df2.drop(df2.columns[[3, 4]],axis=1) # Exclusão colunas de compra
display(df2)
else:
display(df2)
| Tipo | Título | Vencimento | Rentabilidade (Compra) | Preço R$ (Compra) | Rentabilidade (Venda) | Preço R$ (Venda) | |
|---|---|---|---|---|---|---|---|
| 0 | SELIC | Tesouro Selic 2023 | 2023-03-01 | 0.000 | 0.00 | 0.0440 | 11789.59 |
| 1 | SELIC | Tesouro Selic 2024 | 2024-09-01 | 0.000 | 0.00 | 0.1028 | 11766.61 |
| 2 | SELIC | Tesouro Selic 2025 | 2025-03-01 | 0.112 | 11757.60 | 0.1220 | 11754.42 |
| 3 | SELIC | Tesouro Selic 2027 | 2027-03-01 | 0.164 | 11703.08 | 0.1740 | 11697.60 |
| 4 | PREFIXADO | Tesouro Prefixado 2023 | 2023-01-01 | 0.000 | 0.00 | 13.6600 | 933.23 |
| 5 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2023 | 2023-01-01 | 0.000 | 0.00 | 13.6700 | 1027.32 |
| 6 | PREFIXADO | Tesouro Prefixado 2024 | 2024-07-01 | 0.000 | 0.00 | 13.0900 | 779.99 |
| 7 | PREFIXADO | Tesouro Prefixado 2025 | 2025-01-01 | 12.640 | 739.47 | 12.7600 | 737.47 |
| 8 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2025 | 2025-01-01 | 0.000 | 0.00 | 12.8100 | 988.90 |
| 9 | PREFIXADO | Tesouro Prefixado 2026 | 2026-01-01 | 0.000 | 0.00 | 12.6900 | 655.15 |
| 10 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2027 | 2027-01-01 | 0.000 | 0.00 | 12.8600 | 953.96 |
| 11 | PREFIXADO | Tesouro Prefixado 2029 | 2029-01-01 | 12.770 | 456.99 | 12.8900 | 453.84 |
| 12 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2029 | 2029-01-01 | 0.000 | 0.00 | 12.9200 | 925.70 |
| 13 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2031 | 2031-01-01 | 0.000 | 0.00 | 13.0000 | 900.90 |
| 14 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2033 | 2033-01-01 | 12.960 | 885.43 | 13.0800 | 879.72 |
| 15 | IPCA | Tesouro IPCA+ 2024 | 2024-08-15 | 0.000 | 0.00 | 5.8100 | 3521.21 |
| 16 | IPCA | Tesouro IPCA+ com Juros Semestrais 2024 | 2024-08-15 | 0.000 | 0.00 | 5.8400 | 4069.90 |
| 17 | IPCA | Tesouro IPCA+ 2026 | 2026-08-15 | 5.300 | 3208.18 | 5.4200 | 3193.04 |
| 18 | IPCA | Tesouro IPCA+ com Juros Semestrais 2026 | 2026-08-15 | 0.000 | 0.00 | 5.4600 | 4133.52 |
| 19 | IPCA | Tesouro IPCA+ com Juros Semestrais 2030 | 2030-08-15 | 0.000 | 0.00 | 5.5600 | 4171.73 |
| 20 | IPCA | Tesouro IPCA+ com Juros Semestrais 2032 | 2032-08-15 | 5.530 | 4200.28 | 5.6500 | 4163.90 |
| 21 | IPCA | Tesouro IPCA+ 2035 | 2035-05-15 | 5.680 | 1953.75 | 5.8000 | 1925.44 |
| 22 | IPCA | Tesouro IPCA+ com Juros Semestrais 2035 | 2035-05-15 | 0.000 | 0.00 | 5.7500 | 4092.15 |
| 23 | IPCA | Tesouro IPCA+ com Juros Semestrais 2040 | 2040-08-15 | 5.690 | 4198.43 | 5.8100 | 4145.30 |
| 24 | IPCA | Tesouro IPCA+ 2045 | 2045-05-15 | 5.680 | 1126.18 | 5.8000 | 1097.37 |
| 25 | IPCA | Tesouro IPCA+ com Juros Semestrais 2045 | 2045-05-15 | 0.000 | 0.00 | 5.9000 | 4055.29 |
| 26 | IPCA | Tesouro IPCA+ com Juros Semestrais 2050 | 2050-08-15 | 0.000 | 0.00 | 5.9400 | 4097.28 |
| 27 | IPCA | Tesouro IPCA+ com Juros Semestrais 2055 | 2055-05-15 | 5.820 | 4110.68 | 5.9400 | 4041.90 |
| 28 | IGP-M | Tesouro IGPM+ com Juros Semestrais 2031 | 2031-01-01 | 0.000 | 0.00 | 5.5800 | 9512.96 |
# Filtra os dados pela coluna tipo e seleciona os índices
df[df['Tipo']=='SELIC'].index
Int64Index([0, 1, 2, 3], dtype='int64')
# Seleciona o df utilizando os índices filtrados
df.iloc[df[df['Tipo']=='SELIC'].index]
| Tipo | Título | Vencimento | Rentabilidade (Compra) | Preço R$ (Compra) | Rentabilidade (Venda) | Preço R$ (Venda) | |
|---|---|---|---|---|---|---|---|
| 0 | SELIC | Tesouro Selic 2023 | 2023-03-01 | 0.000 | 0.00 | 0.0440 | 11789.59 |
| 1 | SELIC | Tesouro Selic 2024 | 2024-09-01 | 0.000 | 0.00 | 0.1028 | 11766.61 |
| 2 | SELIC | Tesouro Selic 2025 | 2025-03-01 | 0.112 | 11757.60 | 0.1220 | 11754.42 |
| 3 | SELIC | Tesouro Selic 2027 | 2027-03-01 | 0.164 | 11703.08 | 0.1740 | 11697.60 |
df[df['Tipo']=='PREFIXADO'].index
Int64Index([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], dtype='int64')
# Seleciona o df utilizando os índices filtrados
df.iloc[df[df['Tipo']=='PREFIXADO'].index]
| Tipo | Título | Vencimento | Rentabilidade (Compra) | Preço R$ (Compra) | Rentabilidade (Venda) | Preço R$ (Venda) | |
|---|---|---|---|---|---|---|---|
| 4 | PREFIXADO | Tesouro Prefixado 2023 | 2023-01-01 | 0.00 | 0.00 | 13.66 | 933.23 |
| 5 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2023 | 2023-01-01 | 0.00 | 0.00 | 13.67 | 1027.32 |
| 6 | PREFIXADO | Tesouro Prefixado 2024 | 2024-07-01 | 0.00 | 0.00 | 13.09 | 779.99 |
| 7 | PREFIXADO | Tesouro Prefixado 2025 | 2025-01-01 | 12.64 | 739.47 | 12.76 | 737.47 |
| 8 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2025 | 2025-01-01 | 0.00 | 0.00 | 12.81 | 988.90 |
| 9 | PREFIXADO | Tesouro Prefixado 2026 | 2026-01-01 | 0.00 | 0.00 | 12.69 | 655.15 |
| 10 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2027 | 2027-01-01 | 0.00 | 0.00 | 12.86 | 953.96 |
| 11 | PREFIXADO | Tesouro Prefixado 2029 | 2029-01-01 | 12.77 | 456.99 | 12.89 | 453.84 |
| 12 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2029 | 2029-01-01 | 0.00 | 0.00 | 12.92 | 925.70 |
| 13 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2031 | 2031-01-01 | 0.00 | 0.00 | 13.00 | 900.90 |
| 14 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2033 | 2033-01-01 | 12.96 | 885.43 | 13.08 | 879.72 |
# Para mostrar somente os preços de compra, drop nas colunas de índice 5 e 6
df.drop(df.columns[[5, 6]], axis=1).head()
| Tipo | Título | Vencimento | Rentabilidade (Compra) | Preço R$ (Compra) | |
|---|---|---|---|---|---|
| 0 | SELIC | Tesouro Selic 2023 | 2023-03-01 | 0.000 | 0.00 |
| 1 | SELIC | Tesouro Selic 2024 | 2024-09-01 | 0.000 | 0.00 |
| 2 | SELIC | Tesouro Selic 2025 | 2025-03-01 | 0.112 | 11757.60 |
| 3 | SELIC | Tesouro Selic 2027 | 2027-03-01 | 0.164 | 11703.08 |
| 4 | PREFIXADO | Tesouro Prefixado 2023 | 2023-01-01 | 0.000 | 0.00 |
# Para mostrar somente os preços de venda, drop nas colunas de índice 3 e 4
df.drop(df.columns[[3, 4]], axis=1).head()
| Tipo | Título | Vencimento | Rentabilidade (Venda) | Preço R$ (Venda) | |
|---|---|---|---|---|---|
| 0 | SELIC | Tesouro Selic 2023 | 2023-03-01 | 0.0440 | 11789.59 |
| 1 | SELIC | Tesouro Selic 2024 | 2024-09-01 | 0.1028 | 11766.61 |
| 2 | SELIC | Tesouro Selic 2025 | 2025-03-01 | 0.1220 | 11754.42 |
| 3 | SELIC | Tesouro Selic 2027 | 2027-03-01 | 0.1740 | 11697.60 |
| 4 | PREFIXADO | Tesouro Prefixado 2023 | 2023-01-01 | 13.6600 | 933.23 |
# Somente os títulos em negociação possuem um preço de compra
df[df['Preço R$ (Compra)'] != 0]
| Tipo | Título | Vencimento | Rentabilidade (Compra) | Preço R$ (Compra) | Rentabilidade (Venda) | Preço R$ (Venda) | |
|---|---|---|---|---|---|---|---|
| 2 | SELIC | Tesouro Selic 2025 | 2025-03-01 | 0.112 | 11757.60 | 0.122 | 11754.42 |
| 3 | SELIC | Tesouro Selic 2027 | 2027-03-01 | 0.164 | 11703.08 | 0.174 | 11697.60 |
| 7 | PREFIXADO | Tesouro Prefixado 2025 | 2025-01-01 | 12.640 | 739.47 | 12.760 | 737.47 |
| 11 | PREFIXADO | Tesouro Prefixado 2029 | 2029-01-01 | 12.770 | 456.99 | 12.890 | 453.84 |
| 14 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2033 | 2033-01-01 | 12.960 | 885.43 | 13.080 | 879.72 |
| 17 | IPCA | Tesouro IPCA+ 2026 | 2026-08-15 | 5.300 | 3208.18 | 5.420 | 3193.04 |
| 20 | IPCA | Tesouro IPCA+ com Juros Semestrais 2032 | 2032-08-15 | 5.530 | 4200.28 | 5.650 | 4163.90 |
| 21 | IPCA | Tesouro IPCA+ 2035 | 2035-05-15 | 5.680 | 1953.75 | 5.800 | 1925.44 |
| 23 | IPCA | Tesouro IPCA+ com Juros Semestrais 2040 | 2040-08-15 | 5.690 | 4198.43 | 5.810 | 4145.30 |
| 24 | IPCA | Tesouro IPCA+ 2045 | 2045-05-15 | 5.680 | 1126.18 | 5.800 | 1097.37 |
| 27 | IPCA | Tesouro IPCA+ com Juros Semestrais 2055 | 2055-05-15 | 5.820 | 4110.68 | 5.940 | 4041.90 |
Considerações:
def consultaTD(op,tp):
"""
op:'C','V','' para Compra, Venda ou ambos
tp:'S','P','I', '' para Selic, Prefixado, IPCA ou todos
"""
op = op
tp = tp
url = 'https://www.tesourodireto.com.br/json/br/com/b3/tesourodireto/service/api/treasurybondsinfo.json'
resp_dict = requests.get(url,verify=False).json()
n_titulos = len(resp_dict['response']['TrsrBdTradgList'])
tipos = []
nomes = []
tx_compras = []
tx_vendas = []
p_compras = []
p_vendas = []
vencimentos = []
for i in range(n_titulos):
tipos.append(resp_dict['response']['TrsrBdTradgList'][i]['TrsrBd']['FinIndxs']['nm'])
nomes.append(resp_dict['response']['TrsrBdTradgList'][i]['TrsrBd']['nm'])
vencimentos.append(resp_dict['response']['TrsrBdTradgList'][i]['TrsrBd']['mtrtyDt'])
tx_compras.append(resp_dict['response']['TrsrBdTradgList'][i]['TrsrBd']['anulInvstmtRate'])
p_compras.append(resp_dict['response']['TrsrBdTradgList'][i]['TrsrBd']['untrInvstmtVal'])
tx_vendas.append(resp_dict['response']['TrsrBdTradgList'][i]['TrsrBd']['anulRedRate'])
p_vendas.append(resp_dict['response']['TrsrBdTradgList'][i]['TrsrBd']['untrRedVal'])
df = pd.DataFrame()
df['Tipo'] = tipos
df['Título'] = nomes
df['Vencimento'] = pd.to_datetime(vencimentos)
df['Rentabilidade (Compra)'] = tx_compras
df['Preço R$ (Compra)'] = p_compras
df['Rentabilidade (Venda)'] = tx_vendas
df['Preço R$ (Venda)'] = p_vendas
if tp == 'S':
df = df.iloc[df[df['Tipo']=='SELIC'].index]
elif tp == 'P':
df = df.iloc[df[df['Tipo']=='PREFIXADO'].index]
elif tp == 'I':
df = df.iloc[df[df['Tipo']=='IPCA'].index]
else:
df = df
if op == 'C':
return df[df['Preço R$ (Compra)']!=0].drop(df.columns[[5, 6]],axis=1)
elif op == 'V':
return df.drop(df.columns[[3, 4]],axis=1)
else:
return df
consultaTD('C','')
| Tipo | Título | Vencimento | Rentabilidade (Compra) | Preço R$ (Compra) | |
|---|---|---|---|---|---|
| 2 | SELIC | Tesouro Selic 2025 | 2025-03-01 | 0.112 | 11757.60 |
| 3 | SELIC | Tesouro Selic 2027 | 2027-03-01 | 0.164 | 11703.08 |
| 7 | PREFIXADO | Tesouro Prefixado 2025 | 2025-01-01 | 12.640 | 739.47 |
| 11 | PREFIXADO | Tesouro Prefixado 2029 | 2029-01-01 | 12.770 | 456.99 |
| 14 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2033 | 2033-01-01 | 12.960 | 885.43 |
| 17 | IPCA | Tesouro IPCA+ 2026 | 2026-08-15 | 5.300 | 3208.18 |
| 20 | IPCA | Tesouro IPCA+ com Juros Semestrais 2032 | 2032-08-15 | 5.530 | 4200.28 |
| 21 | IPCA | Tesouro IPCA+ 2035 | 2035-05-15 | 5.680 | 1953.75 |
| 23 | IPCA | Tesouro IPCA+ com Juros Semestrais 2040 | 2040-08-15 | 5.690 | 4198.43 |
| 24 | IPCA | Tesouro IPCA+ 2045 | 2045-05-15 | 5.680 | 1126.18 |
| 27 | IPCA | Tesouro IPCA+ com Juros Semestrais 2055 | 2055-05-15 | 5.820 | 4110.68 |
consultaTD('C','I')
| Tipo | Título | Vencimento | Rentabilidade (Compra) | Preço R$ (Compra) | |
|---|---|---|---|---|---|
| 17 | IPCA | Tesouro IPCA+ 2026 | 2026-08-15 | 5.30 | 3208.18 |
| 20 | IPCA | Tesouro IPCA+ com Juros Semestrais 2032 | 2032-08-15 | 5.53 | 4200.28 |
| 21 | IPCA | Tesouro IPCA+ 2035 | 2035-05-15 | 5.68 | 1953.75 |
| 23 | IPCA | Tesouro IPCA+ com Juros Semestrais 2040 | 2040-08-15 | 5.69 | 4198.43 |
| 24 | IPCA | Tesouro IPCA+ 2045 | 2045-05-15 | 5.68 | 1126.18 |
| 27 | IPCA | Tesouro IPCA+ com Juros Semestrais 2055 | 2055-05-15 | 5.82 | 4110.68 |
consultaTD('V','S')
| Tipo | Título | Vencimento | Rentabilidade (Venda) | Preço R$ (Venda) | |
|---|---|---|---|---|---|
| 0 | SELIC | Tesouro Selic 2023 | 2023-03-01 | 0.0440 | 11789.59 |
| 1 | SELIC | Tesouro Selic 2024 | 2024-09-01 | 0.1028 | 11766.61 |
| 2 | SELIC | Tesouro Selic 2025 | 2025-03-01 | 0.1220 | 11754.42 |
| 3 | SELIC | Tesouro Selic 2027 | 2027-03-01 | 0.1740 | 11697.60 |
consultaTD('V','P')
| Tipo | Título | Vencimento | Rentabilidade (Venda) | Preço R$ (Venda) | |
|---|---|---|---|---|---|
| 4 | PREFIXADO | Tesouro Prefixado 2023 | 2023-01-01 | 13.66 | 933.23 |
| 5 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2023 | 2023-01-01 | 13.67 | 1027.32 |
| 6 | PREFIXADO | Tesouro Prefixado 2024 | 2024-07-01 | 13.09 | 779.99 |
| 7 | PREFIXADO | Tesouro Prefixado 2025 | 2025-01-01 | 12.76 | 737.47 |
| 8 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2025 | 2025-01-01 | 12.81 | 988.90 |
| 9 | PREFIXADO | Tesouro Prefixado 2026 | 2026-01-01 | 12.69 | 655.15 |
| 10 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2027 | 2027-01-01 | 12.86 | 953.96 |
| 11 | PREFIXADO | Tesouro Prefixado 2029 | 2029-01-01 | 12.89 | 453.84 |
| 12 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2029 | 2029-01-01 | 12.92 | 925.70 |
| 13 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2031 | 2031-01-01 | 13.00 | 900.90 |
| 14 | PREFIXADO | Tesouro Prefixado com Juros Semestrais 2033 | 2033-01-01 | 13.08 | 879.72 |