Specifying Fixed Income Contracts
Overview
duration
Davinci Pydantic Quantlib Wrapper
import contracts as ct
import qcalendar as cl
import term_structure as ts
import 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)
Native Quantlib
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)