O título NTN-F (Nota do Tesouro Nacional Série F), recentemente renomeado para Tesouro Prefixado com Juros Semestrais, por questões de marketing do produto, é um título público emitido pelo Tesouro Nacional que paga juros pré-fixados.

Diferente da LTN (Letra do Tesouro Nacional ou Tesouro Prefixado), que possui apenas um fluxo de pagamento de juros, no vencimento do título, o NTN-F paga um cupom de 10% ao ano dividido em fluxos semestrais.

Vamos ver aqui com calcular o preço um NTN-F, vamos construir o fluxo de pagamentos, implementar o cálculo do valor presente dos fluxos usando a taxa interna de retorno divulgada no Tesouro Direto. Diariamente são divulgados no site do Tesouro Direto a taxa e o preço de venda dos títulos. No R podemos obter estes dados através do pacote GetTDData.

Vamos usar o pacote GetTDData para fazer obter os dados históricos do NTN-F com vencimento em 2031-01-01, que é o título negociado nesta data no Tesouro Direto.

library(GetTDData)
library(tidyverse)
library(bizdays)

asset_code <- "NTN-F"
maturity <- as.Date("2031-01-01")

download.TD.data(asset.codes = "NTN-F")
ntnfs <- read.TD.files(asset.codes = "NTN-F", maturity = format(maturity, "%d%m%y"))

A variável ntnfs é um data.frame com todo o histórico de preços e taxas dos títulos.

ntnfs %>% head()
##     ref.date yield.bid price.bid   asset.code matur.date
## 1 2020-02-10    0.0669   1257.57 NTN-F 010131 2031-01-01
## 2 2020-02-11    0.0657   1268.26 NTN-F 010131 2031-01-01
## 3 2020-02-12    0.0656   1269.45 NTN-F 010131 2031-01-01
## 4 2020-02-13    0.0664   1262.85 NTN-F 010131 2031-01-01
## 5 2020-02-14    0.0656   1270.09 NTN-F 010131 2031-01-01
## 6 2020-02-17    0.0654   1272.15 NTN-F 010131 2031-01-01

price.bid é o preço de venda do título e yield.bid é a taxa de venda.

Vamos visualizar os preços.

ntnfs %>%
  mutate(ref.date = as.Date(ref.date)) %>%
  ggplot(aes(x = ref.date, y = price.bid)) +
  geom_line(size = 1) +
  labs(title = "Preços NTN-F 2031-01-01", x = "Data", y = "Preço")

Agora as taxas

ntnfs %>%
  mutate(ref.date = as.Date(ref.date)) %>%
  ggplot(aes(x = ref.date, y = yield.bid)) +
  geom_line(size = 1) +
  labs(title = "Taxas NTN-F 2031-01-01", x = "Data", y = "Preço")

Neste título, esta taxa (taxa interna de retorno), é muito observada, pois através dela podemos, com mais alguns ingredientes como a duration do contrato, podemos comparar este título com outros títulos. Vamos ver como fazer o apreçamento do título para uma dada taxa.

O NTN-F é um título com fluxos de caixa semestrais, dessa forma vamos começamos construindo um data.frame com o fluxo de caixa utilizando a data de 2020-11-11 como a data de referência, data na qual o cálculo do preço é realizado. A definição de uma data de referência é necessária porque dado que o título possui um vencimento e o prazo para o vencimento influencia no preço temos que tudo mais constante, se variarmos apenas o prazo teremos variação no preço.

refdate <- as.Date("2020-11-11")
ntnf <- data.frame(Dates = seq(maturity, refdate, by = "-6 month") %>% rev())
ntnf
##         Dates
## 1  2021-01-01
## 2  2021-07-01
## 3  2022-01-01
## 4  2022-07-01
## 5  2023-01-01
## 6  2023-07-01
## 7  2024-01-01
## 8  2024-07-01
## 9  2025-01-01
## 10 2025-07-01
## 11 2026-01-01
## 12 2026-07-01
## 13 2027-01-01
## 14 2027-07-01
## 15 2028-01-01
## 16 2028-07-01
## 17 2029-01-01
## 18 2029-07-01
## 19 2030-01-01
## 20 2030-07-01
## 21 2031-01-01

Observamos que são 21 fluxos de pagamentos. Sabemos que todos os fluxos de pagamentos pagam juros semestrais de 10% ao ano e que o último fluxo paga o principal, no valor de R$ 1.000,00. Vamos montar o fluxo de pagamentos.

ntnf <- ntnf %>%
  mutate(Payments = 1.1^0.5 - 1)
ntnf[nrow(ntnf), "Payments"] <- ntnf[nrow(ntnf), "Payments"] + 1
ntnf <- ntnf %>%
  mutate(Payments = 1000 * Payments)
ntnf
##         Dates   Payments
## 1  2021-01-01   48.80885
## 2  2021-07-01   48.80885
## 3  2022-01-01   48.80885
## 4  2022-07-01   48.80885
## 5  2023-01-01   48.80885
## 6  2023-07-01   48.80885
## 7  2024-01-01   48.80885
## 8  2024-07-01   48.80885
## 9  2025-01-01   48.80885
## 10 2025-07-01   48.80885
## 11 2026-01-01   48.80885
## 12 2026-07-01   48.80885
## 13 2027-01-01   48.80885
## 14 2027-07-01   48.80885
## 15 2028-01-01   48.80885
## 16 2028-07-01   48.80885
## 17 2029-01-01   48.80885
## 18 2029-07-01   48.80885
## 19 2030-01-01   48.80885
## 20 2030-07-01   48.80885
## 21 2031-01-01 1048.80885

Note os 20 fluxos de pagamento de R$ 48,81 e o último pagamento de R$ 1.048,81. Para descontar os fluxos de caixa é necessário calcular os dias para o vencimento de cada fluxo, mas antes precisamos ajustar as datas de pagamentos de fluxos de acordo como calendário, pois eventualmente algumas caem em feriados ou fins de semana. Para isso vamos usar funções do pacote bizdays.

ntnf <- ntnf %>%
  mutate(
    AdjDates = following(Dates, "Brazil/ANBIMA"),
    DaysToMaturity = bizdays(refdate, AdjDates, "Brazil/ANBIMA"),
  )
ntnf
##         Dates   Payments   AdjDates DaysToMaturity
## 1  2021-01-01   48.80885 2021-01-04             36
## 2  2021-07-01   48.80885 2021-07-01            159
## 3  2022-01-01   48.80885 2022-01-03            287
## 4  2022-07-01   48.80885 2022-07-01            411
## 5  2023-01-01   48.80885 2023-01-02            538
## 6  2023-07-01   48.80885 2023-07-03            662
## 7  2024-01-01   48.80885 2024-01-02            787
## 8  2024-07-01   48.80885 2024-07-01            911
## 9  2025-01-01   48.80885 2025-01-02           1041
## 10 2025-07-01   48.80885 2025-07-01           1163
## 11 2026-01-01   48.80885 2026-01-02           1294
## 12 2026-07-01   48.80885 2026-07-01           1416
## 13 2027-01-01   48.80885 2027-01-04           1544
## 14 2027-07-01   48.80885 2027-07-01           1667
## 15 2028-01-01   48.80885 2028-01-03           1795
## 16 2028-07-01   48.80885 2028-07-03           1919
## 17 2029-01-01   48.80885 2029-01-02           2044
## 18 2029-07-01   48.80885 2029-07-02           2168
## 19 2030-01-01   48.80885 2030-01-02           2294
## 20 2030-07-01   48.80885 2030-07-01           2417
## 21 2031-01-01 1048.80885 2031-01-02           2547

Tendo os fluxos de caixa e os prazos para pagamentos em dias úteis, só precisamos definir a taxa. Vamos pegar a taxa para a data de referência em nosso histórico.

ntnfs %>%
  filter(ref.date == refdate)
##     ref.date yield.bid price.bid   asset.code matur.date
## 1 2020-11-11     0.076      1199 NTN-F 010131 2031-01-01

Na data de referência a taxa é 7,6%. Vamos usar para fazer o desconto do fluxo de caixa a valor presente.

ntnf <- ntnf %>%
  mutate(
    Yield = 0.076,
    DiscountedPayments = Payments / ((1 + Yield) ^ (DaysToMaturity/252))
  )
ntnf
##         Dates   Payments   AdjDates DaysToMaturity Yield DiscountedPayments
## 1  2021-01-01   48.80885 2021-01-04             36 0.076           48.30076
## 2  2021-07-01   48.80885 2021-07-01            159 0.076           46.60436
## 3  2022-01-01   48.80885 2022-01-03            287 0.076           44.90223
## 4  2022-07-01   48.80885 2022-07-01            411 0.076           43.31260
## 5  2023-01-01   48.80885 2023-01-02            538 0.076           41.74283
## 6  2023-07-01   48.80885 2023-07-03            662 0.076           40.26505
## 7  2024-01-01   48.80885 2024-01-02            787 0.076           38.82830
## 8  2024-07-01   48.80885 2024-07-01            911 0.076           37.45370
## 9  2025-01-01   48.80885 2025-01-02           1041 0.076           36.06480
## 10 2025-07-01   48.80885 2025-07-01           1163 0.076           34.80827
## 11 2026-01-01   48.80885 2026-01-02           1294 0.076           33.50773
## 12 2026-07-01   48.80885 2026-07-01           1416 0.076           32.34029
## 13 2027-01-01   48.80885 2027-01-04           1544 0.076           31.15913
## 14 2027-07-01   48.80885 2027-07-01           1667 0.076           30.06477
## 15 2028-01-01   48.80885 2028-01-03           1795 0.076           28.96671
## 16 2028-07-01   48.80885 2028-07-03           1919 0.076           27.94123
## 17 2029-01-01   48.80885 2029-01-02           2044 0.076           26.94422
## 18 2029-07-01   48.80885 2029-07-02           2168 0.076           25.99034
## 19 2030-01-01   48.80885 2030-01-02           2294 0.076           25.05566
## 20 2030-07-01   48.80885 2030-07-01           2417 0.076           24.17567
## 21 2031-01-01 1048.80885 2031-01-02           2547 0.076          500.22475

Na coluna DiscountedPayments temos todos os fluxos de pagamentos a valor presente. Para finalizar e calcular o preço do título precisamos apenas somar os fluxos de pagamentos a valor presente.

sum(ntnf$DiscountedPayments)
## [1] 1198.653

Agora é só colocar estes passos em uma função e começar a estressar o preço do título com diferentes taxas.