In [135]:
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)])
In [136]:
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)
In [137]:
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()