Quantlib Bond with Optioonality
import QuantLib as ql
# 1. Set Evaluation Date & Market Curve
today = ql.Date(25, ql.June, 2026)
ql.Settings.instance().evaluationDate = today
rate = 0.05 # 5% flat yield curve for this example
day_counter = ql.Actual360()
ts_handle = ql.YieldTermStructureHandle(ql.FlatForward(today, rate, day_counter))
# 2. Define the Bond Schedule
issue_date = ql.Date(15, ql.January, 2026)
maturity_date = ql.Date(15, ql.January, 2036)
tenor = ql.Period(ql.Semiannual)
calendar = ql.UnitedStates(ql.UnitedStates.GovernmentBond)
convention = ql.Following
schedule = ql.Schedule(
issue_date, maturity_date, tenor, calendar,
convention, convention, ql.DateGeneration.Backward, False
)
# 3. Define the Callability Schedule
# Let's assume the issuer can call the bond at par (100) on or after Jan 15, 2031
callability_schedule = ql.CallabilitySchedule()
call_date = ql.Date(15, ql.January, 2031)
call_price = 100.0
call_price_type = ql.CallabilityPrice(call_price, ql.CallabilityPrice.Clean)
callability = ql.Callability(call_price_type, ql.Callability.Call, call_date)
callability_schedule.append(callability)
# 4. Construct the CallableFixedRateBond
settlement_days = 3
face_amount = 100.0
coupons = [0.05]
accrual_day_count = ql.ActualActual(ql.ActualActual.Bond)
bond = ql.CallableFixedRateBond(
settlement_days, face_amount, schedule, coupons,
accrual_day_count, convention, face_amount, issue_date, callability_schedule
)