Tags

,

UPDATE: Now with lambda.r

Here’s a short example of calculating zero rates and discount factors from cash rates using lambda.r. Of note is how type conversions are handled and how the core function implementation focuses strictly on the calculation while overloaded versions focus on the type conversions.

discount_factor(deposit.rate, spot.date, maturity.date, day.count) %::% numeric : character : character : character : numeric
discount_factor(deposit.rate, spot.date, maturity.date, day.count) %as% {
  s <- as.Date(spot.date)
  m <- as.Date(maturity.date)
  discount_factor(deposit.rate, s, m, day.count)
}

discount_factor(deposit.rate, spot.date, maturity.date, day.count) %::% numeric : Date : Date : character : numeric
discount_factor(deposit.rate, spot.date, maturity.date, day.count) %as%
{
 days <- as.numeric(maturity.date - spot.date, units="days")
 discount_factor(deposit.rate, days, day.count)
}

discount_factor(deposit.rate, days, "Actual360") %as%
{
 1 / (1 + deposit.rate * days / 360)
}


zero_rate(discount.factor, spot.date, maturity.date) %::% a : character : character : numeric
zero_rate(discount.factor, spot.date, maturity.date) %as%
{
 s <- as.Date(spot.date)
 m <- as.Date(maturity.date)
 zero_rate(discount.factor, s,m)
}

zero_rate(discount.factor, spot.date, maturity.date) %::% a : Date : Date : numeric
zero_rate(discount.factor, spot.date, maturity.date) %as%
{
 days <- as.numeric(maturity.date - spot.date, units="days")
 zero_rate(discount.factor, days)
}

zero_rate(discount.factor, days) %::% a : numeric : numeric
zero_rate(discount.factor, days) %as%
{
 1 / df ^ (1/(days/365)) - 1
}

To get the zero rates, simply execute the following code.

df <- discount_factor(0.0123375, '2009-02-05', '2009-05-05', "Actual360")
zero_rate(df, '2009-02-05', '2009-05-05')