I am trying to calculate dv01 on the vanilla swap using quantlib but not able to understand how to calculate the fixed_rate. In all the examples it's a hardcoded value which is not right. Any suggestions on how to get the fixed_Rate using the curve, maturity and the effective date? In the below example its 0.05 but should be really a forward rate?
from QuantLib import *
# global data
calendar = TARGET()
todaysDate = Date(16, April, 2021)
Settings.instance().evaluationDate = todaysDate
settlementDate = Date(20, April, 2021)
# market quotes
deposits = {
(1, Months): 0.04289,
(3, Months): 0.04289,
(6, Months): 0.04345,
(9, Months): 0.04401,
}
swaps = {
(1, Years): 0.04506,
(2, Years): 0.04881,
(3, Years): 0.05262,
(4, Years): 0.05575,
(5, Years): 0.05817,
(7, Years): 0.06212,
(10, Years): 0.06639,
(15, Years): 0.07074,
(20, Years): 0.07303,
(30, Years): 0.0741}
# convert them to Quote objects
for n, unit in deposits.keys():
deposits[(n, unit)] = SimpleQuote(deposits[(n, unit)])
for n, unit in swaps.keys():
swaps[(n, unit)] = SimpleQuote(swaps[(n, unit)])
# build rate helpers
dayCounter = Actual360()
settlementDays = 2
depositHelpers = [DepositRateHelper(QuoteHandle(deposits[(n, unit)]),
Period(n, unit), settlementDays,
calendar, Following,
False, dayCounter)
for n, unit in [(1, Months), (3, Months),
(6, Months), (9, Months)]]
fixedLegFrequency = EveryFourthWeek
fixedLegTenor = Period(28, Days)
fixedLegAdjustment = Following
fixedLegDayCounter = Actual360()
floatingLegTenor = Period(28, Days)
floatingLegAdjustment = Following
swapHelpers = [SwapRateHelper(QuoteHandle(swaps[(n, unit)]),
Period(n, unit), calendar,
fixedLegFrequency, fixedLegAdjustment,
fixedLegDayCounter, Euribor6M())
for n, unit in swaps.keys()]
# term structure handles
discountTermStructure = RelinkableYieldTermStructureHandle()
forecastTermStructure = RelinkableYieldTermStructureHandle()
# term-structure construction
helpers = depositHelpers + swapHelpers
depoSwapCurve = PiecewiseFlatForward(settlementDate, helpers, Actual360())
swapEngine = DiscountingSwapEngine(discountTermStructure)
# 5Y Swap
nominal = 10000000
maturity = Date(10, June, 2026)
fixedRate = 0.05
spread = 0.0
index = Euribor6M(forecastTermStructure)
fixedSchedule = Schedule(settlementDate, maturity,
fixedLegTenor, calendar,
fixedLegAdjustment, fixedLegAdjustment,
DateGeneration.Forward, False)
floatingSchedule = Schedule(settlementDate, maturity,
floatingLegTenor, calendar,
floatingLegAdjustment, floatingLegAdjustment,
DateGeneration.Forward, False)
swap = VanillaSwap(VanillaSwap.Receiver, nominal,
fixedSchedule, fixedRate, fixedLegDayCounter,
floatingSchedule, index, spread,
Actual360())
swap.setPricingEngine(swapEngine)
discountTermStructure.linkTo(depoSwapCurve)
forecastTermStructure.linkTo(depoSwapCurve)
print('NPV')
print(swap.NPV())
print('Rate')
print(swap.fairRate())
shift = 0.0001
temp_fyc_handle = YieldTermStructureHandle(depoSwapCurve)
temp_dyc_handle = YieldTermStructureHandle(depoSwapCurve)
shiftedForwardCurve = ZeroSpreadedTermStructure(temp_fyc_handle, QuoteHandle(SimpleQuote(shift)))
shiftedDiscountCurve = ZeroSpreadedTermStructure(temp_dyc_handle, QuoteHandle(SimpleQuote(shift)))
discountTermStructure.linkTo(shiftedDiscountCurve)
forecastTermStructure.linkTo(shiftedForwardCurve)
P_p = swap.NPV()
temp_fyc_handle = YieldTermStructureHandle(depoSwapCurve)
temp_dyc_handle = YieldTermStructureHandle(depoSwapCurve)
shiftedForwardCurve = ZeroSpreadedTermStructure(temp_fyc_handle, QuoteHandle(SimpleQuote(-shift)))
shiftedDiscountCurve = ZeroSpreadedTermStructure(temp_dyc_handle, QuoteHandle(SimpleQuote(-shift)))
discountTermStructure.linkTo(shiftedDiscountCurve)
forecastTermStructure.linkTo(shiftedForwardCurve)
P_m = swap.NPV()
dv01 = (P_m - P_p) / 2.0
print('Swap DV01')
print(dv01)