Before going into details regarding the bootstrapping algorithm, we should explain the difference between yield curve and spot rate curve.
By definition, the yield curve shows several bond yields to maturity across different bond contract lengths, or times to maturity. Yield to maturity is an overall
discount rate which equalizes principal and coupon payments to the initial investment value, assuming reinvestability of all cash flows.
in contrast to the yield curve, a spot rate curve represents spot rates used to discount individual cash flows of the bond.
Hence, a whole range of different spot rates is typically used when equalizing bond's future cash flows to its present value.
\[ \frac{C}{\left(1 + r\right)^1} + \frac{C}{\left(1 + r\right)^2} + ... + \frac{1+C}{\left(1 + r\right)^n}= 100 \]
given the par value is \(100\) and coupon rate \(C\)
Starting from the annual coupon bond which matures in one year, we will gradually derive all spot rates by forward substitution of the previously calculated ones.
Choice of market instruments to construct the yield curve
There are various ways to construct a market consistent yield curve piecewise construction given a mixture of market instruments (i.e.deposit rates, FRA/Future rates, swap rates).
For example, deposit rates can be used for maturities up to 1 year. Forward Rate Agreements can be used for the construction of the yield curve between 1 and 2 years.
Swap rates can be used for the residual maturities. The final result is a single curve which is consistent with all quotes.
Here is wiki link for more details.
Given the following bond instruments with the trade date 2021-05-06
bond type | face value | interest periodicity | settlement days | maturity | coupon rate | price |
---|---|---|---|---|---|---|
zero_coupon | 100 | 0D | 0 | 3M | 0 | 97.5 |
zero_coupon | 100 | 0D | 0 | 6M | 0 | 94.9 |
zero_coupon | 100 | 0D | 0 | 1Y | 0 | 90.0 |
fixed_rate | 100 | 6M | 0 | 1Y6M | 0.08 | 96.0 |
fixed_rate | 100 | 6M | 0 | 2Y | 0.12 | 101.6 |
When the bootstrapping method is used to build the zero curve "curveName"
Then the computed zero-coupons by maturity date should be
maturity date | zero coupon |
---|---|
2021-08-06 | 0.10127123 |
2021-11-06 | 0.10469296 |
2022-05-06 | 0.10536052 |
2022-11-06 | 0.10680926 |
2023-05-06 | 0.10808028 |
Given the following deposit instruments with the trade date 2021-05-06
instrument name | currency code | settlement days | maturity | rate |
---|---|---|---|---|
Deposit1D | EUR | 0 | 1D | 0.0440 |
Deposit1M | EUR | 0 | 1M | 0.0450 |
Deposit2M | EUR | 0 | 2M | 0.0460 |
Deposit3M | EUR | 0 | 3M | 0.0470 |
Deposit6M | EUR | 0 | 6M | 0.0490 |
Deposit9M | EUR | 0 | 9M | 0.0500 |
Deposit1Y | EUR | 0 | 1Y | 0.0520 |
When the bootstrapping method is used to build the zero curve "curveName"
Then the computed zero-coupons by maturity date should be
maturity date | zero coupon |
---|---|
2021-05-07 | 0.04399731 |
2021-06-06 | 0.04641014 |
2021-07-06 | 0.04658535 |
2021-08-06 | 0.0477582 |
2021-11-06 | 0.04947194 |
2022-02-06 | 0.05015582 |
2022-05-06 | 0.0513794 |
Given the following deposit instruments with the trade date 2021-05-06
instrument name | rate |
---|---|
Eonia | 0.0440 |
Euribor1M | 0.0450 |
Euribor2M | 0.0460 |
Euribor3M | 0.0470 |
Euribor6M | 0.0490 |
Euribor9M | 0.0500 |
Euribor1Y | 0.0520 |
When the bootstrapping method is used to build the zero curve "curveName"
Then the computed zero-coupons by maturity date with "Actual360" as day count convention and "Simple" compounding should be
maturity date | zero coupon |
---|---|
2021-05-07 | 0.0440 |
2021-06-10 | 0.0450 |
2021-07-12 | 0.0460 |
2021-08-10 | 0.0470 |
2021-11-10 | 0.0490 |
2022-02-10 | 0.0500 |
2022-05-10 | 0.0520 |
Given the following swap instruments with the trade date 2021-05-06
currency code | maturity | rate | interest periodicity | fixed_leg.day_count_convention | floating_leg.index_name |
---|---|---|---|---|---|
EUR | 1Y | 0.003467 | 6M | Actual360 | Euribor6M |
EUR | 1Y6M | 0.003525 | 6M | Actual360 | Euribor6M |
EUR | 2Y | 0.003641 | 6M | Actual360 | Euribor6M |
EUR | 3Y | 0.003797 | 6M | Actual360 | Euribor6M |
EUR | 4Y | 0.00496 | 6M | Actual360 | Euribor6M |
EUR | 5Y | 0.006447 | 6M | Actual360 | Euribor6M |
EUR | 6Y | 0.008495 | 6M | Actual360 | Euribor6M |
EUR | 7Y | 0.010673 | 6M | Actual360 | Euribor6M |
EUR | 8Y | 0.012675 | 6M | Actual360 | Euribor6M |
EUR | 9Y | 0.014505 | 6M | Actual360 | Euribor6M |
EUR | 10Y | 0.016177 | 6M | Actual360 | Euribor6M |
When the bootstrapping method is used to build the zero curve "curveName"
Then the computed zero-coupons by maturity date with "Actual360" as day count convention and "Continuous" compounding should be
maturity date | zero coupon |
---|---|
2022-05-10 | 0.003464 |
2022-11-10 | 0.003522 |
2023-05-10 | 0.003638 |
2024-05-10 | 0.003794 |
2025-05-12 | 0.004953 |
2026-05-11 | 0.006457 |
2027-05-10 | 0.008547 |
2028-05-10 | 0.0108 |
2029-05-10 | 0.01289 |
2030-05-10 | 0.01482 |
2031-05-12 | 0.01661 |
Given the following fra instruments with the trade date 2021-05-06
day count convention | months to start | months to end | rate | calendar | business day convention | end of month |
---|---|---|---|---|---|---|
Actual360 | 1 | 4 | 0.0300 | Target | ModifiedFollowing | false |
Actual360 | 2 | 5 | 0.0310 | Target | ModifiedFollowing | false |
Actual360 | 3 | 6 | 0.0320 | Target | ModifiedFollowing | false |
Actual360 | 6 | 9 | 0.0330 | Target | ModifiedFollowing | false |
Actual360 | 9 | 12 | 0.0340 | Target | ModifiedFollowing | false |
When the bootstrapping method is used to build the zero curve "curveName"
Then the computed zero-coupons by maturity date with "Actual360" as day count convention and "Continuous" compounding should be
maturity date | zero coupon |
---|---|
2021-09-10 | 0.02989 |
2021-10-12 | 0.03046 |
2021-11-10 | 0.03086 |
2022-02-10 | 0.03152 |
2022-05-10 | 0.03209 |
Given the following deposit instruments with the trade date 2021-05-06
instrument name | rate |
---|---|
Euribor1M | 0.0450 |
Euribor2M | 0.0460 |
And the following bond instruments
bond type | face value | interest periodicity | settlement days | maturity | coupon rate | price |
---|---|---|---|---|---|---|
zero_coupon | 100 | 0D | 0 | 3M | 0 | 97.5 |
zero_coupon | 100 | 0D | 0 | 6M | 0 | 94.9 |
zero_coupon | 100 | 0D | 0 | 1Y | 0 | 90.0 |
fixed_rate | 100 | 6M | 0 | 1Y6M | 0.08 | 96.0 |
fixed_rate | 100 | 6M | 0 | 2Y | 0.12 | 101.6 |
When the bootstrapping method is used to build the zero curve "curveName"
Then the computed zero-coupons by maturity date with "Actual360" as day count convention and "Continuous" compounding should be
maturity date | zero coupon |
---|---|
2021-06-10 | 0.04492 |
2021-07-12 | 0.04577 |
2021-08-06 | 0.09907 |
2021-11-06 | 0.1025 |
2022-05-06 | 0.104 |
2022-11-06 | 0.1051 |
2023-05-06 | 0.1066 |
Given the following deposit instruments with the trade date 2021-05-06
instrument name | rate |
---|---|
Eonia | 0.0030 |
Euribor1M | 0.0031 |
Euribor2M | 0.0032 |
Euribor3M | 0.0033 |
Euribor6M | 0.0034 |
Euribor9M | 0.0035 |
Euribor1Y | 0.0036 |
And the following fra instruments
day count convention | months to start | months to end | rate | calendar | business day convention | end of month |
---|---|---|---|---|---|---|
Actual360 | 12 | 15 | 0.0040 | Target | ModifiedFollowing | false |
Actual360 | 13 | 16 | 0.0041 | Target | ModifiedFollowing | false |
Actual360 | 14 | 17 | 0.0042 | Target | ModifiedFollowing | false |
Actual360 | 17 | 20 | 0.0043 | Target | ModifiedFollowing | false |
Actual360 | 20 | 23 | 0.0044 | Target | ModifiedFollowing | false |
And the following swap instruments
currency code | maturity | rate | interest periodicity | fixed_leg.day_count_convention | floating_leg.index_name |
---|---|---|---|---|---|
EUR | 2Y | 0.0050 | 6M | Actual360 | Euribor6M |
EUR | 2Y6M | 0.0051 | 6M | Actual360 | Euribor6M |
EUR | 3Y | 0.0052 | 6M | Actual360 | Euribor6M |
EUR | 4Y | 0.0053 | 6M | Actual360 | Euribor6M |
EUR | 5Y | 0.0054 | 6M | Actual360 | Euribor6M |
EUR | 6Y | 0.0055 | 6M | Actual360 | Euribor6M |
EUR | 7Y | 0.0056 | 6M | Actual360 | Euribor6M |
EUR | 8Y | 0.0057 | 6M | Actual360 | Euribor6M |
EUR | 9Y | 0.0058 | 6M | Actual360 | Euribor6M |
EUR | 10Y | 0.0059 | 6M | Actual360 | Euribor6M |
When the bootstrapping method is used to build the zero curve "curveName"
Then the computed zero-coupons by maturity date with "Actual360" as day count convention and "Continuous" compounding should be
maturity date | zero coupon |
---|---|
2021-05-07 | 0.003000 |
2021-06-10 | 0.003089 |
2021-07-12 | 0.003188 |
2021-08-10 | 0.003286 |
2021-11-10 | 0.003389 |
2022-02-10 | 0.003488 |
2022-05-10 | 0.003587 |
2022-08-10 | 0.003669 |
2022-09-12 | 0.003707 |
2022-10-11 | 0.003740 |
2023-01-10 | 0.003823 |
2023-04-11 | 0.003897 |
2023-05-10 | 0.004988 |
2023-11-10 | 0.005089 |
2024-05-10 | 0.005190 |
2025-05-12 | 0.005284 |
2026-05-11 | 0.005389 |
2027-05-10 | 0.005493 |
2028-05-10 | 0.005594 |
2029-05-10 | 0.005696 |
2030-05-10 | 0.005798 |
2031-05-12 | 0.005896 |
Number of Scenarios | 7 | Total Duration | 304ms |
Total Number of Test Cases | 7 | Fastest Test | 24ms |
Number of Manual Test Cases | 0 | Slowest Test | 91ms |
Tests Started | Apr 11, 2023 10:42:17 | Average Execution Time | 38ms |
Tests Finished | Apr 11, 2023 10:42:18 | Total Execution Time | 271ms |
feature | Scenario | Context | Steps | Started | Total Duration | Result |
---|---|---|---|---|---|---|
Bootstrapping yield curve | Yield curve construction with bonds without calendar | 3 | 10:42:17 | 091ms | ||
Bootstrapping yield curve | Yield curve construction with deposits without calendar | 3 | 10:42:17 | 027ms | ||
Bootstrapping yield curve | Yield curve construction with Eonia and Euribor | 3 | 10:42:17 | 029ms | ||
Bootstrapping yield curve | Yield curve construction with swaps | 3 | 10:42:17 | 034ms | ||
Bootstrapping yield curve | Yield curve construction with Forward Rate Agreements | 3 | 10:42:17 | 026ms | ||
Bootstrapping yield curve | Yield curve construction with deposit and bond instruments | 4 | 10:42:18 | 024ms | ||
Bootstrapping yield curve | Yield curve construction with euribor and fra and swap instruments | 5 | 10:42:18 | 040ms |
Scenario | Title | Details |
---|---|---|
Yield curve construction with bonds without calendar | Calculation details | Download Evidence |
Yield curve construction with deposits without calendar | Calculation details | Download Evidence |
Yield curve construction with Eonia and Euribor | Calculation details | Download Evidence |
Yield curve construction with swaps | Calculation details | Download Evidence |
Yield curve construction with Forward Rate Agreements | Calculation details | Download Evidence |
Yield curve construction with euribor and fra and swap instruments | Calculation details | Download Evidence |