在 Python 中实现 Smith-Wilson 收益率曲线拟合算法,用于零息债券利率的插值和外推
项目描述
史密斯威尔逊
概述
这个 Python 包实现了 Smith-Wilson 收益率曲线拟合算法。它允许对零息债券利率进行插值和外推。该算法用于在 Solvency II 框架中外推EIOPA 无风险期限结构。详细信息可在技术文件QIS 5 无风险利率中找到。可以在此处找到包括所应用参数的外推收益率曲线示例。
使用方法
-
安装包
pip install smithwilson
-
要使用 Smith-Wilson 拟合算法,首先导入 Python 包并指定输入。在下面的示例中,输入是直到第 25 年的年度频率的零息票利率。UFR 为 2.9%,收敛参数 alpha 为 0.128562。该
terms
列表定义了到期列表,在这种情况下[1.0, 2.0, 3.0, ..., 25.0]
import smithwilson as sw # Input - Switzerland EIOPA spot rates with LLP of 25 years # Source: https://eiopa.europa.eu/Publications/Standards/EIOPA_RFR_20190531.zip # EIOPA_RFR_20190531_Term_Structures.xlsx; Tab: RFR_spot_no_VA rates = [-0.00803, -0.00814, -0.00778, -0.00725, -0.00652, -0.00565, -0.0048, -0.00391, -0.00313, -0.00214, -0.0014, -0.00067, -0.00008, 0.00051, 0.00108, 0.00157, 0.00197, 0.00228, 0.0025, 0.00264, 0.00271, 0.00274, 0.0028, 0.00291, 0.00309] terms = [float(y + 1) for y in range(len(rates))] # [1.0, 2.0, ..., 25.0] ufr = 0.029 alpha = 0.128562
-
指定目标产出期限。这是您希望得到 Smith-Wilson 拟合费率的一组术语。将一组利率扩展到最后一个流动点之外(例如,以每年的频率外推到 150 年):
# Extrapolate to 150 years terms_target = [float(y + 1) for y in range(150)] # [1.0, 2.0, ..., 150.0]
或者,您可以检索不同的频率(例如,每季度而不是每年插值):
# Interpolate to quarterly granularity terms_target = [float(y + 1) / 4 for y in range(25*4)] # [0.25, 0.5, ..., 25.0]
插值和外推的组合也是可能的。对于任意期限的集合也是如此:
# Get rates for a well-specified set of maturities only terms_target = [0.25, 0.5, 1.0, 2.0, 5.0, 10.0, 20.0, 50.0, 100.0]
-
调用 Smiwth-Wilson 拟合算法。这将利率作为 numpy 向量返回,每个元素对应于成熟度
terms_target
# Calculate fitted rates based on actual observations and two parametes alpha & UFR fitted_rates = sw.fit_smithwilson_rates(rates_obs=rates, t_obs=terms, t_target=terms_target, ufr=ufr, alpha=alpha) # Optional
收敛参数 alpha 是可选的,如果没有提供,将进行估计。该参数决定了收益率曲线向终极远期利率 (UFR) 的收敛速度。该参数是通过找到最小值来估计的,使得收敛成熟时的远期速率与 UFR 之间的差异小于 1bps。
-
要显示结果和/或处理它们,将它们转换为表格会很有用,这里使用 pandas 库:
# Ensure pandas package is imported import pandas as pd # ... # Turn inputs & outputs into dataframe observed_df = pd.DataFrame(data=rates, index=terms, columns=["observed"]) extrapolated_df = pd.DataFrame(data=fitted_rates, index=terms_target, columns=["extrapolated"]) # Combine and print dataframe print(observed_df.join(extrapolated_df, how="outer"))
一个完整的例子可以在main.py中找到
算法
该算法是完全矢量化的并使用 numpy,因此非常高效。代码在core.py中。
该函数fit_smithwilson_rates()
需要以下参数:
- 观察率
- 观察到的到期日
- 目标期限
- 收敛参数 alpha
- 最终远期利率 (UFR)
假设观察到的利率和到期日在最后流动点 (LLP) 之前。目标成熟度向量可以包含任何一组成熟度(例如,更细粒度的成熟度结构(内插)或 LLP 之后的术语(外插))。
Smith-Wilson 拟合算法首先计算 Wilson 矩阵 (EIOPA, 2010, p. 16):
W = e^(-UFR * (t1 + t2)) * (α * min(t1, t2) - 0.5 * e^(-α * max(t1, t2))
* (e^(α * min(t1, t2)) - e^(-α * min(t1, t2))))
给定 Wilson-matrix W
、UFR 折扣因子μ
和价格P
的向量 ,参数向量ζ
可以计算如下(EIOPA,2010,p.17):
ζ = W^-1 * (μ - P)
使用 Smith-Wilson 参数ζ
和 Wilson-matrix W
,零息债券价格可以用矩阵表示法表示为 (EIOPA, 2010, p. 18):
P = e^(-t * UFR) - W * ζ
在最后一种情况下,t
可以是任何成熟度向量,即具有额外的成熟度来推断利率。
来源
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。
源分布
内置分布
smithwilson -0.2.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9acacf6cac7080c221518e20511bf415ebd213cfe63f42943b4fa0654f042971 |
|
MD5 | d418984f1ce75662dea2201ee92c9b9d |
|
布莱克2-256 | 08c0198a1bff975b03eccea4d2fab4ca4d34570f2dcd170e0a48fdd3fb87ab1e |
smithwilson -0.2.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b554f1c44db559071654eca04cf15311acf2cab8334304d958fc24ce167cd559 |
|
MD5 | 605dd3e281402700d11bcc739ae4411f |
|
布莱克2-256 | f3ec540f106648ec92e5169bc760e5a45ecb3ae577f918caa01afcb4da8d734b |