In fixed income analysis it is often required to calculate the yield of some coupon paying instrument, for example a bond. Very simply, an yield of a bond is defined as a single rate of return. Under continuous compounding, given a set of interest rates , the yield
equates the present value of the bond computed under a given set of rates. In other words:
where is a coupon paid out at time
. Usually, one solves for
using some iterative guess-work, e.g. goal seek. In this post I will show you a well-know Newton’s recursive method that can be used to base such goal seek on.
The Newton’s Method
The Newton’s method is based on a recursive approximation formula:
Let be the price(or present value) of the bond expressed via its yield. Then, taking
to represent interest rate, we have:
and
The recursive formula to solve for yield becomes:
Goal Seek in C#
Now let’s take a look at an example implementation. The while loop in CalculateYield method implements the goal seek. This is a very simple example, and we pretend to have the bond price.
using System;
using System.Collections.Generic;
using System.Linq;
namespace YieldCalculator
{
class EntryPoint
{
static void Main(string[] args)
{
// use some numbers to illustrate the point
// maturities in months
int[] maturities = { 6, 12, 18, 24, 30, 36 };
double[] yearFrac = maturities.Select(i => i / 12.0).ToArray();
// bond principle
double P = 100;
// bond price
double B = 108;
double couponRate = 0.1;
// calculate future cashflows
double[] cashflows = maturities.Select(i => (P * couponRate) / 2.0).ToArray();
// add principle repayment
cashflows[cashflows.Count() - 1] = P + cashflows[cashflows.Count() - 1];
double initialGuess = 0.1;
Console.WriteLine(CalculateYield(initialGuess, cashflows, yearFrac, B));
}
static double CalculateYield(double initialGuess, double[] cashflows, double[] yearFrac, double B)
{
double error = 0.000000001;
double x_i = initialGuess-1.0;
double x_i_next = initialGuess;
double numerator;
double denominator;
while (Math.Abs(x_i_next - x_i) > error)
{
x_i = x_i_next;
// linq's Zip is handy to perform a sum over expressions involving several arrays
numerator = cashflows.Zip(yearFrac, (x,y) => (x * Math.Exp(y *-1*x_i))).Sum();
denominator = yearFrac.Zip(cashflows, (x,y) => (x*y*Math.Exp(x*-1*x_i))).Sum();
x_i_next = x_i + (numerator - B) / denominator;
}
return x_i_next;
}
}
}
Note how handy is LINQ’s Zip function to calculate a sum over an expression involving two arrays.
And now to the burning question – why the picture of a cat? The answer is even simpler than this post: It is a cute cat, so, why not?
