Serial Bond Functions (muni / tax-exempt market)

Overview

A tax-exempt fixed-income security (e.g., a municipal bond) is typically made up of many serial bonds with different maturities.  This structure helps the issuer to spread out the debt service and make approximately equal annual principal payments.  For example, bonds may mature each year for twenty years after the date of issue of the series.  Each maturity can pay a different coupon rate - usually the longer the maturity the higher the coupon.  In addition, most tax-exempt issues are callable.

FINCAD Functions

The FINCAD library contains six functions related to Serial Bonds - four are for non-callable and two are for callable issues.  The functions treat the bond series from the point of view of the issuer, and consider the price and risk statistics for the whole structure as a portfolio of term bonds with different maturities.  (To analyze each serial bond from the holder’s perspective, use the aaBond3* or aaCallBond* suite of functions for each bond separately.)  The callable bond series are priced using a price-to-worst analysis; for more details see the Callable and Puttable Bonds FINCAD Math Reference document.  The Serial Bond functions can be classified as follows:

Not Callable

aaBondSeries_cf

Calculates aggregated cash flows for the series

aaBondSeries_y

Calculates yield and risk statistics for the series given price

aaBondSeries_p

Calculates price and risk statistics for the series given yield

aaBondSeries_strip_p

Calculates price, yield, and risk statistics for the series given discounting curve

Callable

aaCallBondSeries_strip_cf

Calculates aggregated cash flows for the series given discounting curve, assuming that each serial bond is called optimally.  Using table_type = 3, can instead calculate a table of information (expected redemption date, price, risk statistics) where each row represents a different serial bond.

aaCallBondSeries_strip_p

Calculates price, yield, and risk statistics for the series given discounting curve, assuming that each serial bond is called optimally.

 

Description of Inputs

All functions contain the following inputs:

Input Argument

Description

d_v

Settlement / valuation date.  This is the date for which the series will be priced.

bondseries_tbl

A 6-column table where each row represents a bond in the series: dated date, first coupon, last coupon date, maturity date, principal, redemption value, coupon. 

Dated date: Date from which interest starts to accrue.  This is an optional argument and setting it to zero means that the parameter will be ignored.

First coupon: Date of first coupon.  This is an optional argument and setting it to zero means that the parameter will be ignored.  It is only required if the bond has an odd first coupon period.  If the bond does have an odd first coupon period, this date will be an unadjusted cycle date. 

Last coupon date: Date of next to last coupon prior to maturity.  This is also the starting date of the last coupon period.  This is an optional argument and setting it to zero means that the parameter will be ignored.  This parameter is only required if the bond has an odd last coupon period.  If the bond does have an odd coupon period, all other dates will cycle off of this date. 

Maturity date:  All coupon dates will cycle off of this date, unless the bond has an odd last or an odd first coupon period. 

Principal: Notional principal amount. 

Redemption value: Redemption value per 100 notional paid at maturity.  Generally the redemption value should be set to 100. 

Coupon: Coupon rate.

freq

Frequency of coupon payments (annual, semi-annual, quarterly or monthly)

acc_bond

Accrual method.  20 accrual methods are supported.

hl

A one column table of holiday dates.

The following input applies to aaBondSeries_y only

Input Argument

Description

price

The clean price of the bond (excluding accrued interest) per 100 current notional (e.g. 101 or 99.275).  If the current notional is not known, use aaBondSeries_y() with a dummy price (e.g.,100) and request statistic #9.

The following input applies to aaBondSeries_p only

Input Argument

Description

yield

The given yield is assumed to be compounded at the coupon frequency (see input freq), with partial periods being calculated using the accrual as set in acc_bond.

The following input applies to the callable bond functions only

Input Argument

Description

ex_sched1

The call schedule as a 2-column table: date and redemption price (per 100 notional).  Each bond is callable on all coupon dates between the first and the last dates in this table inclusively.  The redemption price for any coupon date is taken from the last row in ex_sched1 whose date is equal or prior to the coupon date.

The following input applies to aaBondSeries_cf, aaBondSeries_strip_p, aaCallBondSeries_strip_cf and aaCallBondSeries_strip_p

Input Argument

Description

d_rul

The business day convention used to adjust cash flow dates when they occur on a holiday or weekend.

The following inputs apply to all of the non-callable bond series

Input Argument

Description

exdays

Number of units, based on adj_units, bond is ex-dividend prior to a coupon date.  Setting this to zero means the bond does not go ex-dividend on any coupon date.  Generally these will be days.

adj_units

These are the ex-dividend units.  Generally this will be set to 1 (market days) or 2 (calendar days).  More rare, but possible, are bonds that use some number of weeks or months to calculate the ex-dividend date.

atissue

This switch is related to the calculation of accrued interest prior to the d_dated (generally this is not important).  atissue=1, means that the accrued interest will be zero for any dates prior to d_dated.  Setting atissue=2, means that the accrued interest is negative prior to this date (calculated as if the bond were ex-dividend).

The following inputs apply to aaBondSeries_strip_p, aaCallBondSeries_strip_cf and aaCallBondSeries_strip_p

Input Argument

Description

intrp

Method used to interpolate the discount factor for a date not given in the discount factor curve (linear, cubic spline, or exponential).

df_crv

The discount factor curve (date, discount factor).

These inputs are similar to the inputs to the aaBond3* suite of functions, since they are called internally.

Example

Suppose that the valuation date is 20-Sep-2002, and that there are just two bonds in the series, with maturities 20-Jun-2003 and 20-Jun-2004.  The notionals are 1,000,000 and 2,000,000 respectively (both are redeemed at par), and the coupons are 5% and 6% respectively.  The bonds pay semi-annual coupons, with no adjustments for weekends or holidays, there are no odd periods, and interest accrues at 30/360 between coupons.  The input table Bondseries_tbl is as follows:

Bondseries_tbl

dated date

date of first coupon after dated date

date of last coupon prior to maturity date

maturity date

principal

redemption value

coupon

0

0

0

20-Jun-2003

1,000,000

100

5.00%

0

0

0

20-Jun-2004

2,000,000

100

6.00%

Using aaBondSeries_cf we obtain the following aggregated cash flow from the two bonds:

cash flow date

interest

principal payment

total cash flow

accrued interest

20-Dec-2002

85,000

0

85,000

42,500

20-Jun-2003

85,000

1,000,000

1,085,000

0

20-Dec-2003

60,000

0

60,000

0

20-Jun-2004

60,000

2,000,000

2,060,000

0

 

*       Note:  The 85,000 interest amount in the first two cash flows is the sum of 1,000,000*5%*0.5 = 25,000 and 2,000,000*6%*0.5 = 60,000.  The functions aaBondSeries_strip_p, aaBondSeries_p and aaBondSeries_y could be used to calculate the price and/or yield of this cash flow.

 

Now suppose that the series is callable, and that the following exercise schedule is given.

ex_sched1:

date

call price per 100 notional

20-Dec-2002

105

20-Dec-2003

95

This table specifies that each bond in the series is callable on all coupon dates between 20-Dec-2002 and 20-Dec-2003 inclusive.  The rule is that the redemption price for any coupon date is taken from the last row in ex_sched1 whose date is equal or prior to the coupon date.  Hence, for the coupons on 20-Dec-2002 and 20-Jun-2003 the redemption price is 105, while for the coupon on 20-Dec-2003 the redemption price is 95.  If par swap rates in the 5% to 6% range for these maturities are used to build the discounting curve, then it is unattractive to call at 105, but attractive to call at 95.  This can be seen when aaCallBondSeries_strip_cf is used with table_type = 3:


 

Expected Redemption Date

Redemption Value

Clean Price

Dirty Price

Yield

Duration

Modified Duration

Convexity

Basis Point Value

Yield value of 1 bp

Final Principal Payment

20-Jun-2003

100

995,028.42

1,007,528.42

5.6744%

0.7378

0.7174

0.8691

-72.277

-0.0001383

1,000,000

20-Dec-2003

95

1,912,500.87

1,942,500.87

5.7533%

1.2047

1.1711

1.9744

-227.459

-8.792E-05

1,900,000

The first bond (maturity 20-Jun-2003) matures without early redemption.  However, the second bond (maturity 20-Jun-2004) is expected to be called on 20-Dec-2003 at a price of 95 (or 1,900,000 on 2,000,000 notional).


Using aaCallBondSeries_strip_cf with table_type = 1 we obtain the following aggregated cash flow from the two bonds, assuming the early redemption on the second bond:

cash flow date

interest

principal payment

total cash flow

accrued interest

20-Dec-2002

85,000

0

85,000

42,500

20-Jun-2003

85,000

1,000,000

1,085,000

0

20-Dec-2003

60,000

1,900,000

1,960,000

0

The function aaCallBondSeries_strip_p could be used to calculate the price and/or yield of this cash flow.

 

 

Disclaimer

 

With respect to this document, FinancialCAD Corporation (“FINCAD”) makes no warranty either express or implied, including, but not limited to, any implied warranty of merchantability or fitness for a particular purpose. In no event shall FINCAD be liable to anyone for special, collateral, incidental, or consequential damages in connection with or arising out of the use of this document or the information contained in it. This document should not be relied on as a substitute for your own independent research or the advice of your professional financial, accounting or other advisors.

 

This information is subject to change without notice. FINCAD assumes no responsibility for any errors in this document or their consequences and reserves the right to make changes to this document without notice.

 

Copyright

 

Copyright © FinancialCAD Corporation 2008. All rights reserved.