Continuous Zero Coupon Curve
Overview
Probably the simplest way to think about a discount curve as a curve of
continuously compounded zero coupon rates, which translate directly to the price of a dollar at the
differenct dates along the curve.
Object Definitions
The davinci quantlib wrapper provides a pydantic object for representing a
continuously compounded zero rate curve.
@dataclass
class ContinousZeroCurve(TermStructureModel):
model_config = ConfigDict(frozen=True)
day_count:ct.DayCount
calendar:cl.Calendar
data:list[Any]
today:str = Field(default_factory=lambda: date.today().isoformat())
handle:Any=None
Extracting Continuous Compounded Rates
Once a curve has been constructed (typically using
bootstrap), the zero rates can be extracted from the curve.
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.data as dt
data = {"date": "2026-08-10", "1M": 3.79, "1.5M": 3.8, "2M": 3.84, "3M": 3.89,
"4M": 3.91, "6M": 4.0, "1Y": 4.04, "2Y": 4.25, "3Y": 4.31, "5Y": 4.41,
"7Y": 4.56, "10Y": 4.72, "20Y": 5.25, "30Y": 5.25}
data2 = []
for key in data:
if key != 'date':
item = [key, data[key]]
data2.append(item)
pass
data3 =dt.treasury_term_data(data2)
curve = ts.BootstrappedCurve(type=ts.BootstrapTypes.PiecewiseLogLinearDiscount,
day_count=dt.treasury.DAY_COUNT,
data=data3,
today='2026-08-10')
zero = ts.zero_rate(curve = curve, date=date, day_count= ct.DayCount.Actual365Fixed,
compounding=ct.Compounding.Continuous)
Constructing a Zero Coupon Curve
A curve object can also be constructed from zero rates that have been extracted from a
previously constructed curve.
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.data as dt
data = {"date": "2026-08-10", "1M": 3.79, "1.5M": 3.8, "2M": 3.84, "3M": 3.89,
"4M": 3.91, "6M": 4.0, "1Y": 4.04, "2Y": 4.25, "3Y": 4.31, "5Y": 4.41,
"7Y": 4.56, "10Y": 4.72, "20Y": 5.25, "30Y": 5.25}
data2 = []
for key in data:
if key != 'date':
item = [key, data[key]]
data2.append(item)
pass
data3 =dt.treasury_term_data(data2)
curve = ts.BootstrappedCurve(type=ts.BootstrapTypes.PiecewiseLogLinearDiscount,
day_count=dt.treasury.DAY_COUNT, data=data3, today='2026-08-10')
dates = ['2026-08-11', '2026-09-01','2026-10-01','2026-11-01','2026-12-01','2027-01-01',
'2027-02-01','2027-03-01','2027-04-01']
zdata = []
for date in dates:
zero = ts.zero_rate(curve = curve, date=date, day_count= ct.DayCount.Actual365Fixed,
compounding=ct.Compounding.Continuous)
zdata.append([date, zero])
pass
zcurve = ts.ContinousZeroCurve(day_count=ct.DayCount.Actual365Fixed,
calendar=cl.Calendar.USGovernmentBond, data=zdata,
today='2026-08-11')
rate = ts.zero_rate(curve = curve, date='2027-01-10', day_count= ct.DayCount.Actual365Fixed,
compounding=ct.Compounding.Continuous)