knitr::opts_chunk$set(echo = TRUE)
library(fixedincome)
library(bizdays)
library(httr)
library(jsonlite)
library(transmute)
Títulos Públicos Federais   10/Mar/2017

Papel PREFIXADO LTN - Taxa (% a.a.)/252
Código SELIC    Data Base/Emissão   Data de Vencimento  Tx. Compra  Tx. Venda   Tx. Indicativas PU  Intervalo Indicativo
Mínimo (D0) Máximo (D0) Mínimo (D+1)    Máximo (D+1)
100000  15/01/2016  01/04/2017  12,1920 12,1850 12,1892 992,723961  12,0212 12,4911 12,0216 12,4990
100000  04/10/2013  01/07/2017  11,1660 11,1579 11,1630 968,181071  11,0212 11,5274 10,9290 11,4306
100000  03/07/2015  01/10/2017  10,4802 10,4691 10,4735 945,792913  10,2839 10,9977 10,1465 10,8583
100000  10/01/2014  01/01/2018  10,0261 10,0143 10,0200 926,311081  9,8257  10,6465 9,6568  10,4760
100000  08/01/2016  01/04/2018  9,8103  9,7915  9,8024  907,017003  9,5931  10,4931 9,4150  10,3139
100000  04/07/2014  01/07/2018  9,6500  9,6311  9,6405  887,751622  9,4460  10,4062 9,2370  10,1964
100000  08/07/2016  01/10/2018  9,5840  9,5713  9,5762  868,029325  9,3872  10,3914 9,1629  10,1666
100000  09/01/2015  01/01/2019  9,5800  9,5678  9,5735  848,754592  9,3860  10,4269 9,1491  10,1893
100000  06/01/2017  01/04/2019  9,6428  9,6335  9,6394  829,161864  9,4260  10,5043 9,1964  10,2741
100000  03/07/2015  01/07/2019  9,6790  9,6683  9,6750  809,999115  9,4480  10,5543 9,2181  10,3241
100000  08/01/2016  01/01/2020  9,7647  9,7537  9,7600  770,642258  9,5200  10,6668 9,2809  10,4274
100000  08/07/2016  01/07/2020  9,9300  9,9249  9,9264  732,741102  9,6487  10,8302 9,4199  10,6011
{
  "name": "LTN_20170401",
  "issue_date": "2016-01-15",
  "maturity_date": {
    "value": "2017-04-01",
    "calendar_adjustment": "following"
  },
  "spot_price": 992.723961,
  "yield_rate": {
    "value": 12.1892,
    "compounding": "discrete",
    "daycount": "business/252",
    "calendar": "Brazil/ANBIMA"
  },
  // ----
  "currency": "BRL",
  "instrument_type": "ZeroCouponBond",
  "notional": 1000,
  "calendar": "Brazil/ANBIMA",
  "pricing_model": {
    "model": "PVFixedRate",
    "compounding": "discrete",
    "daycount": "business/252"
  }
}
# ZeroCouponBond(
#   notional = 1000,
#   yield_rate = "0.121892 discrete business/252 Brazil/ANBIMA",
#   maturity_date = "2017-04-01",
#   issue_date = "2016-01-15",
#   calendar_adjustment = "following",
#   calendar = "Brazil/ANBIMA"
# )
url <- modify_url("https://api.morph.io/wilsonfreitas/MorthIO_VNATitulosPublicos_ANBIMA/data.json",
                  query = list(key = "uIUD3TeyxgIVWhVwsFr0",
                               query = "select * from 'data' where data_ref in (select max(data_ref) from 'data')"))
res <- GET(url)
fromJSON(content(res, as = "text"))

url <- modify_url("https://api.morph.io/wilsonfreitas/MorthIO_TitulosPublicos_ANBIMA/data.json",
                  query = list(key = "uIUD3TeyxgIVWhVwsFr0",
                               query = "select * from 'data' where data_referencia in (select max(data_referencia) from 'data') and titulo = 'LTN'"))

res <- GET(url)
df <- fromJSON(content(res, as = "text"))

url <- modify_url("https://api.morph.io/wilsonfreitas/MorthIO_TaxasVNATitulosPublicos_ANBIMA/data.json",
                  query = list(key = "uIUD3TeyxgIVWhVwsFr0",
                               query = "select * from 'data' where data_ref in (select max(data_ref) from 'data')"))
res <- GET(url)
fromJSON(content(res, as = "text"))

LTN - ZeroCouponBond

url <- modify_url("https://api.morph.io/wilsonfreitas/MorthIO_TitulosPublicos_ANBIMA/data.json",
                  query = list(key = "uIUD3TeyxgIVWhVwsFr0",
                               query = "select * from 'data' where data_referencia in (select max(data_referencia) from 'data') and titulo = 'LTN'"))

res <- GET(url)
df <- fromJSON(content(res, as = "text"))

tr_ <- transmuter(
  match_regex("^\\d{8}$", function(text, match) as.Date(text, format="%Y%m%d"))
)
df <- transmute(tr_, df)

yield_rate <- spotrate(df$taxa_ind/100, "discrete", "business/252", "Brazil/ANBIMA")

1000 * discount(yield_rate, df$data_referencia, bizdays::following(df$data_vencimento, "Brazil/ANBIMA"))

NTN-F - FixedRateBond

url <- modify_url("https://api.morph.io/wilsonfreitas/MorthIO_TitulosPublicos_ANBIMA/data.json",
                  query = list(key = "uIUD3TeyxgIVWhVwsFr0",
                               query = "select * from 'data' where data_referencia in (select max(data_referencia) from 'data') and titulo = 'NTN-F'"))
res <- GET(url)
df <- fromJSON(content(res, as = "text"))
df <- transmute(tr_, df)

yield_rate <- spotrate(df$taxa_ind/100, "discrete", "business/252", "Brazil/ANBIMA")

df_split <- split(df, df$data_vencimento)

df_cf <- lapply(df_split, function(dx) {
  cf_dates <- seq(dx$data_vencimento, dx$data_referencia, by = "-6 months")
  cf_dates <- sort(cf_dates)
  coupon_rate <- spotrate(0.1, "discrete", "business/252", "Brazil/ANBIMA")
  coupon_payment <- 1000 * (compound(coupon_rate, 6, "months") - 1)
  cf <- data.frame(
    coupon_dates = cf_dates,
    payment_dates = bizdays::following(cf_dates, "Brazil/ANBIMA"),
    coupon_payments = coupon_payment,
    amortization = 0
  )
  cf$business_days <- bizdays::bizdays(dx$data_referencia, cf$payment_dates, "Brazil/ANBIMA")
  cf$amortization[dim(cf)[1]] <- 1000
  cf
})

mapply(function(bx, cf) {
  yield_rate <- spotrate(bx$taxa_ind/100, "discrete", "business/252", "Brazil/ANBIMA")
  payments <- cf$coupon_payments + cf$amortization
  sum( payments * discount(yield_rate, cf$business_days, "days") )
}, df_split, df_cf) - df$pu

url <- modify_url("https://api.morph.io/wilsonfreitas/MorthIO_TitulosPublicos_ANBIMA/data.json",
                  query = list(key = "uIUD3TeyxgIVWhVwsFr0",
                               query = "select * from 'data' where data_referencia = '20170404' and titulo = 'NTN-B'"))
res <- GET(url)
df <- fromJSON(content(res, as = "text"))
df <- transmute(tr_, df)

url <- modify_url("https://api.morph.io/wilsonfreitas/MorthIO_VNATitulosPublicos_ANBIMA/data.json",
                  query = list(key = "uIUD3TeyxgIVWhVwsFr0",
                               query = "select VNA from 'data' where data_ref = '2017-04-04' and titulo = 'NTNB'"))
res <- GET(url)
VNA <- fromJSON(content(res, as = "text"))

vna_ntnb <- VNA$VNA
yield_rate <- spotrate(df$taxa_ind/100, "discrete", "business/252", "Brazil/ANBIMA")

df_split <- split(df, df$data_vencimento)

df_cf <- lapply(df_split, function(dx) {
  cf_dates <- seq(dx$data_vencimento, dx$data_referencia, by = "-6 months")
  cf_dates <- sort(cf_dates)
  coupon_rate <- spotrate(0.06, "discrete", "business/252", "Brazil/ANBIMA")
  coupon_payment <- vna_ntnb * (compound(coupon_rate, 6, "months") - 1)
  cf <- data.frame(
    coupon_dates = cf_dates,
    payment_dates = bizdays::following(cf_dates, "Brazil/ANBIMA"),
    coupon_payments = coupon_payment,
    amortization = 0
  )
  cf$business_days <- bizdays::bizdays(dx$data_referencia, cf$payment_dates, "Brazil/ANBIMA")
  cf$amortization[dim(cf)[1]] <- vna_ntnb
  cf
})

mapply(function(bx, cf) {
  yield_rate <- spotrate(bx$taxa_ind/100, "discrete", "business/252", "Brazil/ANBIMA")
  payments <- cf$coupon_payments + cf$amortization
  sum( payments * discount(yield_rate, cf$business_days, "days") )
}, df_split, df_cf) - df$pu


wilsonfreitas/R-fixedincome documentation built on June 30, 2023, 7:46 a.m.