def test_FinFXVanillaOptionBloombergExample(): # Example Bloomberg Pricing at # https://stackoverflow.com/questions/48778712/fx-vanilla-call-price-in-quantlib-doesnt-match-bloomberg valueDate = FinDate(13, 2, 2018) expiryDate = FinDate(15, 2, 2019) # In BS the FX rate is the price in domestic of one unit of foreign # In case of EURUSD = 1.3 the domestic currency is USD and foreign is EUR # DOM = USD , FOR = EUR forName = "EUR" domName = "USD" forDepoRate = 0.05 # EUR domDepoRate = 0.02 # USD currencyPair = forName + domName # Always FORDOM spotFXRate = 1.30 strikeFXRate = 1.3650 volatility = 0.20 spotDays = 0 settlementDate = valueDate.addWorkDays(spotDays) maturityDate = settlementDate.addMonths(12) notional = 1000000.0 notionalCurrency = "EUR" calendarType = FinCalendarTypes.TARGET depos = [] fras = [] swaps = [] depo = FinLiborDeposit(settlementDate, maturityDate, domDepoRate, FinDayCountTypes.ACT_360, notional, calendarType) depos.append(depo) domDiscountCurve = FinLiborCurve(forName, settlementDate, depos, fras, swaps) depos = [] fras = [] swaps = [] depo = FinLiborDeposit(settlementDate, maturityDate, forDepoRate, FinDayCountTypes.ACT_360, notional, calendarType) depos.append(depo) forDiscountCurve = FinLiborCurve(domName, settlementDate, depos, fras, swaps) model = FinFXModelBlackScholes(volatility) callOption = FinFXVanillaOption(expiryDate, strikeFXRate, currencyPair, FinOptionTypes.EUROPEAN_CALL, notional, notionalCurrency, 2) value = callOption.value(valueDate, spotFXRate, domDiscountCurve, forDiscountCurve, model) delta = callOption.delta(valueDate, spotFXRate, domDiscountCurve, forDiscountCurve, model) testCases.header("value", "delta") testCases.print(value, delta)
def test_FinLiborDepositsOnly(): # I have used the following useful blog post by Ioannis Rigopoulos for this # https://blog.deriscope.com/index.php/en/yield-curve-excel-quantlib-deposit valuationDate = FinDate(2018, 2, 23) spotDays = 0 settlementDate = valuationDate.addWorkDays(spotDays) depoDCCType = FinDayCountTypes.ACT_360 notional = 100.0 calendarType = FinCalendarTypes.TARGET depos = [] # 1 month depositRate = 0.04 maturityDate = settlementDate.addMonths(1) depo = FinLiborDeposit(settlementDate, maturityDate, depositRate, depoDCCType, notional, calendarType) depos.append(depo) # 2 months depositRate = 0.04 maturityDate = settlementDate.addMonths(2) depo = FinLiborDeposit(settlementDate, maturityDate, depositRate, depoDCCType, notional, calendarType) depos.append(depo) # 6 months depositRate = 0.04 maturityDate = settlementDate.addMonths(6) depo = FinLiborDeposit(settlementDate, maturityDate, depositRate, depoDCCType, notional, calendarType) depos.append(depo) # 1 year depositRate = 0.04 maturityDate = settlementDate.addMonths(12) depo = FinLiborDeposit(settlementDate, maturityDate, depositRate, depoDCCType, notional, calendarType) depos.append(depo) fras = [] swaps = [] liborCurve = FinLiborCurve("USD_LIBOR", settlementDate, depos, fras, swaps) testCases.header("LABEL", "DATE", "VALUE") ''' Check calibration ''' for depo in depos: v = depo.value(settlementDate, liborCurve) testCases.print("DEPO", depo._maturityDate, v)
def test_FinCDSCurve(): curveDate = FinDate(2018, 12, 20) swaps = [] depos = [] fras = [] fixedDCC = FinDayCountTypes.ACT_365_ISDA fixedFreq = FinFrequencyTypes.SEMI_ANNUAL fixedCoupon = 0.05 for i in range(1, 11): maturityDate = curveDate.addMonths(12 * i) swap = FinLiborSwap( curveDate, maturityDate, fixedCoupon, fixedFreq, fixedDCC) swaps.append(swap) libor_curve = FinLiborCurve("USD_LIBOR", curveDate, depos, fras, swaps) cdsContracts = [] for i in range(1, 11): maturityDate = curveDate.addMonths(12 * i) cds = FinCDS(curveDate, maturityDate, 0.005 + 0.001 * (i - 1)) cdsContracts.append(cds) issuerCurve = FinCDSCurve(curveDate, cdsContracts, libor_curve, recoveryRate=0.40, useCache=False) testCases.header("T", "Q") n = len(issuerCurve._times) for i in range(0, n): testCases.print(issuerCurve._times[i], issuerCurve._values[i]) testCases.header("CONTRACT", "VALUE") for i in range(1, 11): maturityDate = curveDate.addMonths(12 * i) cds = FinCDS(curveDate, maturityDate, 0.005 + 0.001 * (i - 1)) v = cds.value(curveDate, issuerCurve) testCases.print(i, v)
def buildLiborCurve(tradeDate): valuationDate = tradeDate.addDays(1) dcType = FinDayCountTypes.ACT_360 depos = [] depos = [] fras = [] swaps = [] dcType = FinDayCountTypes.THIRTY_E_360_ISDA fixedFreq = FinFrequencyTypes.SEMI_ANNUAL settlementDate = valuationDate maturityDate = settlementDate.addMonths(12) swap1 = FinLiborSwap(settlementDate, maturityDate, 0.0502, fixedFreq, dcType) swaps.append(swap1) maturityDate = settlementDate.addMonths(24) swap2 = FinLiborSwap(settlementDate, maturityDate, 0.0502, fixedFreq, dcType) swaps.append(swap2) maturityDate = settlementDate.addMonths(36) swap3 = FinLiborSwap(settlementDate, maturityDate, 0.0501, fixedFreq, dcType) swaps.append(swap3) maturityDate = settlementDate.addMonths(48) swap4 = FinLiborSwap(settlementDate, maturityDate, 0.0502, fixedFreq, dcType) swaps.append(swap4) maturityDate = settlementDate.addMonths(60) swap5 = FinLiborSwap(settlementDate, maturityDate, 0.0501, fixedFreq, dcType) swaps.append(swap5) liborCurve = FinLiborCurve("USD_LIBOR", settlementDate, depos, fras, swaps) return liborCurve
def test_FinLiborFRAsOnly(): # TO DO FIX THIS valuationDate = FinDate(2018, 2, 23) spotDays = 0 settlementDate = valuationDate.addWorkDays(spotDays) depoDCCType = FinDayCountTypes.ACT_360 notional = 100.0 payFixed = True calendarType = FinCalendarTypes.TARGET fras = [] # 1 x 4 FRA fraRate = 0.04 fraSettlementDate = settlementDate.addMonths(1) fraMaturityDate = settlementDate.addMonths(4) fra = FinLiborFRA(fraSettlementDate, fraMaturityDate, fraRate, payFixed, depoDCCType, notional, calendarType) fras.append(fra) # 4 x 7 FRA fraRate = 0.04 fraSettlementDate = settlementDate.addMonths(4) fraMaturityDate = settlementDate.addMonths(7) fra = FinLiborFRA(fraSettlementDate, fraMaturityDate, fraRate, payFixed, depoDCCType, notional, calendarType) fras.append(fra) depos = [] swaps = [] liborCurve = FinLiborCurve("USD_LIBOR", settlementDate, depos, fras, swaps) testCases.header("DATE", "MATDATE", "VALUE") ''' Check calibration ''' for fra in fras: v = fra.value(settlementDate, liborCurve) testCases.print("FRA:", fra._maturityDate, v)
def buildLiborCurve(valuationDate): settlementDate = valuationDate.addDays(2) dcType = FinDayCountTypes.ACT_360 depos = [] fras = [] swaps = [] maturityDate = settlementDate.addMonths(6) depo1 = FinLiborDeposit(settlementDate, maturityDate, -0.00251, dcType) depos.append(depo1) # Series of 1M futures startDate = settlementDate.nextIMMDate() endDate = startDate.addMonths(1) fra = FinLiborFRA(startDate, endDate, -0.0023, True, dcType) fras.append(fra) startDate = startDate.addMonths(1) endDate = startDate.addMonths(1) fra = FinLiborFRA(startDate, endDate, -0.00234, True, dcType) fras.append(fra) startDate = startDate.addMonths(1) endDate = startDate.addMonths(1) fra = FinLiborFRA(startDate, endDate, -0.00225, True, dcType) fras.append(fra) startDate = startDate.addMonths(1) endDate = startDate.addMonths(1) fra = FinLiborFRA(startDate, endDate, -0.00226, True, dcType) fras.append(fra) startDate = startDate.addMonths(1) endDate = startDate.addMonths(1) fra = FinLiborFRA(startDate, endDate, -0.00219, True, dcType) fras.append(fra) startDate = startDate.addMonths(1) endDate = startDate.addMonths(1) fra = FinLiborFRA(startDate, endDate, -0.00213, True, dcType) fras.append(fra) startDate = startDate.addMonths(1) endDate = startDate.addMonths(1) fra = FinLiborFRA(startDate, endDate, -0.00186, True, dcType) fras.append(fra) startDate = startDate.addMonths(1) endDate = startDate.addMonths(1) fra = FinLiborFRA(startDate, endDate, -0.00189, True, dcType) fras.append(fra) startDate = startDate.addMonths(1) endDate = startDate.addMonths(1) fra = FinLiborFRA(startDate, endDate, -0.00175, True, dcType) fras.append(fra) startDate = startDate.addMonths(1) endDate = startDate.addMonths(1) fra = FinLiborFRA(startDate, endDate, -0.00143, True, dcType) fras.append(fra) startDate = startDate.addMonths(1) endDate = startDate.addMonths(1) fra = FinLiborFRA(startDate, endDate, -0.00126, True, dcType) fras.append(fra) startDate = startDate.addMonths(1) endDate = startDate.addMonths(1) fra = FinLiborFRA(startDate, endDate, -0.00126, True, dcType) fras.append(fra) fixedFreq = FinFrequencyTypes.ANNUAL dcType = FinDayCountTypes.THIRTY_360 maturityDate = settlementDate.addMonths(24) swap1 = FinLiborSwap(settlementDate, maturityDate, -0.001506, fixedFreq, dcType) swaps.append(swap1) maturityDate = settlementDate.addMonths(36) swap2 = FinLiborSwap(settlementDate, maturityDate, -0.000185, fixedFreq, dcType) swaps.append(swap2) maturityDate = settlementDate.addMonths(48) swap3 = FinLiborSwap(settlementDate, maturityDate, 0.001358, fixedFreq, dcType) swaps.append(swap3) maturityDate = settlementDate.addMonths(60) swap4 = FinLiborSwap(settlementDate, maturityDate, 0.0027652, fixedFreq, dcType) swaps.append(swap4) maturityDate = settlementDate.addMonths(72) swap5 = FinLiborSwap(settlementDate, maturityDate, 0.0041539, fixedFreq, dcType) swaps.append(swap5) maturityDate = settlementDate.addMonths(84) swap6 = FinLiborSwap(settlementDate, maturityDate, 0.0054604, fixedFreq, dcType) swaps.append(swap6) maturityDate = settlementDate.addMonths(96) swap7 = FinLiborSwap(settlementDate, maturityDate, 0.006674, fixedFreq, dcType) swaps.append(swap7) maturityDate = settlementDate.addMonths(108) swap8 = FinLiborSwap(settlementDate, maturityDate, 0.007826, fixedFreq, dcType) swaps.append(swap8) maturityDate = settlementDate.addMonths(120) swap9 = FinLiborSwap(settlementDate, maturityDate, 0.008821, fixedFreq, dcType) swaps.append(swap9) maturityDate = settlementDate.addMonths(132) swap10 = FinLiborSwap(settlementDate, maturityDate, 0.0097379, fixedFreq, dcType) swaps.append(swap10) maturityDate = settlementDate.addMonths(144) swap11 = FinLiborSwap(settlementDate, maturityDate, 0.0105406, fixedFreq, dcType) swaps.append(swap11) maturityDate = settlementDate.addMonths(180) swap12 = FinLiborSwap(settlementDate, maturityDate, 0.0123927, fixedFreq, dcType) swaps.append(swap12) maturityDate = settlementDate.addMonths(240) swap13 = FinLiborSwap(settlementDate, maturityDate, 0.0139882, fixedFreq, dcType) swaps.append(swap13) maturityDate = settlementDate.addMonths(300) swap14 = FinLiborSwap(settlementDate, maturityDate, 0.0144972, fixedFreq, dcType) swaps.append(swap14) maturityDate = settlementDate.addMonths(360) swap15 = FinLiborSwap(settlementDate, maturityDate, 0.0146081, fixedFreq, dcType) swaps.append(swap15) maturityDate = settlementDate.addMonths(420) swap16 = FinLiborSwap(settlementDate, maturityDate, 0.01461897, fixedFreq, dcType) swaps.append(swap16) maturityDate = settlementDate.addMonths(480) swap17 = FinLiborSwap(settlementDate, maturityDate, 0.014567455, fixedFreq, dcType) swaps.append(swap17) maturityDate = settlementDate.addMonths(540) swap18 = FinLiborSwap(settlementDate, maturityDate, 0.0140826, fixedFreq, dcType) swaps.append(swap18) maturityDate = settlementDate.addMonths(600) swap19 = FinLiborSwap(settlementDate, maturityDate, 0.01436822, fixedFreq, dcType) swaps.append(swap19) liborCurve = FinLiborCurve("USD", settlementDate, depos, fras, swaps) testCases.header("LABEL", "DATE", "VALUE") ''' Check calibration ''' for depo in depos: v = depo.value(settlementDate, liborCurve) testCases.print("DEPO VALUE:", depo._maturityDate, v) for fra in fras: v = fra.value(settlementDate, liborCurve) testCases.print("FRA VALUE:", fra._maturityDate, v) for swap in swaps: v = swap.value(settlementDate, liborCurve, liborCurve, None) testCases.print("SWAP VALUE:", swap._maturityDate, v) return liborCurve
def buildLiborCurve(valuationDate): depoDCCType = FinDayCountTypes.THIRTY_E_360_ISDA depos = [] spotDays = 2 settlementDate = valuationDate.addWorkDays(spotDays) depositRate = 0.050 maturityDate = settlementDate.addMonths(1) depo1 = FinLiborDeposit( settlementDate, maturityDate, depositRate, depoDCCType) maturityDate = settlementDate.addMonths(3) depo2 = FinLiborDeposit( settlementDate, maturityDate, depositRate, depoDCCType) maturityDate = settlementDate.addMonths(6) depo3 = FinLiborDeposit( settlementDate, maturityDate, depositRate, depoDCCType) maturityDate = settlementDate.addMonths(9) depo4 = FinLiborDeposit( settlementDate, maturityDate, depositRate, depoDCCType) maturityDate = settlementDate.addMonths(12) depo5 = FinLiborDeposit( settlementDate, maturityDate, depositRate, depoDCCType) depos.append(depo1) depos.append(depo2) depos.append(depo3) depos.append(depo4) depos.append(depo5) fras = [] fixedDCCType = FinDayCountTypes.ACT_365_ISDA fixedFreqType = FinFrequencyTypes.SEMI_ANNUAL swaps = [] swapRate = 0.05 maturityDate = settlementDate.addMonths(24) swap1 = FinLiborSwap( settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap1) maturityDate = settlementDate.addMonths(36) swap2 = FinLiborSwap( settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap2) maturityDate = settlementDate.addMonths(48) swap3 = FinLiborSwap( settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap3) maturityDate = settlementDate.addMonths(60) swap4 = FinLiborSwap( settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap4) maturityDate = settlementDate.addMonths(72) swap5 = FinLiborSwap( settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap5) maturityDate = settlementDate.addMonths(84) swap6 = FinLiborSwap( settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap6) maturityDate = settlementDate.addMonths(96) swap7 = FinLiborSwap( settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap7) maturityDate = settlementDate.addMonths(108) swap8 = FinLiborSwap( settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap8) maturityDate = settlementDate.addMonths(120) swap9 = FinLiborSwap( settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap9) liborCurve = FinLiborCurve("USD_LIBOR", settlementDate, depos, fras, swaps) if 1 == 0: import numpy as np numSteps = 40 dt = 10 / numSteps times = np.linspace(0.0, 10.0, numSteps + 1) df0 = 1.0 for t in times[1:]: df1 = liborCurve.df(t) fwd = (df0 / df1 - 1.0) / dt print(t, df1, fwd) df0 = df1 return liborCurve
def test_FinLiborDepositsAndSwaps(valuationDate): depoBasis = FinDayCountTypes.THIRTY_E_360_ISDA depos = [] spotDays = 2 settlementDate = valuationDate.addWorkDays(spotDays) depositRate = 0.030 maturityDate = settlementDate.addMonths(1) depo1 = FinLiborDeposit(settlementDate, maturityDate, depositRate, depoBasis) maturityDate = settlementDate.addMonths(2) depo2 = FinLiborDeposit(settlementDate, maturityDate, depositRate, depoBasis) maturityDate = settlementDate.addMonths(3) depo3 = FinLiborDeposit(settlementDate, maturityDate, depositRate, depoBasis) maturityDate = settlementDate.addMonths(6) depo4 = FinLiborDeposit(settlementDate, maturityDate, depositRate, depoBasis) maturityDate = settlementDate.addMonths(9) depo5 = FinLiborDeposit(settlementDate, maturityDate, depositRate, depoBasis) depos.append(depo1) depos.append(depo2) depos.append(depo3) depos.append(depo4) depos.append(depo5) fras = [] swaps = [] fixedBasis = FinDayCountTypes.ACT_365_ISDA fixedFreq = FinFrequencyTypes.SEMI_ANNUAL swapRate = 0.03 maturityDate = settlementDate.addMonths(12) swap1 = FinLiborSwap(settlementDate, maturityDate, swapRate, fixedFreq, fixedBasis) swaps.append(swap1) swapRate = 0.034 maturityDate = settlementDate.addMonths(24) swap2 = FinLiborSwap(settlementDate, maturityDate, swapRate, fixedFreq, fixedBasis) swaps.append(swap2) swapRate = 0.037 maturityDate = settlementDate.addMonths(36) swap3 = FinLiborSwap(settlementDate, maturityDate, swapRate, fixedFreq, fixedBasis) swaps.append(swap3) swapRate = 0.039 maturityDate = settlementDate.addMonths(48) swap4 = FinLiborSwap(settlementDate, maturityDate, swapRate, fixedFreq, fixedBasis) swaps.append(swap4) swapRate = 0.040 maturityDate = settlementDate.addMonths(60) swap5 = FinLiborSwap(settlementDate, maturityDate, swapRate, fixedFreq, fixedBasis) swaps.append(swap5) liborCurve = FinLiborCurve("USD_LIBOR", settlementDate, depos, fras, swaps) return liborCurve
def buildFullIssuerCurve(mktSpreadBump, irBump): # https://www.markit.com/markit.jsp?jsppage=pv.jsp # YIELD CURVE 8-AUG-2019 SNAP AT 1600 tradeDate = FinDate(2019, 8, 9) valuationDate = tradeDate.addDays(1) dcType = FinDayCountTypes.ACT_360 depos = [] m = 1.0 # 0.00000000000 spotDays = 2 settlementDate = valuationDate.addDays(spotDays) maturityDate = settlementDate.addMonths(1) depo1 = FinLiborDeposit(settlementDate, maturityDate, m * 0.022009, dcType) maturityDate = settlementDate.addMonths(2) depo2 = FinLiborDeposit(settlementDate, maturityDate, m * 0.022138, dcType) maturityDate = settlementDate.addMonths(3) depo3 = FinLiborDeposit(settlementDate, maturityDate, m * 0.021810, dcType) maturityDate = settlementDate.addMonths(6) depo4 = FinLiborDeposit(settlementDate, maturityDate, m * 0.020503, dcType) maturityDate = settlementDate.addMonths(12) depo5 = FinLiborDeposit(settlementDate, maturityDate, m * 0.019930, dcType) depos.append(depo1) depos.append(depo2) depos.append(depo3) depos.append(depo4) depos.append(depo5) fras = [] swaps = [] dcType = FinDayCountTypes.THIRTY_E_360_ISDA fixedFreq = FinFrequencyTypes.SEMI_ANNUAL maturityDate = settlementDate.addMonths(24) swap1 = FinLiborSwap(settlementDate, maturityDate, m * 0.015910 + irBump, fixedFreq, dcType) swaps.append(swap1) maturityDate = settlementDate.addMonths(36) swap2 = FinLiborSwap(settlementDate, maturityDate, m * 0.014990 + irBump, fixedFreq, dcType) swaps.append(swap2) maturityDate = settlementDate.addMonths(48) swap3 = FinLiborSwap(settlementDate, maturityDate, m * 0.014725 + irBump, fixedFreq, dcType) swaps.append(swap3) maturityDate = settlementDate.addMonths(60) swap4 = FinLiborSwap(settlementDate, maturityDate, m * 0.014640 + irBump, fixedFreq, dcType) swaps.append(swap4) maturityDate = settlementDate.addMonths(72) swap5 = FinLiborSwap(settlementDate, maturityDate, m * 0.014800 + irBump, fixedFreq, dcType) swaps.append(swap5) maturityDate = settlementDate.addMonths(84) swap6 = FinLiborSwap(settlementDate, maturityDate, m * 0.014995 + irBump, fixedFreq, dcType) swaps.append(swap6) maturityDate = settlementDate.addMonths(96) swap7 = FinLiborSwap(settlementDate, maturityDate, m * 0.015180 + irBump, fixedFreq, dcType) swaps.append(swap7) maturityDate = settlementDate.addMonths(108) swap8 = FinLiborSwap(settlementDate, maturityDate, m * 0.015610 + irBump, fixedFreq, dcType) swaps.append(swap8) maturityDate = settlementDate.addMonths(120) swap9 = FinLiborSwap(settlementDate, maturityDate, m * 0.015880 + irBump, fixedFreq, dcType) swaps.append(swap9) maturityDate = settlementDate.addMonths(144) swap10 = FinLiborSwap(settlementDate, maturityDate, m * 0.016430 + irBump, fixedFreq, dcType) swaps.append(swap10) liborCurve = FinLiborCurve("USD_LIBOR", settlementDate, depos, fras, swaps) cdsMarketContracts = [] cdsCoupon = 0.04 + mktSpreadBump # maturityDate = valuationDate.nextCDSDate(6) # cds = FinCDS(valuationDate,maturityDate, cdsCoupon) # cdsMarketContracts.append(cds) maturityDate = valuationDate.nextCDSDate(12) cds = FinCDS(valuationDate, maturityDate, cdsCoupon) cdsMarketContracts.append(cds) maturityDate = valuationDate.nextCDSDate(24) cds = FinCDS(valuationDate, maturityDate, cdsCoupon) cdsMarketContracts.append(cds) maturityDate = valuationDate.nextCDSDate(36) cds = FinCDS(valuationDate, maturityDate, cdsCoupon) cdsMarketContracts.append(cds) maturityDate = valuationDate.nextCDSDate(48) cds = FinCDS(valuationDate, maturityDate, cdsCoupon) cdsMarketContracts.append(cds) maturityDate = valuationDate.nextCDSDate(60) cds = FinCDS(valuationDate, maturityDate, cdsCoupon) cdsMarketContracts.append(cds) maturityDate = valuationDate.nextCDSDate(84) cds = FinCDS(valuationDate, maturityDate, cdsCoupon) cdsMarketContracts.append(cds) maturityDate = valuationDate.nextCDSDate(120) cds = FinCDS(valuationDate, maturityDate, cdsCoupon) cdsMarketContracts.append(cds) maturityDate = valuationDate.nextCDSDate(180) cds = FinCDS(valuationDate, maturityDate, cdsCoupon) cdsMarketContracts.append(cds) # for cds in cdsMarketContracts: # print("CDS Maturity Date",cds._maturityDate) recoveryRate = 0.40 issuerCurve = FinCDSCurve(valuationDate, cdsMarketContracts, liborCurve, recoveryRate) return liborCurve, issuerCurve
def test_FinLiborDepositsAndSwaps(): valuationDate = FinDate(2019, 9, 18) depoDCCType = FinDayCountTypes.THIRTY_E_360_ISDA depos = [] spotDays = 2 settlementDate = valuationDate.addWorkDays(spotDays) depositRate = 0.050 maturityDate = settlementDate.addMonths(1) depo = FinLiborDeposit(settlementDate, maturityDate, depositRate, depoDCCType) depos.append(depo) maturityDate = settlementDate.addMonths(2) depo = FinLiborDeposit(settlementDate, maturityDate, depositRate, depoDCCType) depos.append(depo) maturityDate = settlementDate.addMonths(3) depo = FinLiborDeposit(settlementDate, maturityDate, depositRate, depoDCCType) depos.append(depo) maturityDate = settlementDate.addMonths(6) depo = FinLiborDeposit(settlementDate, maturityDate, depositRate, depoDCCType) depos.append(depo) maturityDate = settlementDate.addMonths(9) depo = FinLiborDeposit(settlementDate, maturityDate, depositRate, depoDCCType) depos.append(depo) maturityDate = settlementDate.addMonths(12) depo = FinLiborDeposit(settlementDate, maturityDate, depositRate, depoDCCType) depos.append(depo) fras = [] swaps = [] fixedDCCType = FinDayCountTypes.ACT_365_ISDA fixedFreqType = FinFrequencyTypes.SEMI_ANNUAL swapRate = 0.05 maturityDate = settlementDate.addMonths(24) swap = FinLiborSwap(settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap) maturityDate = settlementDate.addMonths(36) swap = FinLiborSwap(settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap) maturityDate = settlementDate.addMonths(48) swap = FinLiborSwap(settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap) maturityDate = settlementDate.addMonths(60) swap = FinLiborSwap(settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap) maturityDate = settlementDate.addMonths(72) swap = FinLiborSwap(settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap) maturityDate = settlementDate.addMonths(84) swap = FinLiborSwap(settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap) maturityDate = settlementDate.addMonths(96) swap = FinLiborSwap(settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap) maturityDate = settlementDate.addMonths(108) swap = FinLiborSwap(settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap) maturityDate = settlementDate.addMonths(120) swap = FinLiborSwap(settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap) maturityDate = settlementDate.addMonths(132) swap = FinLiborSwap(settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap) maturityDate = settlementDate.addMonths(144) swap = FinLiborSwap(settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap) maturityDate = settlementDate.addMonths(180) swap = FinLiborSwap(settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap) maturityDate = settlementDate.addMonths(240) swap = FinLiborSwap(settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap) maturityDate = settlementDate.addMonths(300) swap = FinLiborSwap(settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap) maturityDate = settlementDate.addMonths(360) swap = FinLiborSwap(settlementDate, maturityDate, swapRate, fixedFreqType, fixedDCCType) swaps.append(swap) liborCurve = FinLiborCurve("USD_LIBOR", settlementDate, depos, fras, swaps) df = liborCurve.df(settlementDate) testCases.header("SETTLEMENT DATE", "DF") testCases.print(str(settlementDate), df) testCases.header("DATE", "DF") for deposit in depos: df = liborCurve.df(deposit._maturityDate) testCases.print(str(deposit._maturityDate), df) for swap in swaps: df = liborCurve.df(deposit._maturityDate) testCases.print(str(deposit._maturityDate), df)
def test_FinFXForward(): # https://stackoverflow.com/questions/48778712 # /fx-vanilla-call-price-in-quantlib-doesnt-match-bloomberg valueDate = FinDate(13, 2, 2018) expiryDate = valueDate.addMonths(12) # Forward is on EURUSD which is expressed as number of USD per EUR # ccy1 = EUR and ccy2 = USD forName = "EUR" domName = "USD" currencyPair = forName + domName # Always ccy1ccy2 spotFXRate = 1.300 # USD per EUR strikeFXRate = 1.365 # USD per EUR ccy1InterestRate = 0.02 # USD Rates ccy2InterestRate = 0.05 # EUR rates ########################################################################### spotDays = 0 settlementDate = valueDate.addWorkDays(spotDays) maturityDate = settlementDate.addMonths(12) notional = 100.0 calendarType = FinCalendarTypes.TARGET depos = [] fras = [] swaps = [] depositRate = ccy1InterestRate depo = FinLiborDeposit(settlementDate, maturityDate, depositRate, FinDayCountTypes.ACT_360, notional, calendarType) depos.append(depo) forDiscountCurve = FinLiborCurve(forName, settlementDate, depos, fras, swaps) depos = [] fras = [] swaps = [] depositRate = ccy2InterestRate depo = FinLiborDeposit(settlementDate, maturityDate, depositRate, FinDayCountTypes.ACT_360, notional, calendarType) depos.append(depo) domDiscountCurve = FinLiborCurve(domName, settlementDate, depos, fras, swaps) notional = 100.0 notionalCurrency = forName fxForward = FinFXForward(expiryDate, strikeFXRate, currencyPair, notional, notionalCurrency) testCases.header("SPOT FX", "FX FWD", "VALUE_BS") fwdValue = fxForward.value(valueDate, spotFXRate, domDiscountCurve, forDiscountCurve) print(fwdValue) fwdFXRate = fxForward.forward(valueDate, spotFXRate, domDiscountCurve, forDiscountCurve) print(fwdFXRate) testCases.print(spotFXRate, fwdFXRate, fwdValue)
def buildFullIssuerCurve(tradeDate): valuationDate = tradeDate.addDays(1) dcType = FinDayCountTypes.ACT_360 depos = [] irBump = 0.0 m = 1.0 # 0.00000000000 spotDays = 2 settlementDate = valuationDate.addDays(spotDays) maturityDate = settlementDate.addMonths(1) depo1 = FinLiborDeposit(settlementDate, maturityDate, m * 0.0016, dcType) maturityDate = settlementDate.addMonths(2) depo2 = FinLiborDeposit(settlementDate, maturityDate, m * 0.0020, dcType) maturityDate = settlementDate.addMonths(3) depo3 = FinLiborDeposit(settlementDate, maturityDate, m * 0.0024, dcType) maturityDate = settlementDate.addMonths(6) depo4 = FinLiborDeposit(settlementDate, maturityDate, m * 0.0033, dcType) maturityDate = settlementDate.addMonths(12) depo5 = FinLiborDeposit(settlementDate, maturityDate, m * 0.0056, dcType) depos.append(depo1) depos.append(depo2) depos.append(depo3) depos.append(depo4) depos.append(depo5) fras = [] swaps = [] dcType = FinDayCountTypes.THIRTY_E_360_ISDA fixedFreq = FinFrequencyTypes.SEMI_ANNUAL maturityDate = settlementDate.addMonths(24) swap1 = FinLiborSwap(settlementDate, maturityDate, m * 0.0044 + irBump, fixedFreq, dcType) swaps.append(swap1) maturityDate = settlementDate.addMonths(36) swap2 = FinLiborSwap(settlementDate, maturityDate, m * 0.0078 + irBump, fixedFreq, dcType) swaps.append(swap2) maturityDate = settlementDate.addMonths(48) swap3 = FinLiborSwap(settlementDate, maturityDate, m * 0.0119 + irBump, fixedFreq, dcType) swaps.append(swap3) maturityDate = settlementDate.addMonths(60) swap4 = FinLiborSwap(settlementDate, maturityDate, m * 0.0158 + irBump, fixedFreq, dcType) swaps.append(swap4) maturityDate = settlementDate.addMonths(72) swap5 = FinLiborSwap(settlementDate, maturityDate, m * 0.0192 + irBump, fixedFreq, dcType) swaps.append(swap5) maturityDate = settlementDate.addMonths(84) swap6 = FinLiborSwap(settlementDate, maturityDate, m * 0.0219 + irBump, fixedFreq, dcType) swaps.append(swap6) maturityDate = settlementDate.addMonths(96) swap7 = FinLiborSwap(settlementDate, maturityDate, m * 0.0242 + irBump, fixedFreq, dcType) swaps.append(swap7) maturityDate = settlementDate.addMonths(108) swap8 = FinLiborSwap(settlementDate, maturityDate, m * 0.0261 + irBump, fixedFreq, dcType) swaps.append(swap8) maturityDate = settlementDate.addMonths(120) swap9 = FinLiborSwap(settlementDate, maturityDate, m * 0.0276 + irBump, fixedFreq, dcType) swaps.append(swap9) liborCurve = FinLiborCurve("USD_LIBOR", settlementDate, depos, fras, swaps) cdsMarketContracts = [] cdsCoupon = 0.005743 maturityDate = valuationDate.nextCDSDate(6) cds = FinCDS(valuationDate, maturityDate, cdsCoupon) cdsMarketContracts.append(cds) cdsCoupon = 0.007497 maturityDate = valuationDate.nextCDSDate(12) cds = FinCDS(valuationDate, maturityDate, cdsCoupon) cdsMarketContracts.append(cds) cdsCoupon = 0.011132 maturityDate = valuationDate.nextCDSDate(24) cds = FinCDS(valuationDate, maturityDate, cdsCoupon) cdsMarketContracts.append(cds) cdsCoupon = 0.013932 maturityDate = valuationDate.nextCDSDate(36) cds = FinCDS(valuationDate, maturityDate, cdsCoupon) cdsMarketContracts.append(cds) cdsCoupon = 0.015764 maturityDate = valuationDate.nextCDSDate(48) cds = FinCDS(valuationDate, maturityDate, cdsCoupon) cdsMarketContracts.append(cds) cdsCoupon = 0.017366 maturityDate = valuationDate.nextCDSDate(60) cds = FinCDS(valuationDate, maturityDate, cdsCoupon) cdsMarketContracts.append(cds) cdsCoupon = 0.020928 maturityDate = valuationDate.nextCDSDate(84) cds = FinCDS(valuationDate, maturityDate, cdsCoupon) cdsMarketContracts.append(cds) cdsCoupon = 0.022835 maturityDate = valuationDate.nextCDSDate(120) cds = FinCDS(valuationDate, maturityDate, cdsCoupon) cdsMarketContracts.append(cds) recoveryRate = 0.40 issuerCurve = FinCDSCurve(valuationDate, cdsMarketContracts, liborCurve, recoveryRate) return liborCurve, issuerCurve