Copyright © 2021 ARC, All rights reserved
Symbol | Comment |
---|---|
tr | Time to maturity |
t | Time to maturity (interpolated) |
yr | Yield to maturity |
y | Yield to maturity (interpolated) |
s | Bootstrapped spot rate |
We're going to construct in detail a zero-coupon yield curve, called zero curve as well, with swaps by using bootstrapping method.
maturity | interest periodicity | coupon rate | fixed_leg.day_count_convention | floating_leg.index_name | |
---|---|---|---|---|---|
0 | 1Y | 6M | 0.003467 | Actual360 | Euribor6M |
1 | 1Y6M | 6M | 0.003525 | Actual360 | Euribor6M |
2 | 2Y | 6M | 0.003641 | Actual360 | Euribor6M |
3 | 3Y | 6M | 0.003797 | Actual360 | Euribor6M |
4 | 4Y | 6M | 0.004960 | Actual360 | Euribor6M |
5 | 5Y | 6M | 0.006447 | Actual360 | Euribor6M |
6 | 6Y | 6M | 0.008495 | Actual360 | Euribor6M |
7 | 7Y | 6M | 0.010673 | Actual360 | Euribor6M |
8 | 8Y | 6M | 0.012675 | Actual360 | Euribor6M |
9 | 9Y | 6M | 0.014505 | Actual360 | Euribor6M |
10 | 10Y | 6M | 0.016177 | Actual360 | Euribor6M |
The long end of the swap curve out to ten years is derived directly from observable coupon swap rates. These are plain vanilla interest rate swaps with fixed rates exchanged for floating interest rates. The fixed swap rates are quoted as par rates and are usually compounded semi-annually. The swap rates observed at the long end of the curve are for the 5Y, 7Y, and 10Y tenors. We therefore have to fill in the swap rates for tenors that we do not have and also the rates at the semi-annual terms. This is done by simple linear interpolation or by cubic spline interpolation if preferred. As we progress recursively along the long end of the swap curve interpolating the swap rates to be filled in, at the same time we apply the bootstrap method to derive zero-coupon interest rates from the swap par rates. Starting from the first swap rate, given all the continuously compounded zero rates for the coupon cash flows prior to maturity, the continuously compounded zero rate for the term of the swap is bootstrapped as follows:
\begin{equation}zero\_rate\left (T \right) = -\frac{log\left(\frac{\left(100 - \sum_{i=m}^{T-m}\left(c/m \times e^{-r_i \times t_i}\right)\right)}{\left( 100 + c/m\right)}\right)}{T}\end{equation}where:
$zero\_rate(T)$: the bootstrapped continuously compounded zero rate for time T
$m$: the swap payment frequency per annum expressed in the day count convention of that Swap, semi-annual in our examples
$c$: the coupon per annum, which is equal to the observed swap rate times the swap notional. The coupon payment is therefore $c/m$
$r_i$: represents the continuously compounded zero rate for time $t_i$
Let's note that all our computations on float numbers will be done with 6 decimal points precision.
The first swap, with 1 year maturity and semi-annual interest payment frequency, has two fixed coupons paying a 0.3467% rate: one at 6M and the one at its maturity (1Y). First let's compute the related maturity dates by using the TARGET calendar (Trans-European Automated Real-time Gross settlement Express Transfer). See ECB LINK for details.
As we mentioned above the trade date is
2021-05-06
As we know the settlement day of a Swap is 2, so the settlement date is obtained by adding 2 days to the above trade date:
Saturday, 08 May 2021
Because the weekday is Saturday and the business date convention for the Swap is by default Following, so by applying the TARGER calendar, the settlement date is
Monday, 10 May 2021
Finally, the related maturity dates for 6M and 1Y are obtained by adding 6M adn 1Y to the above settlement date:
Wednesday, 10 Nov 2021
Tuesday, 10 May 2022
To sum up, that Swap has two fixed coupons paying a 0.3467% rate: one starting from May 10th 2021 and ending at November 10th 2021, and the other starting from November 10th 2021 and ending at May 10th 2022.
Let's compute the related swap coupons at 6M and 1Y (in the other words, we want to compute the rapport $c/m$ of the equation (1))
For the first coupon starting from May 10th 2021 and ending at November 10th 2021; it last 184 days, and since the swap specifies Actual/360 convetnion, so the accrual time will be 184/360
0.511111
So the coupon at 6M will be the multiplication of the rate 0.3467% by the above accrual time:
0.001772
For the second coupon starting from November 10th 2021 and ending at May 10th 2022; it last 181 days, and since the swap specifies Actual/360 convetnion, so the accrual time will be 181/360
0.502778
So the coupon at 1Y will be the multiplication of the rate 0.3467% by the above accrual time:
0.001743
The last variable ramaining to compute in the equation (1) is the accrual time $T$ between the settlement date (May 10th 2021) and the maturity date (May 10th 2022); It last 365 days, since the applied convention is Actual/360, so $T$ will be 365/360
1.013889
Righ now, it's easy to get the zero-coupon from the equation (1) by replacing each variable by its value:
$$ zero\_rate(1Y) = \frac{-log\left (\frac{1 - 0.001772 * exp(-0.003467*0.5111)}{1 + 0.001743} \right)}{1.01388} $$0.003464
The second swap, with 1 year and 6 motns maturity and semi-annual interest payment frequency, has three fixed coupons paying a 0.3525% rate: one at 6M, the one at 1Y and the last one at its maturity (1Y6M). First let's compute the related maturity dates by using the TARGET calendar.
We've already computed the related dates to the maturities 6M and 1Y in the paragraph 3.1 and we've obtained 2022-05-10 and 2022-05-10 respectively. The maturity date related to the maturity 1Y6M will be computed in the same way by adding 1Y6M to the aboove settlement date and wiil be
Thursday, 10 Nov 2022
To sum up, this Swap has three fixed coupons paying a 0.3525% rate: one starting from May 10th 2021 and ending at November 10th 2021, and the second starting from November 10th 2021 and ending at May 10th 2022, and the last one starting from May 10th 2022 and ending at November 11th 2022.
Let's compute the realted swap coupons at 6M , 1Y and 1Y6M (in the other words, we want to compute the rapport $c/m$ of the equation (1)). To do that, we will proceed as in the paragraph 3.1 and the coupons will be 0.3525%184/360, 0.3525%181/360 and 0.3525%*184/360; So the coupons are respectively:
0.001802
0.001772
0.001802
Righ now, we compute the accrual time $T$ between the settlement date (May 10th 2021) and the maturity date (Novembre 11th 2022); It last 549 days, since the applied convention is Actual/360, so $T$ will be 549/360
1.525000
Finally, we compute the zero-coupon from the equation (1) by replacing each variable by its value:
$$ zero\_rate(1Y) = \frac{-log\left (\frac{1 - 0.001801 * exp(-0.003467*0.5111) - 0.001772 * exp(-0.003463*1.01388)}{1 + 0.001801} \right)}{1.525} $$0.003522
The third swap, with 2 years maturity and semi-annual interest payment frequency, has four fixed coupons paying a 0.3641% rate: the first at 6M, the second at 1Y, the third at 1Y6M and the last one at its maturity (2Y). As in the previous computations, the related maturity dates will be:
Wednesday, 10 Nov 2021
Tuesday, 10 May 2022
Thursday, 10 Nov 2022
Wednesday, 10 May 2023
As in the previous computations done in the previous paragraphs, the swaps coupons will be respectively
The swap coupon at 6M is 0.001861
The swap coupon at 1Y is 0.001831
The swap coupon at 1Y6M is 0.001861
The swap coupon at 2Y is 0.001831
Righ now, we compute the different accrual times $t\_6m$, $t\_1y$, $t\_1y6m$, $T$ of the equation (1) by applying the specified Actual/360 convention.
The $t\_6m$, $t\_1y$, $t\_1y6m$ are already computed in the last paragraghs and their values are respectively 0.5111111111111111, 1.0138888888888888 and 1.525. The only accrual time time to compte is T between the settlement date(May 10th 2021) and the maturity date (May 1Oth 2023); It last 549 days, so 𝑇 will be 730/360
2.027778
Finally, we compute the zero-coupon from the equation (1) by replacing each variable by its value:
zc_2y = -math.log((1-c_6m*math.exp(-zc_6m*t_6m)-c_1y*math.exp(-zc_1y*t_1y)-c_1y6m*math.exp(-zc_1y6m*t_1y6m))/(1+c_2y))/T
print(format(zc_2y, precision))
0.003638
The fourth swap, with 3 years maturity and semi-annual interest payment frequency, has six fixed coupons paying a 0.3797% rate: the first at 6M, the second at 1Y, the third at 1Y6M, the fourth at 2Y, the fifth at 2Y6M and the last one at its maturity (3Y). As in the previous computations, the related maturity dates will be:
Wednesday, 10 Nov 2021
Tuesday, 10 May 2022
Thursday, 10 Nov 2022
Wednesday, 10 May 2023
Friday, 10 Nov 2023
Friday, 10 May 2024
As in the previous computations done in the previous paragraphs, the swaps coupons will be respectively
The swap coupon at 6M is 0.001941
The swap coupon at 1Y is 0.001909
The swap coupon at 1Y6M is 0.001941
The swap coupon at 2Y is 0.001909
The swap coupon at 2Y6M is 0.001941
The swap coupon at 3Y is 0.001920
Righ now, we compute the different accrual times $t\_6m$, $t\_1y$, $t\_1y6m$, $t\_2y$,$t\_2y6m$, $T$ of the equation (1) by applying the specified Actual/360 convention.
The $t\_6m$, $t\_1y$, $t\_1y6m$, $t\_2y$ are already computed in the last paragraghs and their values are respectively 0.5111111111111111, 1.0138888888888888, 1.525 and 2.0277777777777777. The only accrual times to compte are t_2y6m and T between the settlement date(May 10th 2021) and the maturity date (May 1Oth 2023); It last 549 days, so 𝑇 will be 730/360
The only accrual time t_2y6m, between the settlement date(May 10th 2021) and the maturity date (Nov 1Oth 2023), last 914 days, so t_2y6m will be 914/360
2.538889
The only accrual time T, between the settlement date(May 10th 2021) and the maturity date (May 1Oth 2024), last 1096 days, so T will be 1096/360
3.044444
Finally, we compute the zero-coupon from the equation (1) by replacing each variable by its value; Let's note that the zero coupon for the maturity 2y6m will be suppose equal to the zero coupon for the maturity 2y.
0.003794
The fifth swap, with 4 years maturity and semi-annual interest payment frequency, has eight fixed coupons paying a 0.4967% rate: the first at 6M, the second at 1Y, the third at 1Y6M, the fourth at 2Y, the fifth at 2Y6M, the sixth at 3Y, the seventh at 3Y6M and the last one at its maturity (4Y). As in the previous computations, the related maturity dates will be:
Wednesday, 10 Nov 2021
Tuesday, 10 May 2022
Thursday, 10 Nov 2022
Wednesday, 10 May 2023
Friday, 10 Nov 2023
Friday, 10 May 2024
Sunday, 10 Nov 2024
As we ca notice, the weekday of the previous date is Sunday, so we should use the TARGET calendar and applying the Following business rule such as this maturity date will be
Monday, 11 Nov 2024
Saturday, 10 May 2025
Again, the weekday of the previous date is Sunday, so we should use the TARGET calendar and applying the Following business rule such as this maturity date will be
Monday, 12 May 2025
As in the previous computations done in the previous paragraphs, the swaps coupons will be respectively
The swap coupon at 6M is 0.002535
The swap coupon at 1Y is 0.002494
The swap coupon at 1Y6M is 0.002535
The swap coupon at 2Y is 0.002494
The swap coupon at 2Y6M is 0.002535
The swap coupon at 3Y is 0.002508
The swap coupon at 3Y6M is 0.002549
The swap coupon at 4Y is 0.002508
Righ now, we compute the different accrual times $t\_6m$, $t\_1y$, $t\_1y6m$, $t\_2y$,$t\_2y6m$, $t\_3y$, $t\_3y6m$, $T$ of the equation (1) by applying the specified Actual/360 convention.
The $t\_6m$, $t\_1y$, $t\_1y6m$, $t\_2y$, $t\_2y6m$, $t\_3y$ are already computed in the last paragraghs. The only accrual times to compte are $t\_3y6m$ and T between the settlement date(May 10th 2021) and the maturity date (May 1Oth 2023); It last 549 days, so 𝑇 will be 730/360
The accrual time t_3y6m, between the settlement date(May 10th 2021) and the maturity date (Nov 11th 2024), last 914 days, so t_2y6m will be 1281/360
3.558333
The accrual time T, between the settlement date(May 10th 2021) and the maturity date (May 12th 2025), last 1096 days, so T will be 1463/360
4.063889
Finally, we compute the zero-coupon from the equation (1) by replacing each variable by its value; Let's note that the zero coupon for the maturity 3y6m will be suppose equal to the zero coupon for the maturity 3y.
zc_4y = -math.log((1-c_6m*math.exp(-zc_6m*t_6m)-c_1y*math.exp(-zc_1y*t_1y)-c_1y6m*math.exp(-zc_1y6m*t_1y6m)-c_2y*math.exp(-zc_2y*t_2y)-c_2y6m*math.exp(-zc_2y6m*t_2y6m)-c_3y*math.exp(-zc_3y*t_3y)-c_3y6m*math.exp(-zc_3y6m*t_3y6m))/(1+c_4y))/T
print(format(zc_4y, precision))
0.004965
The zero-coupons computation for the rest of the other maturities will be done by using exactly the same reasoning as previously. We will get the above values. As previously think to adjust each computed maturity date to a business day if needed.
(maturity date, zero coupon) = (2026-05-11, 0.006463)
(maturity date, zero coupon) = (2027-05-10, 0.008555)
(maturity date, zero coupon) = (2028-05-10, 0.010802)
(maturity date, zero coupon) = (2029-05-10, 0.012894)
(maturity date, zero coupon) = (2030-05-10, 0.014833)
(maturity date, zero coupon) = (2031-05-12, 0.016621)
let's sum up in the following table the computed zero-coupons by maturity with 30/360 day count convention and Continuous compounding.
maturity date | zero coupon | |
---|---|---|
0 | 2022-05-10 | 0.003464 |
1 | 2022-11-10 | 0.003522 |
2 | 2023-05-10 | 0.003638 |
3 | 2024-05-10 | 0.003794 |
4 | 2025-05-12 | 0.004965 |
5 | 2026-05-11 | 0.006463 |
6 | 2027-05-10 | 0.008555 |
7 | 2028-05-10 | 0.010802 |
8 | 2029-05-10 | 0.012894 |
9 | 2030-05-10 | 0.014833 |
10 | 2031-05-12 | 0.016621 |
Here is the final table
maturity | interest periodicity | coupon rate | fixed_leg.day_count_convention | floating_leg.index_name | maturity date | zero coupon | |
---|---|---|---|---|---|---|---|
0 | 1Y | 6M | 0.003467 | Actual360 | Euribor6M | 2022-05-10 | 0.003464 |
1 | 1Y6M | 6M | 0.003525 | Actual360 | Euribor6M | 2022-11-10 | 0.003522 |
2 | 2Y | 6M | 0.003641 | Actual360 | Euribor6M | 2023-05-10 | 0.003638 |
3 | 3Y | 6M | 0.003797 | Actual360 | Euribor6M | 2024-05-10 | 0.003794 |
4 | 4Y | 6M | 0.004960 | Actual360 | Euribor6M | 2025-05-12 | 0.004965 |
5 | 5Y | 6M | 0.006447 | Actual360 | Euribor6M | 2026-05-11 | 0.006463 |
6 | 6Y | 6M | 0.008495 | Actual360 | Euribor6M | 2027-05-10 | 0.008555 |
7 | 7Y | 6M | 0.010673 | Actual360 | Euribor6M | 2028-05-10 | 0.010802 |
8 | 8Y | 6M | 0.012675 | Actual360 | Euribor6M | 2029-05-10 | 0.012894 |
9 | 9Y | 6M | 0.014505 | Actual360 | Euribor6M | 2030-05-10 | 0.014833 |
10 | 10Y | 6M | 0.016177 | Actual360 | Euribor6M | 2031-05-12 | 0.016621 |
<AxesSubplot:xlabel='maturity date'>