Nelson-Siegel-Svensson in Python;使用纳尔逊-西格尔-斯文森估计即期汇率曲线(1994)

一、说明

        Nelson-Siegel-Svensson (1994) 模型通过添加 1987 个额外的曲线估计参数来修改 Nelson-Siegel (2) 模型。虚拟任何收益率曲线形状都可以使用这两种模型进行插值,这两种模型在世界各地的银行中广泛使用。

图1

二、插值和外推

        有时,时间序列数据集中存在缺失值。例如,可能存在第 1 年到 3 年的利率,然后是第 5 年到 8 年,然后是第 10 年。纳尔逊-西格尔模型也可用于预测或推断超出可用数据时间段的未来时间段的值。

        已知 X 值表示轴上的值是预先已知的值,例如时间或年份),已知 Y 值表示 y 轴上的值(在本例中为已知利率)。y 轴变量通常是您希望从将来插入缺失值或将值外推到将来的变量。

三、纳尔逊-西格尔-斯文森〔1994〕 模特

        Nelson-Siegel-Svensson(1994)模型用于生成利率和收益率曲线估计的期限结构。需要计量经济学建模技术来校准此模型中多个输入的值。

        Nelson-Siegel-Svensson (1994) 模型通过添加额外的广义参数来修改 Nelson-Siegel (1987) 模型。虚拟任何收益率曲线形状都可以使用这两种模型进行插值,这两种模型在世界各地的银行中广泛使用。

        Nelson-Siegel-Svensson (1994) 模型使用 6 个曲线估计参数运行,而 Nelson-Siegel (1987) 模型使用 4 个曲线估计参数运行。如果建模得当,Nelson-Siegel-Svensson(1994)模型几乎可以适应任何收益率曲线形状。

        校准Nelson-Siegel-Svensson(1994)模型中的输入需要计量经济学建模和误差优化技术。Nelson-Siegel-Svensson(1994)模型用于“填补缺失的现货收益率和利率期限结构的空白”,该模型可用于插值利率时间序列中的缺失数据点(以及其他宏观经济变量,如通货膨胀率和商品价格或市场回报),也可用于推断给定或已知范围之外, 用于预测目的。

四、纳尔逊-西格尔-斯文森收益率曲线拟合法

        纳尔逊-西格尔方法以其简单性而闻名,但它可能无法与在紧张的市场环境中观察到的所有到期日的零收益率相匹配。

图2

1994年,斯文森试图通过在现有的纳尔逊-西格尔公式中添加一个额外的项来创建更灵活的版本,该公式包含两个额外的参数。他漂亮而简单的想法是通过重用他前任方程的最后一个项来创建附加项。

这是最终公式:

图3

其中 β0、β1、β2、β3、λ0 和 λ1 是常数参数,T 是以年为单位的成熟时间。

在我们进入任何python之前,让我们描述一下我们的问题。

五、根本问题

        我们生活在一个叫以色列的国家(以色列在中东的某个地方,它的首都叫耶路撒冷)。在耶路撒冷坐落着以色列的中央银行,称为以色列银行。

        以色列银行提供标准的无风险收益率曲线,是该国风险最低的银行(因此,它提供标准收益率曲线。例如,假设以色列银行只有一定数量的债券。

        让我们看看以色列政府目前有哪些债券未偿还。所以它有:

  • 1年期债券,目前的收益率为0.39%。
  • 2年期债券,目前的收益率为0.61%。
  • 5年期债券,目前的收益率为1.66%。
  • 10年期债券,目前的收益率为2.58%。
  • 25年期债券,目前的收益率为3.32%。

        好吧,这很好,唯一的问题是,如果我们从这些数字建立收益率曲线,问题是我们之间没有任何数字。我们希望得到一个漂亮的收益率曲线。

        为什么我们要得到一个完整的漂亮曲线?例如,之所以说原因是因为我们有一个客户在以色列与我们联系,为了从这个特定客户那里获得 10,000,000 以色列谢克尔 (ILS) 的利润,我们需要对两件事有一个非常好的估计:

  • 以色列银行20年期国债收益率。
  • 以色列银行30年期国债收益率。

        不幸的是,当然,正如我们从我们的列表中看到的那样,我们没有这些数字,我们有10年,我们有25年,但我们没有20年,我们没有30年。那么,我们是否要向客户的ILS 10,000,000利润挥手告别?或者我们是否会有一个非常好的受过教育的尝试,试图在特定收益率曲线上创造那些缺失的点点滴滴?

嗯,我们可以。我们可以使用一种叫做纳尔逊-西格尔-斯文森方法的东西来产生真正有根据的猜测,关于中间的那些位应该是什么,以及那些外推的点应该是什么。

六、The Jupyter Notebook

        让我们创建一个新的 jupyter 笔记本。

from scipy.optimize import fmin
import pandas as pd
import numpy as np
import matplotlib.pyplot as pltdd = pd.read_csv('ns.csv')
df = dd.copy()
df.style.format({'Maturity': '{:,.0f}'.format,'Yield': '{:,.2%}'})

 

图4

        你会注意到我们没有我们想插值的20年,我们没有我们想推断的30年,因为如果我们能推断这些东西,那么我们将计算出这些数字。我们将能够获得10,000,000新谢克尔的利润,这就是我们想要做的。

sf = df.copy()
sf = sf.dropna()
sf1 = sf.copy()
sf1['Y'] = round(sf['Yield']*100,4)
sf = sf.style.format({'Maturity': '{:,.2f}'.format,'Yield': '{:,.4%}'})
import matplotlib.pyplot as plt
import matplotlib.markers as mk
import matplotlib.ticker as mtick
fontsize=15
fig = plt.figure(figsize=(13,7))
plt.title("Nelson-Siegel-Svensson Model - Unfitted Yield Curve",fontsize=fontsize)
ax = plt.axes()
ax.set_facecolor("black")
fig.patch.set_facecolor('white')
X = sf1["Maturity"]
Y = sf1["Y"]
plt.scatter(X, Y, marker="o", c="blue")
plt.xlabel('Period',fontsize=fontsize)
plt.ylabel('Interest',fontsize=fontsize)
ax.yaxis.set_major_formatter(mtick.PercentFormatter())
ax.xaxis.set_ticks(np.arange(0, 30, 5))
ax.yaxis.set_ticks(np.arange(0, 4, 0.5))
ax.legend(loc="lower right", title="Yield")
plt.grid()
plt.show()

图5

所以,你可以看到我们这里有这种粗糙的收益率曲线。我们需要知道20年和30年。让我们看看我们将如何获得这种纳尔逊-西格尔-斯文森方法。

我们需要做的第一件事是输入 3 个校准数字。如果您在互联网上搜索纳尔逊-西格尔-斯文森模型,您会发现您可以输入的这些校准数字。

我建议这些是相当不错的猜测,因此对于 4 个 beta 数字,将 0.01 放入 2 个 lambda 放射性衰变样式数字,我建议 1.0 是一个很好的起始值。现在这些将由一个名为scipy.optimize.fmin的函数进行更改。

β0 = 0.01
β1 = 0.01
β2 = 0.01
β3 = 0.01
λ0 = 1.00
λ1 = 1.00

        我们现在要做的是构建一条曲线,这条曲线不会有任何好处,但稍后会通过称为 fmin 函数的特殊 scipy.optimize 魔法进行更改。我需要在我的数据帧上名为“NSS”的新列中构建另一条曲线,当我在此列中构建另一条曲线时,神奇的技术解决方案将移动这些曲线以使收益率曲线(即我的数据帧上的“收益率”列)符合上述数字。

        让我们把 Nelson-Siegel-Svensson 公式放在这里,我们现在要使用它

Figure 5

        正如你所看到的,它有点像一个怪物。


df['NSS'] = (β0)+(β1*((1-np.exp(-df['Maturity']/λ0))/(df['Maturity']/λ0)))+(β2*((((1-np.exp(-df['Maturity']/λ0))/(df['Maturity']/λ0)))-(np.exp(-df['Maturity']/λ0))))+(β3*((((1-np.exp(-df['Maturity']/λ1))/(df['Maturity']/λ1)))-(np.exp(-df['Maturity']/λ1))))
df.style.format({'Maturity': '{:,.0f}'.format,'Yield': '{:,.2%}','NSS': '{:,.2%}'})

图6

让我们可视化未拟合的收益率曲线

df1 = df.copy()
df['Y'] = round(df['Yield']*100,4)
df['NSS'] =(β0)+(β1*((1-np.exp(-df['Maturity']/λ0))/(df['Maturity']/λ0)))+(β2*((((1-np.exp(-df['Maturity']/λ0))/(df['Maturity']/λ0)))-(np.exp(-df['Maturity']/λ0))))+(β3*((((1-np.exp(-df['Maturity']/λ1))/(df['Maturity']/λ1)))-(np.exp(-df['Maturity']/λ1))))
df['N'] = round(df['NSS']*100,4)
df2 = df.copy()
df2 = df2.style.format({'Maturity': '{:,.2f}'.format,'Y': '{:,.2%}', 'N': '{:,.2%}'})
import matplotlib.pyplot as plt
import matplotlib.markers as mk
import matplotlib.ticker as mtick
fontsize=15
fig = plt.figure(figsize=(13,7))
plt.title("Nelson-Siegel-Svensson Model - Unfitted Yield Curve",fontsize=fontsize)
ax = plt.axes()
ax.set_facecolor("black")
fig.patch.set_facecolor('white')
X = df["Maturity"]
Y = df["Y"]
x = df["Maturity"]
y = df["N"]
ax.plot(x, y, color="orange", label="NSS")
plt.scatter(x, y, marker="o", c="orange")
plt.scatter(X, Y, marker="o", c="blue")
plt.xlabel('Period',fontsize=fontsize)
plt.ylabel('Interest',fontsize=fontsize)
ax.yaxis.set_major_formatter(mtick.PercentFormatter())
ax.xaxis.set_ticks(np.arange(0, 30, 5))
ax.yaxis.set_ticks(np.arange(0, 4, 0.5))
ax.legend(loc="lower right", title="Yield")
plt.grid()
plt.show()

图7

        我们现在得到的是,我们现在已经走了未拟合的曲线,这就像我们制作西装之前西装的材料一样,我们将对这些校准统计数据进行一些定制,我们将使西装适合蓝点,我们将使用特殊的 fmin 函数来做到这一点。在我们执行此操作之前,我需要在数据帧上名为“残差”的新列中构建另一条曲线。

        我们采用一种称为特殊残差的东西,我们将采用蓝点和未拟合曲线之间的一些误差。我们将采用这些错误,然后对这些错误进行平方以消除任何负号。

df['Residual'] =  (df['Yield'] - df['NSS'])**2
df22 = df[['Maturity','Yield','NSS','Residual']]  
df22.style.format({'Maturity': '{:,.0f}'.format,'Yield': '{:,.2%}','NSS': '{:,.2%}','Residual': '{:,.9f}'})

 

图8

        现在我们采用存在于蓝点和蓝点存在的橙色点之间的所有这些误差项,因此我们采用这些项对它们进行平方。然后我要做的是把它们都加起来。

np.sum(df['Residual'])

0.0011625691502601255

        现在这就是魔力的用武之地。我要做的是调用 fmin 函数,我将在上述 6 个值上运行它,求解将上下摇晃这些东西,上下摇晃,上下,上下,这将使“NSS”列上的值上下波动, 上下,上下,我们将尝试最小化“残差”列上的值,使它们共同加起来尽可能低的数字,这样做希望它们会使这条橙色线适合这条虚线蓝线。

        我们希望通过更改上述 6 个数字来最小化“残差”列的总和,使其尽可能小。在这里,我们可以接受负数,没有问题,只需设置默认算法,然后调用fmin。

def myval(c):df = dd.copy()df['NSS'] =(c[0])+(c[1]*((1-np.exp(-df['Maturity']/c[4]))/(df['Maturity']/c[4])))+(c[2]*((((1-np.exp(-df['Maturity']/c[4]))/(df['Maturity']/c[4])))-(np.exp(-df['Maturity']/c[4]))))+(c[3]*((((1-np.exp(-df['Maturity']/c[5]))/(df['Maturity']/c[5])))-(np.exp(-df['Maturity']/c[5]))))df['Residual'] =  (df['Yield'] - df['NSS'])**2val = np.sum(df['Residual'])print("[β0, β1, β2, β3, λ0, λ1]=",c,", SUM:", val)return(val)c = fmin(myval, [0.01, 0.01, 0.01, 0.01, 1.00, 1.00])
图 9

图 10

 

        所发生的情况是,解算器根据我的原始输入上下抖动了上述 6 个数字,使橙色曲线符合我们之前看到的那些蓝色点。这不是一个奇妙的魔法吗?

        现在,让我们得到 6 位数字的结果

β0 = c[0]
β1 = c[1]
β2 = c[2]
β3 = c[3]
λ0 = c[4]
λ1 = c[5]
print("[β0, β1, β2, β3, λ0, λ1]=", [c[0].round(2), c[1].round(2), c[2].round(2), c[3].round(2), c[4].round(2), c[5].round(2)])
图11

让我们可视化拟合的收益率曲线

df = df1.copy()
df['NSS'] =(β0)+(β1*((1-np.exp(-df['Maturity']/λ0))/(df['Maturity']/λ0)))+(β2*((((1-np.exp(-df['Maturity']/λ0))/(df['Maturity']/λ0)))-(np.exp(-df['Maturity']/λ0))))+(β3*((((1-np.exp(-df['Maturity']/λ1))/(df['Maturity']/λ1)))-(np.exp(-df['Maturity']/λ1))))
sf4 = df.copy()
sf5 = sf4.copy()
sf5['Y'] = round(sf4['Yield']*100,4)
sf5['N'] = round(sf4['NSS']*100,4)
sf4 = sf4.style.format({'Maturity': '{:,.2f}'.format,'Yield': '{:,.2%}', 'NS': '{:,.2%}'})
M0 = 0.00
M1 = 3.50
import matplotlib.pyplot as plt
import matplotlib.markers as mk
import matplotlib.ticker as mtick
fontsize=15
fig = plt.figure(figsize=(13,7))
plt.title("Nelson-Siegel-Svensson Model - Fitted Yield Curve",fontsize=fontsize)
ax = plt.axes()
ax.set_facecolor("black")
fig.patch.set_facecolor('white')
X = sf5["Maturity"]
Y = sf5["Y"]
x = sf5["Maturity"]
y = sf5["N"]
ax.plot(x, y, color="orange", label="NSS")
plt.scatter(x, y, marker="o", c="orange")
plt.scatter(X, Y, marker="o", c="blue")
plt.xlabel('Period',fontsize=fontsize)
plt.ylabel('Interest',fontsize=fontsize)
ax.yaxis.set_major_formatter(mtick.PercentFormatter())
ax.xaxis.set_ticks(np.arange(0, 30, 5))
ax.yaxis.set_ticks(np.arange(0, 4, 0.5))
ax.legend(loc="lower right", title="Yield")
plt.grid()
plt.show()

图12

这个纳尔逊-西格尔-斯文森方程非常出色,它可能是这类方程中最好的一个,它比创建这些非线性线和这些曲线的多项式方程更好,大多数中央银行和软件绘制这些类型的线正在使用这种纳尔逊-西格尔-斯文森方法来创建这些线。

df.style.format({'Maturity': '{:,.0f}'.format,'Yield': '{:,.2%}','NSS': '{:,.2%}'})
图 13

 

        你可以看到这在创建完整的收益率曲线方面做得有多好,现在我可以看到20年期可能收益率为3.2%,我推断出30年期可能收益率为3.4%。所以,我认为这很好,这意味着我们现在可以获得10,000,000新谢克尔的利润。

        这就是您实现纳尔逊-西格尔-斯文森方法的方式,以便从有限的信息中创建收益率曲线。

七、后记

        希望这篇文章能让您很好地了解如何使用 Nelson-Siegel-Svensson 方法生成收益率曲线。如您所见,它非常简单,简单且快速。

        现在是时候走出去,开始对数据进行插值和推断了。试试这个算法,让我知道它是怎么回事。我很高兴收到有关上述任何内容的反馈或问题。罗伊·波兰尼策

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/109044.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【位运算进阶之----右移(>>)】

😄嘻嘻,朋友们,大家好!昨天我们学习了左移,今天我们来谈谈右移>>。 ⭐️简单来说,右移就是将一个数二进制表达整体向右移动,也就是去掉一个数的二进制表达的末位,右移一位就去…

Linux用户与组管理(02)(七)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、批量创建 二、修改属性 三、密码设置 四、删除 总结 前言 今天学习的是上次剩余的用户组的内容,也是相对于刚学习Linux系统比较重要的部分&#x…

13.4 目标检测锚框标注 非极大值抑制

锚框的形状计算公式 假设原图的高为H,宽为W 锚框形状详细公式推导 以每个像素为中心生成不同形状的锚框 # s是缩放比,ratio是宽高比 def multibox_prior(data, sizes, ratios):"""生成以每个像素为中心具有不同形状的锚框"""in_he…

一文搞懂深度信念网络!DBN概念介绍与Pytorch实战

目录 一、概述1.1 深度信念网络的概述1.2 深度信念网络与其他深度学习模型的比较结构层次学习方式训练和优化应用领域 1.3 应用领域图像识别与处理自然语言处理推荐系统语音识别无监督学习与异常检测药物发现与生物信息学 二、结构2.1 受限玻尔兹曼机(RBM&#xff0…

LLMs训练的算力优化Computational challenges of training LLMs

当您尝试训练大型语言模型时,您仍然经常遇到的最常见问题之一是内存不足。如果您曾尝试在Nvidia GPU上训练或甚至只是加载模型,那么这个错误消息可能看起来很熟悉。 CUDA,即Compute Unified Device Architecture的缩写,是为Nvid…

【rust/egui】(六)看看template的app.rs:TextEdit

说在前面 rust新手,egui没啥找到啥教程,这里自己记录下学习过程环境:windows11 22H2rust版本:rustc 1.71.1egui版本:0.22.0eframe版本:0.22.0上一篇:这里 TextEdit 文本编辑框 其定义为&#…

Grounded Language-Image Pre-training论文笔记

Title:Grounded Language-Image Pre-training Code 文章目录 1. 背景2. 方法(1)Unified Formulation传统目标检测grounding目标检测 (2)Language-Aware Deep Fusion(3)Pre-training with Scala…

【golang】派生数据类型---指针 标识符、关键字等

1、指针 对比C/C中的指针,go语言中的指针显得极为简洁,只是简单的获取某个空间的地址 或者 根据指针变量中的内容 获取对应存储空间的内容等操作。 具体示例如下: go中使用指针需要注意的点: 可以通过指针改变它所指向的内存空…

【CSS】轮播图案例开发 ( 基本设置 | 子绝父相 | 浏览器水平居中 | 圆角设置 | 绝对定位居中设置 )

代码示例 : <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Banner 轮播</title><style>/* 取消浏览器或者其它标签的默认的内外边距 */* {margin: 0;padding: 0;}/* 取消列表样式 主要是…

数据采集:selenium 获取某网站CDN 商家排名信息

写在前面 工作中遇到&#xff0c;简单整理理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#xff0c;是人的逃避方式&#xff0c;是对大…

【内网穿透】搭建我的世界Java版服务器,公网远程联机

目录 前言 1. 搭建我的世界服务器 1.1 服务器安装java环境 1.2 配置服务端 2. 测试局域网联机 3. 公网远程联机 3.1 安装cpolar内网穿透 3.1.1 windows系统 3.1.2 linux系统&#xff08;支持一键自动安装脚本&#xff09; 3.2 创建隧道映射内网端口 3.3 测试公网远程…

【电源专题】18650圆柱电芯内部结构及器件

18650圆柱锂离子电池是一种直径为18mm、高度为65mm的锂离子电池,它最大的特点是拥有非常高的能量密度,它是比较成熟的锂离子电池,各方面系统质量稳定性较好,广泛适用于10千瓦时左右的电池容量场合,例如在、在手机、笔记本电脑等小型电器上。 常见的18650电池分为锂离子电池…

亚马逊云科技 re:Inforce 大会云安全合规与技术实践及 Security Jam 大赛,快来报名吧!...

‍‍ 2023年8月31日在北京 亚马逊云科技 re:Inforce 大会 首次登陆中国&#xff01; 我们期待您的莅临&#xff0c; 并与您一起迎接 AI 时代&#xff0c; 开启全面智能的安全旅程&#xff01; 在13:00-17:00的 培训与动手实验环节中 云安全合规与技术实践 及 Security Jam 大赛…

Python3 列表

Python3 列表 序列是 Python 中最基本的数据结构。 序列中的每个值都有对应的位置值&#xff0c;称之为索引&#xff0c;第一个索引是 0&#xff0c;第二个索引是 1&#xff0c;依此类推。 Python 有 6 个序列的内置类型&#xff0c;但最常见的是列表和元组。 列表都可以进…

韶音骨传导耳机值得入手吗,韶音骨传导耳机可以水洗吗

韶音家的代表作可以说是OpenRun Pro骨传导耳机&#xff0c;在发声单元位置上采用了开孔的处理&#xff0c;佩戴上耳的时候发声单元可以贴合耳道&#xff0c;在低频延伸性&#xff0c;但在中高频的时候整体会出现震感&#xff0c;纤细的耳挂在佩戴的时候是有着不错的舒适度的&am…

农村农产品信息展示网站的设计与实现(论文+源码)_kaic

摘 要 随着软件技术的迅速发展,农产品信息展示的平台越来越多,传统的农产品显示方法将被计算机图形技术取代。这种网站技术主要把农产品的描述、农产品价格、农产品图片等内容&#xff0c;通过计算机网络的开发技术&#xff0c;在互联网上进行展示&#xff0c;然后通过计算机网…

单片机TVS/ESD二极管防护

TVS 瞬态电压抑制二极管Transient Voltage Suppressor ESD 静电释放二极管 Electro-Static discharge 这两种本质上都是二极管。都是利用了二极管正向导通、反向截止的特性。二极管在反向截止截止条件下&#xff0c;如果电压继续增大&#xff0c;将会引发雪崩&#xff0c;使得…

ubuntu20.04安装gcc5.4 g++5.4

在进行ubuntu20.04的系统中安装gcc g5.4中&#xff0c;会出现安装问题 1、pip安装&#xff0c;失败 2、使用apt-get install 进行安装时&#xff0c;提示没有候选项&#xff1b; 原因&#xff1a;ubuntu20.04的系统下&#xff0c;系统默认安装的gcc9.0的版本&#xff0c;默认…

7.Oracle视图创建与使用

1、视图的创建与使用 在所有进行的SQL语句之中&#xff0c;查询是最复杂的操作&#xff0c;而且查询还和具体的开发要求有关&#xff0c;那么在开发过程之中&#xff0c;程序员完成的并不是是和数据库的所有内容&#xff0c;而更多的是应该考虑到程序的设计结构。可以没有一个项…

WordPress使用子主题插件 Child Theme Wizard,即使主题升级也能够保留以前主题样式

修改WordPress网站样式&#xff0c;主题升级会导致自己定义设置的网站样式丢失&#xff0c;还需要重新设置&#xff0c;很繁琐工作量大&#xff0c;发现在WordPress 中有Child Theme Wizard子主题插件&#xff0c;使用Child Theme Wizard子主题插件&#xff0c;即使主题升级&am…