I am calculating the theoretical discount factors associated with a bond that has 30 months to maturity from today with the parameters below obtained from here using the Nelson-Siegel-Svensson Model. The Python code is just a direct application of the Nelson-Siegel-Svensson Model formula. Are the theoretical Discount factors obtained from NSS meant to be this small?
beta_0 = 6.33120453 beta_1 =-6.22139731 beta_2 = -4.55116776 beta_3 = -8.72097716 tau_1 = 1.68437012 tau_2 = 11.18918219 months_to_maturity_array = numpy.array([6, 12, 18, 24, 30]) years_to_maturity_array = months_to_maturity_array/12 term_1 = (beta_0) + (beta_1*((1-numpy.exp(-years_to_maturity_array/tau_1))/(years_to_maturity_array/tau_1))) + (beta_2*((((1-numpy.exp(-years_to_maturity_array/tau_1))/(years_to_maturity_array/tau_1)))-(numpy.exp(-years_to_maturity_array/tau_1))) + (beta_3*((((1-numpy.exp(-years_to_maturity_array/tau_2))/(years_to_maturity_array/tau_2)))-(numpy.exp(-years_to_maturity_array/tau_2)))) test = numpy.exp(-years_to_maturity_array * (term_1)) print('RESULT:', test)
The output discount factors come out to be
[ 0.9032555 0.70209724 0.44987297 0.23612997 0.10293834], which seems very low. Such small discount factors will result in very small prices as expected, which effects the Non-Linear Optimization used to calculate the parameters. For example if the bond has the set of coupons and face values as shown below, then the
price turns out to be
coupons_and_facevals = [1.5, 1.5, 1.5, 102.5] coupons_and_facevals = numpy.array(coupons_and_facevals) price = 0 for i in range(0,4,1): price = price + coupons_and_facevals[i] * test[i]
I've been dabbling with this for a while but am stuck.