def test_FinDiscountCurves(): # Create a curve from times and discount factors valuationDate = FinDate(1, 1, 2018) years = [1.0, 2.0, 3.0, 4.0, 5.0] dates = valuationDate.addYears(years) years2 = [] for dt in dates: y = (dt - valuationDate) / gDaysInYear years2.append(y) rates = np.array([0.05, 0.06, 0.065, 0.07, 0.075]) discountFactors = np.exp(-np.array(rates) * np.array(years2)) curvesList = [] finDiscountCurve = FinDiscountCurve(valuationDate, dates, discountFactors, FinInterpTypes.FLAT_FORWARDS) curvesList.append(finDiscountCurve) finDiscountCurveFlat = FinDiscountCurveFlat(valuationDate, 0.05) curvesList.append(finDiscountCurveFlat) finDiscountCurveNS = FinDiscountCurveNS(valuationDate, 0.0305, -0.01, 0.08, 10.0) curvesList.append(finDiscountCurveNS) finDiscountCurveNSS = FinDiscountCurveNSS(valuationDate, 0.035, -0.02, 0.09, 0.1, 1.0, 2.0) curvesList.append(finDiscountCurveNSS) finDiscountCurvePoly = FinDiscountCurvePoly(valuationDate, [0.05, 0.002, -0.00005]) curvesList.append(finDiscountCurvePoly) finDiscountCurvePWF = FinDiscountCurvePWF(valuationDate, dates, rates) curvesList.append(finDiscountCurvePWF) finDiscountCurvePWL = FinDiscountCurvePWL(valuationDate, dates, rates) curvesList.append(finDiscountCurvePWL) finDiscountCurveZeros = FinDiscountCurveZeros(valuationDate, dates, rates) curvesList.append(finDiscountCurveZeros) curveNames = [] for curve in curvesList: curveNames.append(type(curve).__name__) testCases.banner("SINGLE CALLS NO VECTORS") testCases.header("CURVE", "DATE", "ZERO", "DF", "CCFWD", "MMFWD", "SWAP") years = np.linspace(1, 10, 10) fwdMaturityDates = valuationDate.addYears(years) testCases.banner("######################################################") testCases.banner("SINGLE CALLS") testCases.banner("######################################################") for name, curve in zip(curveNames, curvesList): for fwdMaturityDate in fwdMaturityDates: tenor = "3M" zeroRate = curve.zeroRate(fwdMaturityDate) fwd = curve.fwd(fwdMaturityDate) fwdRate = curve.fwdRate(fwdMaturityDate, tenor) swapRate = curve.swapRate(valuationDate, fwdMaturityDate) df = curve.df(fwdMaturityDate) testCases.print("%-20s" % name, "%-12s" % fwdMaturityDate, "%7.6f" % (zeroRate), "%8.7f" % (df), "%7.6f" % (fwd), "%7.6f" % (fwdRate), "%7.6f" % (swapRate)) # Examine vectorisation testCases.banner("######################################################") testCases.banner("VECTORISATIONS") testCases.banner("######################################################") for name, curve in zip(curveNames, curvesList): tenor = "3M" zeroRate = curve.zeroRate(fwdMaturityDates) fwd = curve.fwd(fwdMaturityDates) fwdRate = curve.fwdRate(fwdMaturityDates, tenor) swapRate = curve.swapRate(valuationDate, fwdMaturityDates) df = curve.df(fwdMaturityDates) for i in range(0, len(fwdMaturityDates)): testCases.print("%-20s" % name, "%-12s" % fwdMaturityDate, "%7.6f" % (zeroRate[i]), "%8.7f" % (df[i]), "%7.6f" % (fwd[i]), "%7.6f" % (fwdRate[i]), "%7.6f" % (swapRate[i])) if PLOT_GRAPHS: years = np.linspace(0, 10, 121) years2 = years + 1.0 fwdDates = valuationDate.addYears(years) fwdDates2 = valuationDate.addYears(years2) plt.figure() for name, curve in zip(curveNames, curvesList): zeroRates = curve.zeroRate(fwdDates) plt.plot(years, zeroRates, label=name) plt.legend() plt.title("Zero Rates") plt.figure() for name, curve in zip(curveNames, curvesList): fwdRates = curve.fwd(fwdDates) plt.plot(years, fwdRates, label=name) plt.legend() plt.title("CC Fwd Rates") plt.figure() for name, curve in zip(curveNames, curvesList): fwdRates = curve.fwdRate(fwdDates, fwdDates2) plt.plot(years, fwdRates, label=name) plt.legend() plt.title("CC Fwd Rates") plt.figure() for name, curve in zip(curveNames, curvesList): dfs = curve.df(fwdDates) plt.plot(years, dfs, label=name) plt.legend() plt.title("Discount Factors")
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)