Bootstrap da ETTJ Nominal utilizando LTN e NTN-F (aplicação em Python)

milton-rocha
8 min readMay 11, 2022

--

Um problema bem frequente no mercado brasileiro é a construção de uma Estrutura a Termo de Taxa de Juros (ETTJ) que consiga capturar todos os produtos do segmento e construir uma curva que realmente reflita os dados de mercado, principalmente quando passamos a tratar de vencimentos mais longos.

No caso da taxa de juros nominal do lado público temos dois títulos que remuneram diretamente esta taxa. LTN (Letra do Tesouro Nacional) e NTN-F (Notas do Tesouro Nacional Série F), ou ainda, no seu nome de Tesouro Direto: Tesouro Prefixado e Tesouro Prefixado com Cupom Semestral, respectivamente.

Quais são os problemas que surgem ao se tentar criar uma ETTJ com estes títulos? Ao considerarmos somente as LTN, serão considerados apenas títulos que vencem até ~3Y depois do dia de análise. Caso sejam considerados, por exemplo, os dados de mercado do dia 10/05/2022, teremos vencimentos disponíveis até a LTN Jul25, o que não possibilita uma análise profunda sobre como as taxas de juros de médio e longo prazo estão se comportando no Brasil.

Entretanto, ao considerar os dados das NTN-F, pode-se notar que existem vencimentos iniciando em Jan23 e finalizando em Jan33, ou seja, algo ao redor de ~10Y de vencimentos disponíveis. Mas sabe-se que estes títulos pagam cupons semestrais de 10% a.a, então, como fazer para comparar a sua taxa com as taxas das LTN, que são bullet?

Como primeira etapa pode-se construir uma matriz de localização dos fluxos ao longo do tempo, para visualizar como que estas NTN-F estão se encadeando durante os vencimentos dos seus cupons:

*Para esta tabela apresentarei a matriz na sua forma transposta somente por facilidade na visualização em uma imagem, mas para as outras visualizações adotarei a notação correta para a matriz de fluxos

Dados: ANBIMA | Elaboração própria

O que se perguntar agora?

  1. Existe casamento dos fluxos de caixa de um vencimento para o outro?Pode-se notar que os títulos NTN-F disponíveis no mercado possuem um descasamento de vencimento entre eles de 3 fluxos de pagamento (cupons). Portanto, não existe casamento perfeito
  2. Todos os títulos disponíveis possuem as mesmas características de construção? Sim
  3. As taxas e preços destes títulos foram divulgadas? Sim e seguem na próxima tabela

Os dados de preços e taxas podem ser visualizados e baixados através do site da Anbima

Dados: ANBIMA | Elaboração própria

Adicionalmente seguem as taxas das LTN para o mesmo dia:

Dados: ANBIMA | Elaboração própria

Tá bom, agora com os dados, o que fazer?

Deve-se partir do mais básico para tentar avançar na ETTJ, como são precificados os títulos em questão? Tanto para a LTN quanto para a NTN-F mostrarei as fórmulas de precificação para (1) utilização da TIR/YTM (caso da NTN-F) e (2) utilização das taxas spot da ETTJ (caso LTN e NTN-F).

Para as fórmulas a seguir o prazo considerado de capitalização é a distância, em anos úteis, entre o fluxo de pagamento (i ou T) e a data de compra/precificação do título (t). Desta forma, uma LTN que possua 252 dias úteis até seu vencimento terá (T-t) = 252/252 = 1.

1.A LTN possui somente um fluxo de caixa, o de seu vencimento, possui valor de FACE de 1.000,00 e seu valor presente (PU) é dado por este mesmo valor de FACE descontado pelo carrego (fator de acúmulo) de juros do período

(1) Fórmula de precificação da LTN

2. A NTN-F remunera 10% a.a de cupom semestralmente e possui valor de FACE de 1.000,00, ou seja, o seu PU nada mais é do que o somatório de todos os fluxos de caixa do título trazidos a valor presente

(2) Fórmula de precificação por YTM (Yield to Maturity) / TIR (Taxa Interna de Retorno)
(3) Fórmula de precificação por taxas spot da ETTJ para cada fluxo

Agora que a precificação dos dois títulos disponíveis com taxas prefixadas foi esclarecida, deve-se pensar no próximo passo.

Como resolver o problema de descasamento de fluxos?

O problema de descasamento pode ser resolvido através da interpolação das taxas de juros disponíveis para títulos de mesmas características na data, ou seja, para que seja possível construir o encadeamento alguns títulos sintéticos serão criados nas datas necessárias utilizando alguma metodologia de interpolação. Este problema e sua solução foram apresentados por Neto et. al. (2019), p. 171.

Neste post a metodologia de interpolação utilizada será a Flat Forward 252 (descrita no Manual de Curvas B3, seção 1.4.2). Esta metodologia pressupõe uma taxa de juros à termo constante entre dois vértices (nós) da curva de juros e os interpola para o prazo desejado, já se utilizando do daycount brasileiro (du/252).

Ao se fazer todo o encadeamento necessário, chega-se a uma matriz nova com todos os fluxos que serão de fato utilizados para o bootstrap, a seguir um breve resumo dos fluxos (somente até NTNF2027, por questão de tamanho de imagem):

*Para esta imagem nota-se que a matriz de fluxos foi corretamente mostrada na imagem, sem transposição como na Tabela 3

Elaborção própria

Os fluxos que estão pintados em cinza são os fluxos de títulos sintéticos, que foram criados por metodologia já explicada. Visto que as datas de vencimento que são necessárias interpolar as taxas já são conhecidas, o último passo é calcular os valores para cada um dos vencimentos:

Dados: ANBIMA | Elaboração própria

Agora que todos os papéis possuem o encadeamento necessário para a construção de uma curva de juros spot via bootstrap, existe apenas mais um ponto a se “consertar”, o primeiro fluxo não possui NTN-F para basear a sua interpolação, o que fazer?

Solução I: Considerar que os juros entre Jul/22 e Jan/23 são flat e criar um título sintético com vencimento Jul/22 e taxa de juros igual à de Jan/23. Esta solução não é factível para o caso, visto que a NTN-F possui cupons, haverá diferença entre a TIR de Jan/23 e uma taxa de juros spot de 10/05/2022 até Jul/22, mesmo que mínima

Solução 2: Notar que o título necessário para encadear o primeiro fluxo é uma NTN-F com somente um cupom (o de vencimento) e que será descontado pela taxa de juros spot até Jul/22, ou seja, esta taxa será a taxa de juros negociada pela LTN Jul22, que teve ajuste igual a 12,8434. Esta é a solução apresentada na tabela!

Visto que todos os dados já estão disponíveis, só será necessário fazer o bootstrap dos títulos para se calcular a taxa de juros spot de cada um dos fluxos e, por consequência, atingir a ETTJ Pré disponibilizada intrinsicamente por estes títulos.

O famoso Bootstrap

Partindo da equação (3), o passo a passo que deve ser seguido para extrair a taxa de juros spot é:

  1. Calcular o número de fluxos para o vencimento desejado
  2. Calcular os fluxos do vencimento desejado
  3. Pegar o resultado do último vencimento encadeado (caso número de fluxos > 1)
  4. Usar o resultado do último vencimento encadeado para extrair a taxa de juros spot com manipulação algébrica da fórmula para o vencimento

Para os 3 primeiros vencimentos encadeados as equações expandidas ao utilizar o passo a passo são:

(4), (5) e (6) : Equações bootstrap NTN-F

Nota-se um padrão que começa a se formar a partir da terceira equação, onde o primeiro fluxo do segundo vencimento se repete como primeiro fluxo do terceiro vencimento e assim sucessivamente para todos os vencimentos que se seguem.

Para resumir todas as equações de forma que seja possível associar cada um de seus fluxos caso se repitam será utilizada uma nova notação, mais simples. Cada um dos fluxos terá um nome próprio que o identifica, composto por C_{ni} onde C = cupom, n = número do vencimento encadeado e i = número do fluxo, de modo que as equações de (4) a (6) irão se tornar:

(7), (8) e (9) : Equações bootstrap NTN-F

Desta forma, sabe-se que para quaisquer cupons com i = n, este será o cupom de vencimento do título e, dado que todos os títulos possuem as mesmas características, cupons no formato C_{ni} onde o i for igual entre os vencimentos e n for diferente, ex: C_21 e C_31, os cupons serão iguais.

A solução algébrica para cada um dos fluxos gerará muito trabalho mas existe outra maneira, mais simplificada, de se chegar no resultado necessário, pois como observam Santos e Silva (2017), p. 203, ao se construir todos os fluxos disponíveis no mercado e nos títulos sintéticos, chega-se a uma matriz de fluxos que é quadrada e inversível e que pode ser resolvida pela seguinte equação:

Primeiramente converte-se a matriz de fluxos construída para que a sua base vire 1000 reais, ou seja, o valor de FACE da NTN-F:

Transformação de matriz de fluxos

A solução do bootstrap será dada por:

(10) Solução do bootstrap

*No caso desta matriz existem duas formas de se calcular o seu resultado:

  • Método 1: Calcular a matriz de fluxos com base 1 (igual já foi apresentada na tabela e dividir os preços por 1000 para equiparar a base de comparação
  • Método 2: Multiplicar a matriz de fluxos por 1000 e deixar os preços na base que já estão

Agora que a solução do bootstrap de forma matricial já foi apresentada, torna-se apenas necessário construir ou uma planilha Excel ou um código Python (gist localizado no final do post) para solucionar a ETTJ para o dia:

Dados: ANBIMA | Elaboração própria

Código base em Python

Código base criado para solucionar o bootstrap apresentado

Referências bibliográficas

[Neto et. al. (2019)] José Monteiro Varanda Neto, de Souza Santos, José Carlos, Mello, e Eduardo Morato. O mercado de renda fixa no Brasil: conceitos, precificação e risco. Saint Paul, 2019

[Santos e Silva (2017)] José Santos e Marcos Silva. Derivativos e renda fixa: Teoria e aplicações ao mercado brasileiro, volume 1. Atlas, São Paulo, 2017.

[Manual de Curvas B3] Manual de Curvas B3, acesso em: 11/05/2022

--

--