def bondPrice(coupon, ytm, maturity):
Final = 0
for i in range(1,maturity*2+1):
Final = Final + (coupon/2)/((1+ytm/2)**i)
Final = Final + 100/((1+ytm/2)**(maturity*2))
return(Final)
def duration(coupon, ytm, maturity):
Final = 0
for i in range(1,maturity*2+1):
Final = Final + (i/2*coupon/2)/((1+ytm/2)**i)
Final = (Final + 100*(maturity)/((1+ytm/2)**(maturity*2)))/bondPrice(coupon, ytm, maturity)
return(Final)
def convexity(coupon, ytm, maturity):
Final = 0
for i in range(1,maturity*2+1):
if i!=(maturity*2):
Final = Final + (((i/2)**2+i/2)*coupon/2)/((1+ytm/2)**i)
else:
Final = Final + (((i/2)**2+i/2)*(100+coupon/2))/((1+ytm/2)**i)
Final = Final/(bondPrice(coupon, ytm, maturity)*(1+ytm)**2)
return(Final)
def f(coupon, ytm, maturity):
print("price: "+ str(round(bondPrice(coupon, ytm, maturity),2)))
print("duration: "+ str(round(duration(coupon, ytm, maturity),2)))
print("convexity: "+ str(round(convexity(coupon, ytm, maturity),2)))
return([duration(coupon, ytm, maturity),convexity(coupon, ytm, maturity)])
import numpy as np
from ipywidgets import interact, interactive, fixed, interact_manual
import ipywidgets as widgets
import matplotlib.pyplot as plt
cm = interactive(f, coupon = widgets.IntSlider(min = 0,max = 15, value = 3), maturity = widgets.IntSlider(min=0, max=100, value=50), ytm = widgets.FloatSlider(min=0.0, max=0.1, step=0.01, value=0.05));
cm2 = interactive(f, coupon = widgets.IntSlider(min = 0,max = 15, value = 4), maturity = widgets.IntSlider(min=0, max=100, value=50), ytm = widgets.FloatSlider(min=0.0, max=0.1, step=0.01, value=0.05))
cm3 = interactive(f, coupon = widgets.IntSlider(min = 0,max = 15, value = 5), maturity = widgets.IntSlider(min=0, max=100, value=50), ytm = widgets.FloatSlider(min=0.0, max=0.1, step=0.01, value=0.05))
display(cm)
display(cm2)
display(cm3)
ytms = np.arange(0.03,0.1,0.002).tolist()
prices_cm = [bondPrice(cm.kwargs['coupon'], ytm, cm.kwargs['maturity']) for ytm in ytms]
prices_cm2 = [bondPrice(cm2.kwargs['coupon'], ytm, cm2.kwargs['maturity']) for ytm in ytms]
prices_cm3 = [bondPrice(cm3.kwargs['coupon'], ytm, cm3.kwargs['maturity']) for ytm in ytms]
plt.plot(ytms, prices_cm, 'r--', ytms, prices_cm2, 'bs', ytms, prices_cm3, 'g^')
plt.show()