def test_FinDiscountCurve(): # Create a curve from times and discount factors startDate = FinDate(1, 1, 2018) years = np.linspace(0, 10, 6) rate = 0.05 + 0.005 * years - 0.0003 * years * years dfs = np.exp(-rate * years) dates = startDate.addYears(years) curve = FinDiscountCurve(startDate, dates, dfs, FinInterpTypes.FLAT_FWD_RATES) testCases.header("T", "DF", "ZERORATE", "CC_FWD", "MM_FWD", "SURVPROB") plotYears = np.linspace(0, 12, 12 * 12 + 1)[1:] plotDates = startDate.addYears(plotYears) # Examine dependency of curve on compounding rate zeroRates_A = curve.zeroRate(plotDates, FinFrequencyTypes.ANNUAL) zeroRates_S = curve.zeroRate(plotDates, FinFrequencyTypes.SEMI_ANNUAL) zeroRates_Q = curve.zeroRate(plotDates, FinFrequencyTypes.QUARTERLY) zeroRates_M = curve.zeroRate(plotDates, FinFrequencyTypes.MONTHLY) zeroRates_C = curve.zeroRate(plotDates, FinFrequencyTypes.CONTINUOUS) if PLOT_GRAPHS: plt.figure(figsize=(6, 4)) plt.plot(plotYears, scale(zeroRates_A, 100), label='A') plt.plot(plotYears, scale(zeroRates_S, 100), label='S') plt.plot(plotYears, scale(zeroRates_Q, 100), label='Q') plt.plot(plotYears, scale(zeroRates_M, 100), label='M') plt.plot(plotYears, scale(zeroRates_C, 100), label='C') plt.ylim((5, 8)) plt.title('Discount Curves') plt.xlabel('Time (years)') plt.ylabel('Zero Rate (%)') plt.legend(loc='lower right', frameon=False) # Examine dependency of fwd curve on the interpolation scheme for interp in FinInterpTypes: curve = FinDiscountCurve(startDate, dates, dfs, interp) fwdRates = curve.fwd(plotDates) zeroRates = curve.zeroRate(plotDates, FinFrequencyTypes.ANNUAL) parRates = curve.swapRate(startDate, plotDates, FinFrequencyTypes.ANNUAL) if PLOT_GRAPHS: plt.figure(figsize=(6, 4)) plt.plot(plotYears, scale(fwdRates, 100), label='FWD RATES') plt.plot(plotYears, scale(zeroRates, 100), label='ZERO RATES') plt.plot(plotYears, scale(parRates, 100), label='PAR RATES') plt.ylim((3.0, 8.5)) plt.title('Forward Curves using ' + str(interp)) plt.xlabel('Time (years)') plt.ylabel('Fwd Rate (%)') plt.legend(loc='lower right', frameon=False)
def test_FinNelsonSiegelSvenssonCurve(): tau1 = 2.0 tau2 = 0.5 times = np.linspace(0.0, 10.0, 5) curve1 = FinNelsonSiegelSvenssonCurve(1., 0., 0., 0., tau1, tau2) factor1loading = curve1.zero(times) curve2 = FinNelsonSiegelSvenssonCurve(0., 1., 0., 0., tau1, tau2) factor2loading = curve2.zero(times) curve3 = FinNelsonSiegelSvenssonCurve(0., 0., 1., 0., tau1, tau2) factor3loading = curve3.zero(times) curve4 = FinNelsonSiegelSvenssonCurve(0., 0., 0., 1., tau1, tau2) factor4loading = curve4.zero(times) testCases.header("FACTOR LOADING ON ZERO RATES") testCases.print(factor1loading) testCases.print(factor2loading) testCases.print(factor3loading) testCases.print(factor4loading) # plt.figure(figsize = (6,4)) # plt.plot(times,scaleVector(factor1loading,1),label='beta1'); # plt.plot(times,scaleVector(factor2loading,1),label='beta2'); # plt.plot(times,scaleVector(factor3loading,1),label='beta3'); # plt.ylim((0,1.05)) # # plt.title('Factor Loadings in Nelson-Siegel Model'); # plt.xlabel('Time (years)'); # plt.ylabel('Loading'); # plt.legend(loc='best') ########################################################################## testCases.header("BETA1", "BETA2", "BETA3", "BETA4", "ZEROS") beta1 = 0.03 beta2 = -0.02 beta3 = -0.02 beta4 = 0.08 curve1 = FinNelsonSiegelSvenssonCurve(beta1, beta2, beta3, beta4, tau1, tau2) zeroRates1 = curve1.zero(times) testCases.print(beta1, beta2, beta3, beta4, zeroRates1) beta1 = 0.04 beta2 = -0.02 beta3 = -0.02 beta4 = 0.08 curve2 = FinNelsonSiegelSvenssonCurve(beta1, beta2, beta3, beta4, tau1, tau2) zeroRates2 = curve2.zero(times) testCases.print(beta1, beta2, beta3, beta4, zeroRates2) beta1 = 0.05 beta2 = -0.02 beta3 = -0.02 beta4 = 0.08 curve3 = FinNelsonSiegelSvenssonCurve(beta1, beta2, beta3, beta4, tau1, tau2) zeroRates3 = curve3.zero(times) testCases.print(beta1, beta2, beta3, beta4, zeroRates3) beta1 = 0.06 beta2 = -0.02 beta3 = -0.02 beta4 = 0.08 curve4 = FinNelsonSiegelSvenssonCurve(beta1, beta2, beta3, beta4, tau1, tau2) zeroRates4 = curve4.zero(times) testCases.print(beta1, beta2, beta3, beta4, zeroRates4) beta1 = 0.07 beta2 = -0.02 beta3 = -0.02 beta4 = 0.08 curve5 = FinNelsonSiegelSvenssonCurve(beta1, beta2, beta3, beta4, tau1, tau2) zeroRates5 = curve5.zero(times) testCases.print(beta1, beta2, beta3, beta4, zeroRates5) if 1 == 0: plt.figure(figsize=(6, 4)) plt.plot(times, scale(zeroRates1, 100), label='beta1=3%') plt.plot(times, scale(zeroRates2, 100), label='beta1=4%') plt.plot(times, scale(zeroRates3, 100), label='beta1=5%') plt.plot(times, scale(zeroRates4, 100), label='beta1=6%') plt.plot(times, scale(zeroRates5, 100), label='beta1=7%') plt.ylim((0, 7.5)) plt.title('Nelson-Siegel Zero Rate Curves') plt.xlabel('Time (years)') plt.ylabel('Zero Rate (%)') plt.legend(loc='lower right', frameon=False)
def test_FinNelsonSiegelCurve(): tau = 2.0 times = np.linspace(0.0, 10.0, 5) curveDate = FinDate(2019, 6, 6) dates = curveDate.addYears(times) curve1 = FinDiscountCurveNS(curveDate, 1, 0, 0, tau) factor1loading = curve1.zeroRate(dates) curve2 = FinDiscountCurveNS(curveDate, 0, 1, 0, tau) factor2loading = curve2.zeroRate(dates) curve3 = FinDiscountCurveNS(curveDate, 0, 0, 1, tau) factor3loading = curve3.zeroRate(dates) testCases.header("FACTOR LOADING ON ZERO RATES") testCases.print(factor1loading) testCases.print(factor2loading) testCases.print(factor3loading) if PLOT_GRAPHS: plt.figure(figsize=(6, 4)) plt.plot(times, scale(factor1loading, 1), label='beta1') plt.plot(times, scale(factor2loading, 1), label='beta2') plt.plot(times, scale(factor3loading, 1), label='beta3') plt.ylim((0, 1.05)) plt.title('Factor Loadings in Nelson-Siegel Model') plt.xlabel('Time (years)') plt.ylabel('Loading') plt.legend(loc='best') ########################################################################### testCases.header("BETA1", "BETA2", "BETA3", "ZEROS") beta1 = 0.03 beta2 = -0.02 beta3 = 0.02 curve1 = FinDiscountCurveNS(curveDate, beta1, beta2, beta3, tau) zeroRates1 = curve1.zeroRate(dates) testCases.print(beta1, beta2, beta3, zeroRates1) beta1 = 0.04 beta2 = -0.02 beta3 = 0.02 curve2 = FinDiscountCurveNS(curveDate, beta1, beta2, beta3, tau) zeroRates2 = curve2.zeroRate(dates) testCases.print(beta1, beta2, beta3, zeroRates2) beta1 = 0.05 beta2 = -0.02 beta3 = 0.02 curve3 = FinDiscountCurveNS(curveDate, beta1, beta2, beta3, tau) zeroRates3 = curve3.zeroRate(dates) testCases.print(beta1, beta2, beta3, zeroRates3) beta1 = 0.06 beta2 = -0.02 beta3 = 0.02 curve4 = FinDiscountCurveNS(curveDate, beta1, beta2, beta3, tau) zeroRates4 = curve4.zeroRate(dates) testCases.print(beta1, beta2, beta3, zeroRates4) beta1 = 0.07 beta2 = -0.02 beta3 = 0.02 curve5 = FinDiscountCurveNS(curveDate, beta1, beta2, beta3, tau) zeroRates5 = curve5.zeroRate(dates) testCases.print(beta1, beta2, beta3, zeroRates5) if PLOT_GRAPHS: plt.figure(figsize=(6, 4)) plt.plot(times, scale(zeroRates1, 100), label='beta1=3%') plt.plot(times, scale(zeroRates2, 100), label='beta1=4%') plt.plot(times, scale(zeroRates3, 100), label='beta1=5%') plt.plot(times, scale(zeroRates4, 100), label='beta1=6%') plt.plot(times, scale(zeroRates5, 100), label='beta1=7%') plt.ylim((0, 7.5)) plt.title('Nelson-Siegel Zero Rate Curves') plt.xlabel('Time (years)') plt.ylabel('Zero Rate (%)') plt.legend(loc='lower right', frameon=False) ########################################################################### beta1 = 0.06 beta2 = -0.04 beta3 = 0.02 curve1 = FinDiscountCurveNS(curveDate, beta1, beta2, beta3, tau) zeroRates1 = curve1.zeroRate(dates) testCases.print(beta1, beta2, beta3, zeroRates1) beta1 = 0.06 beta2 = -0.02 beta3 = 0.02 curve2 = FinDiscountCurveNS(curveDate, beta1, beta2, beta3, tau) zeroRates2 = curve2.zeroRate(dates) testCases.print(beta1, beta2, beta3, zeroRates2) beta1 = 0.06 beta2 = 0.00 beta3 = 0.02 curve3 = FinDiscountCurveNS(curveDate, beta1, beta2, beta3, tau) zeroRates3 = curve3.zeroRate(dates) testCases.print(beta1, beta2, beta3, zeroRates3) beta1 = 0.06 beta2 = 0.02 beta3 = 0.02 curve4 = FinDiscountCurveNS(curveDate, beta1, beta2, beta3, tau) zeroRates4 = curve4.zeroRate(dates) testCases.print(beta1, beta2, beta3, zeroRates4) beta1 = 0.06 beta2 = 0.04 beta3 = 0.02 curve5 = FinDiscountCurveNS(curveDate, beta1, beta2, beta3, tau) zeroRates5 = curve5.zeroRate(dates) testCases.print(beta1, beta2, beta3, zeroRates5) if PLOT_GRAPHS: plt.figure(figsize=(6, 4)) plt.plot(times, scale(zeroRates1, 100), label='beta2=-4%') plt.plot(times, scale(zeroRates2, 100), label='beta2=-2%') plt.plot(times, scale(zeroRates3, 100), label='beta2=0%') plt.plot(times, scale(zeroRates4, 100), label='beta2=2%') plt.plot(times, scale(zeroRates5, 100), label='beta2=4%') plt.ylim((0, 10)) plt.title('Nelson-Siegel Zero Rate Curves: Varying beta2') plt.xlabel('Time (years)') plt.ylabel('Zero Rate (%)') plt.legend(loc='lower right', frameon=False) beta1 = 0.06 beta2 = -0.02 beta3 = -0.02 curve1 = FinDiscountCurveNS(curveDate, beta1, beta2, beta3, tau) zeroRates1 = curve1.zeroRate(dates) testCases.print(beta1, beta2, beta3, zeroRates1) beta1 = 0.06 beta2 = -0.02 beta3 = 0.00 curve2 = FinDiscountCurveNS(curveDate, beta1, beta2, beta3, tau) zeroRates2 = curve2.zeroRate(dates) testCases.print(beta1, beta2, beta3, zeroRates2) beta1 = 0.06 beta2 = -0.02 beta3 = 0.02 curve3 = FinDiscountCurveNS(curveDate, beta1, beta2, beta3, tau) zeroRates3 = curve3.zeroRate(dates) testCases.print(beta1, beta2, beta3, zeroRates3) beta1 = 0.06 beta2 = -0.02 beta3 = 0.04 curve4 = FinDiscountCurveNS(curveDate, beta1, beta2, beta3, tau) zeroRates4 = curve4.zeroRate(dates) testCases.print(beta1, beta2, beta3, zeroRates4) beta1 = 0.06 beta2 = -0.02 beta3 = 0.06 curve5 = FinDiscountCurveNS(curveDate, beta1, beta2, beta3, tau) zeroRates5 = curve5.zeroRate(dates) testCases.print(beta1, beta2, beta3, zeroRates5) if PLOT_GRAPHS: plt.figure(figsize=(6, 4)) plt.plot(times, scale(zeroRates1, 100), label='beta3=-2%') plt.plot(times, scale(zeroRates2, 100), label='beta3=0%') plt.plot(times, scale(zeroRates3, 100), label='beta3=2%') plt.plot(times, scale(zeroRates4, 100), label='beta3=4%') plt.plot(times, scale(zeroRates5, 100), label='beta3=6%') plt.ylim((3.5, 7.5)) plt.title('Nelson-Siegel Zero Rate Curves: Varying beta3') plt.xlabel('Time (years)') plt.ylabel('Zero Rate (%)') plt.legend(loc='lower right', frameon=False)