This post will walk through an example of modeling fixed rate bonds using QuantLib Python.

Let's consider a hypothetical bond with a par value of 100, that pays 6% coupon semi-annually issued on January 15th, 2015 and set to mature on January 15th, 2016. The bond will pay a coupon on July 15th, 2015 and January 15th, 2016. The par amount of 100 will also be paid on the January 15th, 2016.

To make things simpler, lets assume that we know the spot rates of the treasury as of January 15th, 2015. The annualized spot rates are 0.5% for 6 months and 0.7% for 1 year point. Lets calculate the fair value of this bond.

>>> 3/pow(1+0.005, 0.5) + (100 + 3)/(1+0.007) 105.27653992490681

Lets calculate the same thing using QuantLib.

>>> import QuantLib as ql >>> todaysDate = ql.Date(15, 1, 2015) >>> ql.Settings.instance().evaluationDate = todaysDate >>> spotDates = [ql.Date(15, 1, 2015), ql.Date(15, 7, 2015), ql.Date(15, 1, 2016)] >>> spotRates = [0.0, 0.005, 0.007] >>> dayCount = ql.Thirty360() >>> calendar = ql.UnitedStates() >>> interpolation = ql.Linear() >>> compounding = ql.Compounded >>> compoundingFrequency = ql.Annual >>> spotCurve = ql.ZeroCurve(spotDates, spotRates, dayCount, calendar, interpolation, compounding, compoundingFrequency) >>> spotCurveHandle = ql.YieldTermStructureHandle(spotCurve)

So far we have created the term structure and the variables are rather self explanatory. Now lets construct the fixed rate bond.

>>> issueDate = ql.Date(15, 1, 2015) >>> maturityDate = ql.Date(15, 1, 2016) >>> tenor = ql.Period(ql.Semiannual) >>> calendar = ql.UnitedStates() >>> bussinessConvention = ql.Unadjusted >>> dateGeneration = ql.DateGeneration.Backward >>> monthEnd = False >>> schedule = ql.Schedule (issueDate, maturityDate, tenor, calendar, bussinessConvention, bussinessConvention , dateGeneration, monthEnd) >>> list(schedule) [Date(15, 1, 12015), Date(15,7,2015), Date(15,1,2016)] # Now lets build the coupon >>> dayCount = ql.Thirty360() >>> couponRate = .06 >>> coupons = [couponRate] # Now lets construct the FixedRateBond >>> settlementDays = 0 >>> faceValue = 100 >>> fixedRateBond = ql.FixedRateBond(settlementDays, faceValue, schedule, coupons, dayCount) # create a bond engine with the term structure as input; # set the bond to use this bond engine >>> bondEngine = ql.DiscountingBondEngine(spotCurveHandle) >>> fixedRateBond.setPricingEngine(bondEngine) # Finally the price >>> fixedRateBond.NPV() 105.27653992490683

Voila!

Download the modeling bonds ipython notebook.

python finance quantlib

- Valuing Interest Rate Caps and Floors Using QuantLib Python
- Valuing Bonds with Credit Spreads in QuantLib Python
- Introduction to QuantLib Python
- Short Interest Rate Model Calibration in QuantLib Python
- QuantLib Python Notebooks On Docker