def test_FinLiborCapletHull(): # Hull Page 703, example 29.3 todayDate = FinDate(20, 6, 2019) valuationDate = todayDate maturityDate = valuationDate.addTenor("2Y") liborCurve = FinDiscountCurveFlat(valuationDate, 0.070, FinFrequencyTypes.QUARTERLY, FinDayCountTypes.THIRTY_E_360) k = 0.08 capFloorType = FinLiborCapFloorTypes.CAP capFloor = FinLiborCapFloor(valuationDate, maturityDate, capFloorType, k, None, FinFrequencyTypes.QUARTERLY, FinDayCountTypes.THIRTY_E_360) # Value cap using a single flat cap volatility model = FinModelBlack(0.20) capFloor.value(valuationDate, liborCurve, model) # Value cap by breaking it down into caplets using caplet vols capletStartDate = valuationDate.addTenor("1Y") capletEndDate = capletStartDate.addTenor("3M") vCaplet = capFloor.valueCapletFloorLet(valuationDate, capletStartDate, capletEndDate, liborCurve, model) # Cannot match Hull due to dates being adjusted testCases.header("CORRECT PRICE", "MODEL PRICE") testCases.print(517.29, vCaplet)
def test_FinLiborCapFloorQLExample(): valuationDate = FinDate(14, 6, 2016) dates = [ FinDate(14, 6, 2016), FinDate(14, 9, 2016), FinDate(14, 12, 2016), FinDate(14, 6, 2017), FinDate(14, 6, 2019), FinDate(14, 6, 2021), FinDate(15, 6, 2026), FinDate(16, 6, 2031), FinDate(16, 6, 2036), FinDate(14, 6, 2046) ] rates = [ 0.000000, 0.006616, 0.007049, 0.007795, 0.009599, 0.011203, 0.015068, 0.017583, 0.018998, 0.020080 ] frequencyType = FinFrequencyTypes.ANNUAL dayCountType = FinDayCountTypes.ACT_ACT_ISDA discountCurve = FinDiscountCurveZeros(valuationDate, dates, rates, frequencyType, dayCountType, FinInterpTypes.LINEAR_ZERO_RATES) startDate = FinDate(14, 6, 2016) endDate = FinDate(14, 6, 2026) calendarType = FinCalendarTypes.US busDayAdjustType = FinBusDayAdjustTypes.MODIFIED_FOLLOWING frequencyType = FinFrequencyTypes.QUARTERLY dateGenRuleType = FinDateGenRuleTypes.FORWARD lastFixing = 0.0065560 notional = 1000000 dayCountType = FinDayCountTypes.ACT_360 optionType = FinLiborCapFloorTypes.CAP strikeRate = 0.02 cap = FinLiborCapFloor(startDate, endDate, optionType, strikeRate, lastFixing, frequencyType, dayCountType, notional, calendarType, busDayAdjustType, dateGenRuleType) blackVol = 0.547295 model = FinModelBlack(blackVol) start = time.time() numRepeats = 10 for i in range(0, numRepeats): v = cap.value(valuationDate, discountCurve, model) end = time.time() period = end - start print(v, period / numRepeats)
def test_FinLiborCapFloor(): todayDate = FinDate(20, 6, 2019) valuationDate = todayDate startDate = todayDate.addWeekDays(2) maturityDate = startDate.addTenor("1Y") liborCurve = test_FinLiborDepositsAndSwaps(todayDate) # The capfloor has begun # lastFixing = 0.028 ########################################################################## # COMPARISON OF MODELS ########################################################################## strikes = np.linspace(0.02, 0.08, 10) testCases.header("LABEL", "STRIKE", "BLK", "BLK_SHFTD", "SABR", "SABR_SHFTD", "HW", "BACH") model1 = FinModelBlack(0.20) model2 = FinModelBlackShifted(0.25, 0.0) model3 = FinModelSABR(0.013, 0.5, 0.5, 0.5) model4 = FinModelSABRShifted(0.013, 0.5, 0.5, 0.5, -0.008) model5 = FinModelRatesHW(0.30, 0.01) model6 = FinModelBachelier(0.01) for k in strikes: capFloorType = FinLiborCapFloorTypes.CAP capfloor = FinLiborCapFloor(startDate, maturityDate, capFloorType, k) cvalue1 = capfloor.value(valuationDate, liborCurve, model1) cvalue2 = capfloor.value(valuationDate, liborCurve, model2) cvalue3 = capfloor.value(valuationDate, liborCurve, model3) cvalue4 = capfloor.value(valuationDate, liborCurve, model4) cvalue5 = capfloor.value(valuationDate, liborCurve, model5) cvalue6 = capfloor.value(valuationDate, liborCurve, model6) testCases.print("CAP", k, cvalue1, cvalue2, cvalue3, cvalue4, cvalue5, cvalue6) testCases.header("LABEL", "STRIKE", "BLK", "BLK_SHFTD", "SABR", "SABR_SHFTD", "HW", "BACH") for k in strikes: capFloorType = FinLiborCapFloorTypes.FLOOR capfloor = FinLiborCapFloor(startDate, maturityDate, capFloorType, k) fvalue1 = capfloor.value(valuationDate, liborCurve, model1) fvalue2 = capfloor.value(valuationDate, liborCurve, model2) fvalue3 = capfloor.value(valuationDate, liborCurve, model3) fvalue4 = capfloor.value(valuationDate, liborCurve, model4) fvalue5 = capfloor.value(valuationDate, liborCurve, model5) fvalue6 = capfloor.value(valuationDate, liborCurve, model6) testCases.print("FLR", k, fvalue1, fvalue2, fvalue3, fvalue4, fvalue5, fvalue6) ############################################################################### # PUT CALL CHECK ############################################################################### testCases.header("LABEL", "STRIKE", "BLK", "BLK_SHFTD", "SABR", "SABR SHFTD", "HW", "BACH") for k in strikes: capFloorType = FinLiborCapFloorTypes.CAP capfloor = FinLiborCapFloor(startDate, maturityDate, capFloorType, k) cvalue1 = capfloor.value(valuationDate, liborCurve, model1) cvalue2 = capfloor.value(valuationDate, liborCurve, model2) cvalue3 = capfloor.value(valuationDate, liborCurve, model3) cvalue4 = capfloor.value(valuationDate, liborCurve, model4) cvalue5 = capfloor.value(valuationDate, liborCurve, model5) cvalue6 = capfloor.value(valuationDate, liborCurve, model6) capFloorType = FinLiborCapFloorTypes.FLOOR capfloor = FinLiborCapFloor(startDate, maturityDate, capFloorType, k) fvalue1 = capfloor.value(valuationDate, liborCurve, model1) fvalue2 = capfloor.value(valuationDate, liborCurve, model2) fvalue3 = capfloor.value(valuationDate, liborCurve, model3) fvalue4 = capfloor.value(valuationDate, liborCurve, model4) fvalue5 = capfloor.value(valuationDate, liborCurve, model5) fvalue6 = capfloor.value(valuationDate, liborCurve, model6) pcvalue1 = cvalue1 - fvalue1 pcvalue2 = cvalue2 - fvalue2 pcvalue3 = cvalue3 - fvalue3 pcvalue4 = cvalue4 - fvalue4 pcvalue5 = cvalue5 - fvalue5 pcvalue6 = cvalue6 - fvalue6 testCases.print("PUT_CALL", k, pcvalue1, pcvalue2, pcvalue3, pcvalue4, pcvalue5, pcvalue6)
def test_FinLiborCapFloorVolCurve(): ''' Aim here is to price cap and caplets using cap and caplet vols and to demonstrate they are the same - NOT SURE THAT HULLS BOOKS FORMULA WORKS FOR OPTIONS. ''' todayDate = FinDate(20, 6, 2019) valuationDate = todayDate maturityDate = valuationDate.addTenor("3Y") dayCountType = FinDayCountTypes.THIRTY_E_360 frequency = FinFrequencyTypes.ANNUAL k = 0.04 capFloorType = FinLiborCapFloorTypes.CAP capFloor = FinLiborCapFloor(valuationDate, maturityDate, capFloorType, k, None, frequency, dayCountType) capVolDates = FinSchedule(valuationDate, valuationDate.addTenor("10Y"), frequency)._generate() flatRate = 0.04 liborCurve = FinDiscountCurveFlat(valuationDate, flatRate, frequency, dayCountType) flat = False if flat is True: capVolatilities = [20.0] * 11 capVolatilities[0] = 0.0 else: capVolatilities = [ 0.00, 15.50, 18.25, 17.91, 17.74, 17.27, 16.79, 16.30, 16.01, 15.76, 15.54 ] capVolatilities = np.array(capVolatilities) / 100.0 capVolatilities[0] = 0.0 volCurve = FinLiborCapVolCurve(valuationDate, capVolDates, capVolatilities, dayCountType) print(volCurve._capletGammas) # Value cap using a single flat cap volatility tcap = (maturityDate - valuationDate) / gDaysInYear vol = volCurve.capVol(maturityDate) model = FinModelBlack(vol) valueCap = capFloor.value(valuationDate, liborCurve, model) print("CAP T", tcap, "VOL:", vol, "VALUE OF CAP:", valueCap) # Value cap by breaking it down into caplets using caplet vols vCaplets = 0.0 capletStartDate = capFloor._capFloorLetDates[1] testCases.header("START", "END", "VOL", "VALUE") for capletEndDate in capFloor._capFloorLetDates[2:]: vol = volCurve.capletVol(capletEndDate) modelCaplet = FinModelBlack(vol) vCaplet = capFloor.valueCapletFloorLet(valuationDate, capletStartDate, capletEndDate, liborCurve, modelCaplet) vCaplets += vCaplet testCases.print("%12s" % capletStartDate, "%s" % capletEndDate, "%9.5f" % (vol * 100.0), "%9.5f" % vCaplet) capletStartDate = capletEndDate testCases.header("LABEL", "VALUE") testCases.print("CAPLETS->CAP: ", vCaplets)
def test_FinLiborCapFloor(): import time todayDate = FinDate(2019, 6, 20) # Need to check this how it aligns with curve startDate = FinDate(2019, 6, 24) valuationDate = startDate maturityDate = startDate.addMonths(60) strikeRate = 0.050 liborCurve = test_FinLiborDepositsAndSwaps(todayDate) # The capfloor has begun #lastFixing = 0.028 ########################################################################## ############################ BLACK ###################################### ########################################################################## start = time.time() testCases.header("LABEL", "VALUE") testCases.banner("==================== BLACK =======================") model = FinLiborModelBlack(0.25) capFloorType = FinLiborCapFloorType.CAP capfloor = FinLiborCapFloor(startDate, maturityDate, capFloorType, strikeRate) value = capfloor.value(valuationDate, liborCurve, model) # capfloor.print() testCases.print("CAP Value:", value) capFloorType = FinLiborCapFloorType.FLOOR capfloor = FinLiborCapFloor(startDate, maturityDate, capFloorType, strikeRate) value = capfloor.value(valuationDate, liborCurve, model) # capfloor.print() testCases.print("FLOOR Value:", value) end = time.time() testCases.header("TIME") testCases.print(end - start) ########################################################################## ####################### SHIFTED BLACK ################################## ########################################################################## testCases.banner("============== SHIFTED BLACK ==================") testCases.header("LABEL", "VALUE") start = time.time() model = FinLiborModelShiftedBlack(0.25, -0.01) capFloorType = FinLiborCapFloorType.CAP capfloor = FinLiborCapFloor(startDate, maturityDate, capFloorType, strikeRate) value = capfloor.value(valuationDate, liborCurve, model) # capfloor.print() testCases.print("CAP Value:", value) capFloorType = FinLiborCapFloorType.FLOOR capfloor = FinLiborCapFloor(startDate, maturityDate, capFloorType, strikeRate) value = capfloor.value(valuationDate, liborCurve, model) # capfloor.print() testCases.print("FLOOR Value:", value) end = time.time() testCases.header("TIME") testCases.print(end - start) ########################################################################## ################################ SABR ################################### ########################################################################## testCases.header("LABEL", "VALUE") start = time.time() testCases.banner("============== SABR ==================") model = FinLiborModelSABR(0.28, 1.0, -0.09, 0.21) capFloorType = FinLiborCapFloorType.CAP capfloor = FinLiborCapFloor(startDate, maturityDate, capFloorType, strikeRate) value = capfloor.value(valuationDate, liborCurve, model) # capfloor.print() testCases.print("CAP Value:", value) capFloorType = FinLiborCapFloorType.FLOOR capfloor = FinLiborCapFloor(startDate, maturityDate, capFloorType, strikeRate) value = capfloor.value(valuationDate, liborCurve, model) # capfloor.print() testCases.print("FLOOR Value:", value) end = time.time() testCases.header("TIME") testCases.print(end - start)