Specifying Fixed Income Contracts
Overview
duration
Davinci Pydantic Quantlib Wrapper
Duration functions:
- macaulay_duration
- modified_duration
INputs
- Contract
- INterest Rate - a rate representing the yield to maturity. If not provided, you must
provide a curve
- Term Structure - if no rate is provided, a term structure can be used to calcualte the yield
import lib.fixed_income.contracts as ct
import lib.fixed_income.qcalendar as cl
import lib.fixed_income.term_structure as ts
import lib.fixed_income.duration as dt
schedule = ct.Schedule(start_date='2000-01-01', end_date='2030-01-01',
frequency= ct.Frequency.Annual,
calendar= cl.Calendar.USGovernmentBond,
convention=ct.Convention.Following,
dateroll=ct.DateRoll.Forward)
bond = ct.FixedRateBond(settlement_days=2,face_value=10000,
day_count=ct.DayCount.Actual360,
coupons=0.05,schedule=schedule)
rate = ts.InterestRate(0.005, ct.DayCount.Actual360,
ct.Compounding.Compounded, ct.Frequency.Semiannual)
mc = dt.macaulay_duration(bond, rate)
ed = dt.modified_duration(bond, rate)
Native Quantlib
The following code does not use the davinci wrapper, but the raw quantlib calls.
import QuantLib as ql
# Define yield as an InterestRate object
ytm_rate = ql.InterestRate(0.0511, ql.Actual365Fixed(), ql.Compounded, ql.Annual)
# Calculate Macaulay or Modified duration
macaulay_dur = ql.BondFunctions.duration(bond, ytm_rate, ql.Duration.Macaulay)
modified_dur = ql.BondFunctions.duration(bond, ytm_rate, ql.Duration.Modified)