Davinci Pydantic Quantlib Wrapper
import contracts as ct
import qcalendar as cl
import term_structure as ts
import duration as dr
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)
conv = dr.convexity(bond, rate)
Native Quantlib
import QuantLib as ql
# Set evaluation date
today = ql.Date(15, 8, 2026)
ql.Settings.instance().evaluationDate = today
# Define bond parameters
settlementDays = 2
faceValue = 100.0
coupon = 0.05
issueDate = ql.Date(15, 8, 2024)
maturityDate = ql.Date(15, 8, 2031)
calendar = ql.UnitedStates(ql.UnitedStates.GovernmentBond)
bsp = ql.ModifiedFollowing
dayCounter = ql.ActualActual(ql.ActualActual.Bond)
paymentFrequency = ql.Semiannual
schedule = ql.Schedule(
issueDate, maturityDate, ql.Period(paymentFrequency),
calendar, bsp, bsp, ql.DateGeneration.Backward, False
)
bond = ql.FixedRateBond(
settlementDays, faceValue, schedule, [coupon], dayCounter
)
# Calculate convexity at a given yield (e.g., 4.5%)
yield_rate = 0.045
convexity = ql.BondFunctions.convexity(
bond, yield_rate, dayCounter, ql.Compounded, paymentFrequency
)