Example of the stationary bootstrap algorithm in practice#
[1]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib notebook
Goal#
The goal of this workbook is to demonstrate the use of the stationary bootstrap algorithm. In this example, 3 new samples are generated.
[2]:
nSample = 3 # Number of generated samples
EURO denominated 6M interest-rate-swap rate obtained from https://www.teleborsa.it/Quotazioni/Tassi/Eurirs for date 12/11/2021 and interpolated using the Smith & Wilson algorithm for missing durations.
[3]:
swap = pd.DataFrame({'Swap rate': [-0.00497999999999998,
-0.00336999999999998,
-0.00219000000000003,
-0.00137999999999994,
-0.000839999999999952,
-0.000349999999999961,
0.000140000000000029,
0.000669999999999948,
0.00116999999999989,
0.00165999999999999,
0.00208999999999993,
0.00245999999999991,
0.00277690952371801,
0.00303541131903184,
0.00323000000000007,
0.00336225372994803,
0.00345212702349018,
0.00351682745133952,
0.00356726077755898,
0.00360999999999989,
0.00364393467821089,
0.00365001038370538,
0.00360991273768496,
0.00350996855727703,
0.00333999999999990,
0.00310968998405592,
0.00288888447388769,
0.00274107227669318,
0.00271077735186531,
0.00283000000000011]})
[4]:
swap.head()
[4]:
Swap rate | |
---|---|
0 | -0.00498 |
1 | -0.00337 |
2 | -0.00219 |
3 | -0.00138 |
4 | -0.00084 |
[5]:
sampleLen = swap.size; # Length of the sample will be the same as the input.
The swap rates cann ot be stacked in a sampling algorithm therefore, they are used to Vector with the 1-year forward curve. Convert rates into 1-year forward curve
Note that you loose 1 degree of freedom when converting from rates to 1-year-forward rates using the formula
[6]:
forwards = np.zeros((sampleLen-1,1))
[7]:
for iTime in range(0,sampleLen-1):
forwards[iTime][0] = np.power(1 + swap["Swap rate"][iTime+1],iTime+1) / np.power(1+swap["Swap rate"][iTime], iTime) - 1
[8]:
forwards = pd.DataFrame(forwards, columns={'Forward rate'})
[9]:
forwards.head()
[9]:
Forward rate | |
---|---|
0 | -0.003370 |
1 | -0.001009 |
2 | 0.000242 |
3 | 0.000782 |
4 | 0.001612 |
Calculated using the method presented in 2004 paper by Politis & White.
[10]:
m = 3.8299
Generate Stationary bootstraped samples
In this step, the samples are generated by repeatedly calling th StationaryBootstrap function. These samples are then saved into the Samples array
[11]:
from StationaryBootstrap import StationaryBootstrap
for iSample in range(0, nSample):
if iSample == 0:
Samples = np.array(StationaryBootstrap(forwards.values,m,sampleLen))
else:
Samples = np.append(Samples, np.array(StationaryBootstrap(forwards.values,m,sampleLen)),axis=1)
[12]:
Samples = pd.DataFrame(Samples)
Samples.head()
[12]:
0 | 1 | 2 | |
---|---|---|---|
0 | 0.002768 | 0.006270 | -0.000561 |
1 | -0.002402 | 0.006143 | -0.002402 |
2 | 0.006270 | 0.005763 | -0.002615 |
3 | -0.001009 | 0.005216 | -0.001094 |
4 | 0.004553 | 0.004801 | 0.004380 |
[13]:
plot_data = Samples.copy().to_numpy()
fig, ax = plt.subplots(figsize=(10, 3))
ax.plot(plot_data)
ax.set_title('Forward rate samples')
fig.tight_layout()