Bond Valuation

Overview

This module computes the present value or the yield-to-maturity of of the expected cashflow of a bond. Also,it is possible to make a sensibility analysis for different values for the yield-to-maturity and one present value of the bond.

Functions in this module

cashflows.bond.bond(maturity_date=None, freq='A', face_value=None, coupon_rate=None, coupon_value=None, num_coupons=None, value=None, ytm=None)[source]
Parameters:
  • face_value (float, list) – bond’s value at maturity.
  • coupon_value (float) – amount of money you receive periodically as the bond matures.
  • num_coupons (int, list) – number of coupons before maturity.
  • ytm (float) – yield to maturity.
  • coupon_rate (float, list) – rate of the face value that defines the coupon value.
Returns:

Float or list of floats.

Examples:

>>> bond(face_value=1000, coupon_value=56, num_coupons=10, ytm=5.6) 
1000.0...
>>> bond(face_value=1000, coupon_rate=5.6, num_coupons=10, value=1000) 
5.6...
>>> bond(face_value=[1000, 1200, 1400], coupon_value=56, num_coupons=10, value=1000) 
   Coupon_Rate  Coupon_Value  Face_Value  Num_Coupons  Value      YTM
0     5.600000            56        1000           10   1000  5.60000
1     4.666667            56        1200           10   1000  7.04451
2     4.000000            56        1400           10   1000  8.31956
>>> bond(face_value=1000, coupon_value=[56., 57, 58], num_coupons=10, value=1000) 
   Coupon_Rate  Coupon_Value  Face_Value  Num_Coupons  Value  YTM
0          5.6          56.0        1000           10   1000  5.6
1          5.7          57.0        1000           10   1000  5.7
2          5.8          58.0        1000           10   1000  5.8
>>> bond(face_value=1000, coupon_rate=[5.6, 5.7, 5.8], num_coupons=10, value=1000) 
   Coupon_Rate  Coupon_Value  Face_Value  Num_Coupons  Value  YTM
0          5.6          56.0        1000           10   1000  5.6
1          5.7          57.0        1000           10   1000  5.7
2          5.8          58.0        1000           10   1000  5.8
>>> bond(face_value=1000, coupon_rate=5.6, num_coupons=[10, 20, 30], value=1000) 
   Coupon_Rate  Coupon_Value  Face_Value  Num_Coupons  Value  YTM
0          5.6          56.0        1000           10   1000  5.6
1          5.6          56.0        1000           20   1000  5.6
2          5.6          56.0        1000           30   1000  5.6
>>> bond(face_value=1000, coupon_rate=5.6, num_coupons=10, value=[800, 900, 1000]) 
   Coupon_Rate  Coupon_Value  Face_Value  Num_Coupons  Value       YTM
0          5.6          56.0        1000           10    800  8.671484
1          5.6          56.0        1000           10    900  7.025450
2          5.6          56.0        1000           10   1000  5.600000
>>> bond(face_value=[1000, 1100, 1200], coupon_rate=5.6, num_coupons=10, value=[800, 900, 1000]) 
   Coupon_Rate  Coupon_Value  Face_Value  Num_Coupons  Value        YTM
0     5.600000          56.0        1000           10    800   8.671484
1     5.600000          56.0        1000           10    900   7.025450
2     5.600000          56.0        1000           10   1000   5.600000
3     5.090909          56.0        1100           10    800   9.419301
4     5.090909          56.0        1100           10    900   7.772838
5     5.090909          56.0        1100           10   1000   6.346424
6     4.666667          56.0        1200           10    800  10.119360
7     4.666667          56.0        1200           10    900   8.472129
8     4.666667          56.0        1200           10   1000   7.044510
>>> bond(face_value=[1000, 1100, 1200], coupon_rate=[5.6, 5.7, 5.8], num_coupons=10, value=[800, 900, 1000]) 
    Coupon_Rate  Coupon_Value  Face_Value  Num_Coupons  Value        YTM
0      5.600000          56.0        1000           10    800   8.671484
1      5.600000          56.0        1000           10    900   7.025450
2      5.600000          56.0        1000           10   1000   5.600000
3      5.700000          57.0        1000           10    800   8.787284
4      5.700000          57.0        1000           10    900   7.132508
5      5.700000          57.0        1000           10   1000   5.700000
6      5.800000          58.0        1000           10    800   8.903126
7      5.800000          58.0        1000           10    900   7.239584
8      5.800000          58.0        1000           10   1000   5.800000
9      5.090909          56.0        1100           10    800   9.419301
10     5.090909          56.0        1100           10    900   7.772838
11     5.090909          56.0        1100           10   1000   6.346424
12     5.181818          57.0        1100           10    800   9.531367
13     5.181818          57.0        1100           10    900   7.876353
14     5.181818          57.0        1100           10   1000   6.443037
15     5.272727          58.0        1100           10    800   9.643488
16     5.272727          58.0        1100           10    900   7.979898
17     5.272727          58.0        1100           10   1000   6.539664
18     4.666667          56.0        1200           10    800  10.119360
19     4.666667          56.0        1200           10    900   8.472129
20     4.666667          56.0        1200           10   1000   7.044510
21     4.750000          57.0        1200           10    800  10.228122
22     4.750000          57.0        1200           10    900   8.572512
23     4.750000          57.0        1200           10   1000   7.138133
24     4.833333          58.0        1200           10    800  10.336951
25     4.833333          58.0        1200           10    900   8.672936
26     4.833333          58.0        1200           10   1000   7.231779
>>> bond(face_value=1000, coupon_rate=5.6, num_coupons=10, value=1000, ytm=[5.1, 5.6, 6.1]) 
   Basis_Value        Change  Coupon_Rate  Coupon_Value  Face_Value  \
0         1000  3.842187e+00          5.6          56.0        1000
1         1000  1.136868e-14          5.6          56.0        1000
2         1000 -3.662671e+00          5.6          56.0        1000

   Num_Coupons        Value  YTM
0           10  1038.421866  5.1
1           10  1000.000000  5.6
2           10   963.373290  6.1
>>> bond(face_value=1000, coupon_rate=5.6, num_coupons=10, value=[1000, 1100], ytm=[5.1, 5.6, 6.1]) 
   Basis_Value        Change  Coupon_Rate  Coupon_Value  Face_Value  \
0         1000  3.842187e+00          5.6          56.0        1000
1         1000  1.136868e-14          5.6          56.0        1000
2         1000 -3.662671e+00          5.6          56.0        1000
3         1100 -5.598012e+00          5.6          56.0        1000
4         1100 -9.090909e+00          5.6          56.0        1000
5         1100 -1.242061e+01          5.6          56.0        1000

   Num_Coupons        Value  YTM
0           10  1038.421866  5.1
1           10  1000.000000  5.6
2           10   963.373290  6.1
3           10  1038.421866  5.1
4           10  1000.000000  5.6
5           10   963.373290  6.1

# >>> bond(face_value=1000, coupon_rate=5.6, num_coupons=[20], value=[1000, 1100], ytm=[5.6, 6.1]) # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE # Basis_Value Change Coupon_Rate Coupon_Value Face_Value Num_Coupons # 0 1000 0.000000 5.6 56.0 1000 20 # 1 1000 -5.688693 5.6 56.0 1000 20 # 2 1100 -9.090909 5.6 56.0 1000 20 # 3 1100 -14.262448 5.6 56.0 1000 20 # <BLANKLINE> # Value YTM # 0 1000.000000 5.6 # 1 943.113073 6.1 # 2 1000.000000 5.6 # 3 943.113073 6.1