Skip to content

Commit 36ed88d

Browse files
committed
Add how to use section
1 parent a21b773 commit 36ed88d

File tree

3 files changed

+71
-16
lines changed

3 files changed

+71
-16
lines changed

README.md

Lines changed: 67 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,83 @@
11
# README
22
## Overview
3-
This Python package provides an implementation of the Smith-Wilson yield curve fitting algorithm for interpolations and extrapolations of zero-coupon bond rates. This algorithm is used for the extrapolation of [EIOPA risk-free term structures](https://eiopa.europa.eu/Publications/Standards/Technical%20Documentation%20(31%20Jan%202018).pdf) in the Solvency II framework. Details are available in the Technical Paper [QIS 5 Risk-free interest rates](https://eiopa.europa.eu/Publications/QIS/ceiops-paper-extrapolation-risk-free-rates_en-20100802.pdf). Examples of extrapolated yield curves including the parameters applied can be found [here](https://eiopa.europa.eu/Publications/Standards/EIOPA_RFR_20190531.zip).
3+
This Python package implements the Smith-Wilson yield curve fitting algorithm. It allows for interpolations and extrapolations of zero-coupon bond rates. This algorithm is used for the extrapolation of [EIOPA risk-free term structures](https://eiopa.europa.eu/Publications/Standards/Technical%20Documentation%20(31%20Jan%202018).pdf) in the Solvency II framework. Details are available in the Technical Paper [QIS 5 Risk-free interest rates](https://eiopa.europa.eu/Publications/QIS/ceiops-paper-extrapolation-risk-free-rates_en-20100802.pdf). Examples of extrapolated yield curves including the parameters applied can be found [here](https://eiopa.europa.eu/Publications/Standards/EIOPA_RFR_20190531.zip).
44
<br /><br />
55

6-
## Implementation
7-
The algorithm has been implemented in vectorized form with numpy. This should guarantee good performance. All functions are in [core.py](https://github.com/simicd/smith-wilson-py/blob/master/smithwilson/core.py).
6+
## How to use the package
7+
1. To use the Smith-Wilson fitting algorithm, first import the Python package and specify the inputs. In the example below the inputs are zero-coupon rates with annual frequency up until year 25. The UFR is 2.9% and the convergence parameter alpha is 0.128562. The `terms` list defines the list of maturities, in this case `[1.0, 2.0, 3.0, ..., 25.0]`
8+
```py
9+
import smithwilson as sw
10+
11+
# Input - Switzerland EIOPA spot rates with LLP of 25 years
12+
# Source: https://eiopa.europa.eu/Publications/Standards/EIOPA_RFR_20190531.zip
13+
# EIOPA_RFR_20190531_Term_Structures.xlsx; Tab: RFR_spot_no_VA
14+
rates = [-0.00803, -0.00814, -0.00778, -0.00725, -0.00652,
15+
-0.00565, -0.0048, -0.00391, -0.00313, -0.00214,
16+
-0.0014, -0.00067, -0.00008, 0.00051, 0.00108,
17+
0.00157, 0.00197, 0.00228, 0.0025, 0.00264,
18+
0.00271, 0.00274, 0.0028, 0.00291, 0.00309]
19+
terms = [float(y + 1) for y in range(len(rates))] # [1.0, 2.0, ..., 25.0]
20+
ufr = 0.029
21+
alpha = 0.128562
22+
23+
```
24+
25+
1. Specify the targeted output maturities. This is the set of terms you want to get rates fitted by Smith-Wilson.
26+
Expand the set of rates beyond the Last Liquid Point (e.g. extrapolate to 150 years with annual frequency):
27+
```py
28+
# Extrapolate to 150 years
29+
terms_target = [float(y + 1) for y in range(150)] # [1.0, 2.0, ..., 150.0]
30+
```
31+
32+
Alternatively, you can retrieve a different frequency (e.g. interpolate quarterly instead of annual):
33+
```py
34+
# Interpolate to quarterly granularity
35+
terms_target = [float(y + 1) / 4 for y in range(25*4)] # [0.25, 0.5, ..., 25.0]
36+
```
37+
38+
A combination of interpolation & extrapolation is possible, too. Same for sets of arbitrary maturities:
39+
```py
40+
# Get rates for a well-specified set of maturities only
41+
terms_target = [0.25, 0.5, 1.0, 2.0, 5.0, 10.0, 20.0, 50.0, 100.0]
42+
```
43+
44+
1. Call the Smiwth-Wilson fitting algorithm. This returns the rates as numpy vector with each element corresponding to the maturity in `terms_target`
45+
```py
46+
# Calculate fitted rates based on actual observations and two parametes alpha & UFR
47+
rates_ext = sw.fit_smithwilson_rates(rates_obs=rates, t_obs=terms,
48+
t_target=terms_target, alpha=alpha, ufr=ufr)
49+
```
50+
51+
1. To display the results and/or processing them it can be useful to turn them into a table, here using the pandas library:
52+
```py
53+
import pandas as pd
54+
55+
# Create dictionary with maturity as key and rate as value
56+
observed = dict(zip(terms, rates))
57+
extrapolated = dict(zip(terms_target, rates_ext.flatten()))
58+
# Create and print dataframe
59+
print(pd.DataFrame({"Observed": observed, "Extrapolated": extrapolated}))
60+
```
61+
62+
A complete example can be found in [main.py](https://github.com/simicd/smith-wilson-py/blob/master/main.py)
63+
<br /><br />
64+
65+
## Algorithm
66+
The algorithm is fully vectorized and uses numpy, making it very performant. All functions are in [core.py](https://github.com/simicd/smith-wilson-py/blob/master/smithwilson/core.py).
867

968
The function `fit_smithwilson_rates()` expects following parameters:
10-
- Observed rates
69+
- Observed rates
1170
- Observed maturities
1271
- Target maturities
13-
- Convergence parameter alpha
72+
- Convergence parameter alpha
1473
- Ultimate forward rate (UFR)
1574

16-
The observed rates and maturities are assumed to be before the Last LiquidPoint (LLP). The targeted maturity vector can
17-
contain both, more granular maturity structure (interpolation) or terms after the LLP (extrapolation).
75+
The observed rates and maturities are assumed to be before the Last Liquid Point (LLP). The targeted maturity vector can
76+
contain any set of maturities (e.g. more granular maturity structure (interpolation) or terms after the LLP (extrapolation)).
1877
<br /><br />
1978

2079

21-
The fitting algorithm of the Smith-Wilson method calculates first the Wilson-matrix (EIOPA, 2010, p. 16):
80+
The Smith-Wilson fitting algorithm calculates first the Wilson-matrix (EIOPA, 2010, p. 16):
2281

2382
`W = e^(-UFR * (t1 + t2)) * (α * min(t1, t2) - 0.5 * e^(-α * max(t1, t2))
2483
* (e^(α * min(t1, t2)) - e^(-α * min(t1, t2))))`
@@ -34,10 +93,6 @@ With the Smith-Wilson parameter `ζ` and Wilson-matrix `W`, the zero-coupon bond
3493
In the last case, `t` can be any maturity vector, i.e. with additional maturities to extrapolate rates.
3594
<br /><br />
3695

37-
## Usage
38-
To use the Smith-Wilson fitting algorithm import the Python package and call `fit_smithwilson_rates()` with the required parameters. An example can be found in [main.py](https://github.com/simicd/smith-wilson-py/blob/master/main.py)
39-
<br /><br />
40-
4196
## Sources
4297
[EIOPA (2010). QIS 5 Technical Paper; Risk-free interest rates – Extrapolation method](https://eiopa.europa.eu/Publications/QIS/ceiops-paper-extrapolation-risk-free-rates_en-20100802.pdf); p.11ff
4398

main.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,16 @@
1414
alpha = 0.128562
1515

1616
# Target - Extrapolate to 150 years
17-
terms_ext = [float(y + 1) for y in range(150)] # 1.0, 2.0, ..., 150.0
17+
terms_target = [float(y + 1) for y in range(150)] # 1.0, 2.0, ..., 150.0
1818

1919
# Calculate fitted rates based on actual observations and two parametes alpha & UFR
2020
rates_ext = sw.fit_smithwilson_rates(rates_obs=rates, t_obs=terms,
21-
t_target=terms_ext, alpha=alpha, ufr=ufr)
21+
t_target=terms_target, alpha=alpha, ufr=ufr)
2222

2323
# Display Outputs
2424
# Create dictionary with maturity as key and rate as value
2525
observed = dict(zip(terms, rates))
26-
extrapolated = dict(zip(terms_ext, rates_ext.flatten()))
26+
extrapolated = dict(zip(terms_target, rates_ext.flatten()))
2727

2828
# Create and print dataframe
2929
print(pd.DataFrame({"Observed": observed, "Extrapolated": extrapolated}))

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
setuptools.setup(
77
name="smithwilson",
8-
version="0.1.0",
8+
version="0.2.0",
99
author="Dejan Simic",
1010
author_email="dejan.simic",
1111
description="Implementation of the Smith-Wilson yield curve fitting algorithm in Python for interpolations and extrapolations of zero-coupon bond rates",

0 commit comments

Comments
 (0)