tests/testthat/test-estimation.R

set.seed(1)
bonds <- ycevo_data(n = 10)
res_both <- ycevo(bonds, x = lubridate::ymd(c("2023-03-01"), c("2023-06-01")))
res <- res_both[1,]

test_that("Simulation example", {
  expect_equal(
    head(res$.est[[1]])$tau,
    c(0.0821917808219178, 0.164383561643836, 0.246575342465753, 0.328767123287671,
      0.410958904109589, 0.493150684931507)
  )
  expect_equal(
    tail(res$.est[[1]])$tau,
    c(14.1369863013699, 15.7808219178082, 16.1095890410959, 16.4383561643836,
      18.0821917808219, 18.4109589041096)
  )
  expect_equal(
    head(res$.est[[1]])$.discount,
    c(0.986225688985458, 0.997535179957893, 0.987335706233562, 0.981574003055008,
      0.986434647687132, 0.984658120829134)
  )
  expect_equal(
    tail(res$.est[[1]])$.discount,
    c(0.25173267449438, 0.169062343884191, 0.166603074969578, 0.160818163510621,
      0.100182473682101, 0.0998222330332958)
  )
  expect_equal(
    head(res$.est[[1]])$.yield,
    c(0.168752361106433, 0.0150128314968472, 0.0516887429025604,
      0.0565685218322941, 0.0332349590672765, 0.0313510332302356)
  )
  expect_equal(
    tail(res$.est[[1]])$.yield,
    c(0.0975729579577046, 0.11263594143703, 0.111246853513618, 0.111171759097201,
      0.127239111655866, 0.125162646692807)
  )
})

augmented_res <- augment(res, loess = FALSE)

test_that("Augmentation without loess", {
  expect_equal(
    head(augmented_res)$tau,
    c(0.0821917808219178, 0.164383561643836, 0.246575342465753, 0.328767123287671,
      0.410958904109589, 0.493150684931507)
  )
  expect_equal(
    tail(augmented_res)$tau,
    c(14.1369863013699, 15.7808219178082, 16.1095890410959, 16.4383561643836,
      18.0821917808219, 18.4109589041096)
  )
  expect_equal(
    head(augmented_res)$.discount,
    c(0.986225688985458, 0.997535179957893, 0.987335706233562, 0.981574003055008,
      0.986434647687132, 0.984658120829134)
  )
  expect_equal(
    tail(augmented_res)$.discount,
    c(0.25173267449438, 0.169062343884191, 0.166603074969578, 0.160818163510621,
      0.100182473682101, 0.0998222330332958)
  )
  expect_equal(
    head(augmented_res)$.yield,
    c(0.168752361106433, 0.0150128314968472, 0.0516887429025604,
      0.0565685218322941, 0.0332349590672765, 0.0313510332302356)
  )
  expect_equal(
    tail(augmented_res)$.yield,
    c(0.0975729579577046, 0.11263594143703, 0.111246853513618, 0.111171759097201,
      0.127239111655866, 0.125162646692807)
  )
})

loess_res <- augment(res, loess = TRUE)
test_that("Augmentation with loess", {
  expect_equal(
    head(loess_res)$tau,
    c(0.0821917808219178, 0.164383561643836, 0.246575342465753, 0.328767123287671,
      0.410958904109589, 0.493150684931507)
  )
  expect_equal(
    tail(loess_res)$tau,
    c(14.1369863013699, 15.7808219178082, 16.1095890410959, 16.4383561643836,
      18.0821917808219, 18.4109589041096)
  )
  expect_equal(
    head(loess_res)$.discount,
    c(0.988883162893306, 0.987501222017339, 0.986055618108189, 0.984546532186519,
      0.982974149614928, 0.981338672708148)
  )
  expect_equal(
    tail(loess_res)$.discount,
    c(0.244210089032949, 0.175654062323753, 0.1638048559747, 0.15255635355698,
      0.104834023072191, 0.0968784681344841)
  )
  expect_equal(
    head(loess_res)$.yield,
    c(0.136012273194597, 0.0765133970570866, 0.0569502125082803,
      0.0473712732385921, 0.0417863111143431, 0.0381985617233583)
  )
  expect_equal(
    tail(loess_res)$.yield,
    c(0.0997190188541892, 0.110212179202032, 0.112298299952432, 0.114380124196802,
      0.124729177717189, 0.126788506997888)
  )
})

newdata <- data.frame(
  qdate = lubridate::ymd(c("2023-02-01", "2023-03-01","2023-04-01", "2023-06-01", "2023-07-01")),
  tau = c(10)
)
predict_res <- augment(res_both, newdata = newdata)
test_that("Prediction", {
  expect_equal(predict_res$qdate, newdata$qdate)
  expect_equal(predict_res$tau, rep(10, 5))
  expect_equal(predict_res$.discount,
               c(0.48348414263405, 0.48348414263405, 0.495452546406272, 0.519875259439203,
                 0.519875259439203))
  expect_equal(predict_res$.yield,
               c(0.0726736761660645, 0.0726736761660645, 0.0702283698907689,
                 0.065416638187768, 0.065416638187768))
})


data <- data.frame(
  mat_days = c(180, 360, 360, 540, 540, 540, 720, 720, 720, 720),
  qdate = 0,
  coupon = c(0, 1, 1, 1, 1, 1, 1, 1, 1, 1),
  id = c(1L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 4L),
  pdint = c(100, 101, 1, 101, 1, 1, 101, 1, 1, 1),
  tupq = c(180, 360, 180, 540, 360, 180, 720, 540, 360, 180)
)

data$discount <- exp(-get_yield_at(0, data$tupq/365) * data$tupq/365)
data$price <- rep(tapply(data$pdint * data$discount, data$id, sum), times = rle(data$id)$lengths)

mat_weights_qdatetime <- get_weights(1,1, length(unique(data$qdate)))
tupq_idx <- structure(c(2L, 182L, 362L, 542L, 358L, 538L, 718L, 720L), dim = c(4L, 2L))
mat_weights_tau <- get_weights(
  c(180, 360, 540, 720) / 365,
  c(180, 180, 180, 180) / 365,
  len = as.integer(max(data$tupq)),
  units = 365)
cfp_slist <- ycevo:::get_cfp_slist(data)
price_slist <- cfp_slist$price_slist
cf_slist <- cfp_slist$cf_slist
test_that("Simplest example cpp", {
  expect_equal(
    calc_dbar_c(4L,
                structure(c(1L, 1L), dim = 1:2),
                tupq_idx,
                mat_weights_tau, mat_weights_qdatetime, price_slist, cf_slist),
    structure(c(5678.94832046269, 5705.41441494833, 5625.45900788638,
                5538.31638436822, 5626.6875, 5739.1875, 5738.625, 5738.0625), dim = c(4L, 2L)))
})

Try the ycevo package in your browser

Any scripts or data that you put into this service are public.

ycevo documentation built on June 22, 2024, 10:58 a.m.