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.