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.
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:
Calculates aggregated cash flows for the series
Calculates yield and risk statistics for the series given
price
Calculates price and risk statistics for the series given
yield
Calculates price, yield, and risk statistics for the
series given discounting curve
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.
Calculates price, yield, and risk statistics for the
series given discounting curve, assuming that each serial bond is called
optimally.
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.
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 |
|
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
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
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 |
|
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.