# How to Calculate Bond Yields

According to Bloomberg, the coupon rate on a 10-year UK government gilt is 4.75%. Bloomberg also states that the yield is currently 0.47%, and the market price £144.57.

The UK Debt Management Office (https://www.dmo.gov.uk/responsibilities/gilt-market/about-gilts/) states that:

The prices of conventional gilts are quoted in terms of £100 nominal.

So with a coupon rate of 4.75%, this would mean that the annual coupon payment on a 10-year UK government gilt is £4.75:

$$100 \times 0.0475 = 4.75$$

But if the following formula is correct:

$$Current$$ $$Yield = \frac{C}{P}$$

Where:

$$C$$ = Annual coupon payment

$$P$$ = Bond price

Then according to the formula, the yield should be $$\frac{4.75}{144.57}\approx3.29$$%

Clearly this isn't the case. So where did I go wrong with these calculations?

Gilt yields are usually displayed as yield to maturity (YTM). It gives you information about how much return you can expect over a period of time if you hold the bond until maturity. This yield is usually found with some root solver (Bisection, Newton-Raphson or the like).

Using the current price is a rather futile task, because the price constantly changes and will be at 100 at maturity.

It is relatively simple to show that plugging the YTM into the bond pricing formula yields the quoted market price. For simplicity, I ignore exact daycounts and calendars and simply assume equal payments each 6 months spread out over 10 years, with the final payment including the notional.

Using Julia to do the bulk of work, the undiscounted cashflows look like this:

c = 4.75
n = 100
cf = [(n*c/100/2) for i in 0.5:0.5:9.5]
append!(cf, (n*c/100/2 + n))
cf
DataFrame(year_frac =0.5:0.5:10, cf = cf)


To get NPV, one needs to discount the cashflows and sum them up. This can be done with the following formula (f denotes the frequency of payments per year, y stands for time to maturity).

function npv(c,n,ytm,f,y) # f = payment frequency per year, y = years to maturity
cf = [(n*c/100/f)/((1+ytm/100/f)^i) for i in 0.5:1/f:y-1/f]
append!(cf, (n*c/100/f + n)/(1+ytm/100/f)^y)
return DataFrame(cf = cf), sum(cf)
end


If we set ytm = 0.47 (to equal Bloomberg's number), we get

Using the function, we can show what a root solver is doing in this particular case - it is trying to find the YTM that makes the NPV of the casflows euqal to the quoted market price. Below, I compute a few NPVs.

and show where the quoted price and computed ytm are.

The picture above is a bit misleading because it looks as if the relationship between yield and NPV is linear, whereas it is actually convex. The reason is that I only show a small area.

Overall, there exist various ways to compute yields though, even for the same bond, as you can see for example in the answer to the question about the difference between discount yield and the US treasury convention on Bloomberg

I will try to give you a very simple explanation of it with an example so that you understand

Now let's say,

Country - XYZ issue 5% Coupon, 10 Year Bonds on Jan 5th 2020

worth 100 Million, where each bond is of $100 each. So basically a 1 Million Bonds of$100 each.

Also, Where interest is paid annually, and the Bond is redeemable at Par, i.e $100 The bonds get subscribed fully, and now there are holders of that Bond and the XYZ Country gets$100 Million

The Bonds starts trading at $100. Now lets say there is more demand for the bond due to certain market conditions and the bond goes to$120 on Jan 6th, 2024.

Now there are 6 more payments of $5 Dollar on each bond left. So if a person holds 1 Bond till maturity they can at least expect to get$30 back provided that Nation XYZ doesn't default midway.

Now, Although there are 6 more payments left and the bond price will still probably fluctuate, ( it might up or down ) , But still on Jan 5th 2030, i.e 10 years after the issue, on Maturity of the bond you will get back 100 Dollars and not $120. I think in your question you didn't factor in that. So in your question you said that the 10 Year Gilt was trading at around 144 Pounds with a coupon of$4.75 but the Yield is 0.47 %.

AS IT SHOULD BE.

Because if you invest 144 Pounds today, although you will get 4.75 Pounds every year as your interest payment, Still upon maturity you will probably get back 100 Pounds and not 144 9 considering the Bond was issued at 100 Pounds and redeemable at par )

So you're directly losing 44 Pounds because of that. ( besides gaining back the interest payments made every year )

So eventually the return on investment will be lower than what you calcualted.

I think by now you would have understood why the yield is much lower than 3.29 %

Hope my answer was of help to you.