Skip to main content

在 Python 中实现 Smith-Wilson 收益率曲线拟合算法,用于零息债券利率的插值和外推

项目描述

史密斯威尔逊

概述

这个 Python 包实现了 Smith-Wilson 收益率曲线拟合算法。它允许对零息债券利率进行插值和外推。该算法用于在 Solvency II 框架中外推EIOPA 无风险期限结构。详细信息可在技术文件QIS 5 无风险利率中找到。可以在此处找到包括所应用参数的外推收益率曲线示例。

使用方法

  1. 安装包pip install smithwilson

  2. 要使用 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
    
  3. 指定目标产出期限。这是您希望得到 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]
    
  4. 调用 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。

  5. 要显示结果和/或处理它们,将它们转换为表格会很有用,这里使用 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可以是任何成熟度向量,即具有额外的成熟度来推断利率。

来源

EIOPA(2010 年)。QIS 5 技术论文;无风险利率——外推法;第 11 页

EIOPA(2018 年)。得出 EIOPA 无风险利率期限结构的方法的技术文档;p.37-46

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

smithwilson-0.2.0.tar.gz (11.1 kB 查看哈希

已上传 source

内置分布

smithwilson-0.2.0-py3-none-any.whl (10.4 kB 查看哈希

已上传 py3