-
Compound Interest Part 1 6
-
Lecture1.1
-
Lecture1.2
-
Lecture1.3
-
Lecture1.4
-
Lecture1.5
-
Lecture1.6
-
-
Compound Interest Part 2 3
-
Lecture2.1
-
Lecture2.2
-
Lecture2.3
-
-
Present Value 4
-
Lecture3.1
-
Lecture3.2
-
Lecture3.3
-
Lecture3.4
-
-
Annuities 6
-
Lecture4.1
-
Lecture4.2
-
Lecture4.3
-
Lecture4.4
-
Lecture4.5
-
Lecture4.6
-
-
Perpetuities 2
-
Lecture5.1
-
Lecture5.2
-
-
Bonds 6
-
Lecture6.1
-
Lecture6.2
-
Lecture6.3
-
Lecture6.4
-
Lecture6.5
-
Lecture6.6
-
-
Dividend Discount Model 3
-
Lecture7.1
-
Lecture7.2
-
Lecture7.3
-
-
Risk 8
-
Lecture8.1
-
Lecture8.2
-
Lecture8.3
-
Lecture8.4
-
Lecture8.5
-
Lecture8.6
-
Lecture8.7
-
Lecture8.8
-
-
Capital Asset Pricing Model 6
-
Lecture9.1
-
Lecture9.2
-
Lecture9.3
-
Lecture9.4
-
Lecture9.5
-
Lecture9.6
-
Discount Bond
At first, it may seem like it does not make sense that this bond can have this present value and rate of return given the coupon payments. For example, the $20 payment divided by the present value of the bond equals just 2.3%.
#The coupon divided by the present value equals 2.3%
print(20/PV)
0.02298544894975868
Where does the rest of the return come from if the one year return would just be 2.3% from the coupon? The answer is that the bond is also worth more now because the future coupons are discounted less, but more importantly the much larger face value payment is even less discounted. What is the bond going to be worth in a year, let's calculate it after visualizing the structure again.
#Now one coupon has been paid out and we have moved forward one year
payments = payments[1:]
print(payments)
[20.0, 20.0, 20.0, 1020.0]
#Plot the cashflows
time = list(range(1,5))
data = []
for x,t in zip(payments,time):
data.append((x,t))
timelinePlot(4,data)
Calculate the value of the bond now.
time = list(range(1,6))
#Now let's say we still have r=5%, what is our present value of the bond?
PV = sum([x/(1.05)**t for x,t in zip(payments,time)])
print(PV)
893.621484875129
Now if we add the price appreciation of the bond plus the coupon we see that what we get back is 5%.
PV0 = 870.1156998810752
PV1 = 893.621484875129
c = 20
print((PV1-PV0+c)/PV0)
0.050000000000000024
Components of Bond Return¶
Now we can say that there are two components of the bond return. We are actually paid out a coupon payment, but besides that the present value of the bond appreciates (in future cases we will see that it may depreciate as well though). We do not actually get those payments, but if the rate stays the same we could hypothetically sell it for more than we bought it at that point to get the rest of our return.
Bond Equation¶
Bonds also have a simple equation to represent them which is just an annuity formula plus the present value of the face value.
$$ PV = F \cdot c \cdot \frac{1-(1+r)^n}{r} + \frac{F}{(1+r)^n}$$
where
$ PV = \text{Present Value} $
$ F = \text{Face Value} $
$ c = \text{Coupon Rate} $
$ r = \text{Discount Rate} $
$ n = \text{Number of Periods} $
#Convert this to some formulas
#Use our annuity formula from before
def annuityTVM(P, n, r):
annuityFactor = (1-(1+r)**-n)/r
annuity = annuityFactor*P
return annuity
def bond_value(F, c, n, r):
#Payment is equal to the coupon rate times the FV
P = F*c
#Find the annuity present value
annuity_PV = annuityTVM(P,n,r)
#Find the face value present value
face_value_PV = (F)/(1+r)**n
#Return the sum
return annuity_PV + face_value_PV
#Same value as before
print(bond_value(1000, .02, 5, .05))
870.1156998810752