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)