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)