R语言使用随机技术差分进化算法优化的Nelson-Siegel-Svensson模型

简介: R语言使用随机技术差分进化算法优化的Nelson-Siegel-Svensson模型

1引言

在本教程中,我们将研究如何将Nelson-Siegel-Svensson(NSS)模型拟合到数据。由于我们将使用随机技术进行优化,因此我们应该重新运行几次。变量nRuns设置示例重启的次数。

> set.seed(112233)


2将NS模型拟合到给定的零利率

NS模型

我们使用给定的参数betaTRUE创建“真实”的收益曲线yM。付款时间(以年为单位)在向量tm中。

> tm <- c(c(1, 3, 6, 9)/12, 1:10)

> betaTRUE <- c(6, 3, 8, 1)

> yM <- NS(betaTRUE, tm)

> par(ps = 11, bty = "n", las = 1, tck = 0.01, mgp = c(3, 0.2, 0), mar = c(4, 4, 1, 1))

> plot(tm, yM, xlab = "maturities in years", ylab = "yields in %")

目的是通过这些点拟合平滑曲线。我们从目标函数OF开始。它有两个参数:param和list数据(包含所有其他变量)。返回观察到的(“市场”)收益率yM的向量与参数param的模型收益率之间的最大绝对差。

我们添加了一个粗略而有效的约束,以防止导致“ NA”值的参数值:目标函数返回较大的正值。我们将其最小化,因此产生NA值的参数被标记为不良。在第一个示例中,我们将数据设置如下:


> data <- list(yM = yM, tm = tm, model = NS, ww = 0.1, min = c( 0,-15,-30, 0), max = c(15, 30, 30,10))


我们添加了一个模型(在本例中为NS),该模型描述了从参数到收益曲线的映射,以及向量min和max,我们稍后将其用作约束。ww是惩罚权重,如下所述。

OF将采用候选解决方案参数,通过data $ model将此解决方案转换为收益,并将这些收益与yM进行比较,这意味着要计算最大绝对差。

> OF(param2, data) ## ... gives a postive number

[1] 0.97686

我们还可以根据收益率曲线比较解决方案。

> par(ps = 11, bty = "n", las = 1, tck = 0.01, mgp = c(3, 0.2, 0), mar = c(4, 4, 1, 1))

> plot(tm, yM, xlab = "maturities in years", ylab = "yields in %")

> lines(tm, NS(param1, tm), col = "blue")

> lines(tm, NS(param2, tm), col = "red")

> legend(x = "topright", legend = c("true yields", "param1", "param2"), col = c("black", "blue", "red"), pch = c(1, NA, NA), lty = c(0, 1, 1))

我们通常希望获取参数,以便满足某些约束条件。我们通过惩罚函数将它们包括在内。

我们已经有了数据,因此让我们看看该函数对违反约束的解决方案有何作用。假设我们有三个解的总体mP。

> param1 <- c( 6, 3, 8, -1)

> param2 <- c( 6, 3, 8, 1)

> param3 <- c(-1, 3, 8, 1)

> mP <- cbind(param1,param2,param3)

> rownames(mP) <- c("b1","b2","b3","lambda")

> mP

param1 param2 param3

b1 6 6 -1

b2 3 3 3

b3 8 8 8

lambda -1 1 1


第一个和第三个解决方案违反了约束。在第一个解决方案中,λ为负。在第三个解中,β1为负。

> penalty(mP,data)

param1 param2 param3

0.2 0.0 0.2

参数ww控制了我们的惩罚程度。

> data$ww <- 0.5
> penalty(mP,data)
param1 param2 param3
1 0 1

对于有效的解决方案,惩罚应为零。

> penalty(mP, data)
param1 param2 param3
0 0 0

请注意,惩罚会立即生效;无需遍历解决方案。

这样我们就可以进行测试了。我们首先定义DE的参数。请特别注意,我们传递了惩罚函数,并将loopPen设置为FALSE。

然后使用目标函数OF,列表数据和列表算法调用DEopt。


> sol <- DEopt(OF = OF, algo = algo, data = data)


差异演化

最佳解的目标函数值为0;

最终人群中OF的标准偏差为3.0455e-16。

为了检查目标函数是否正常工作,我们将最大误差与返回的目标函数值进行比较–它们应该相同。

> max( abs(data$model(sol$xbest, tm) - data$model(betaTRUE, tm)) )
[1] 0
> sol$OFvalue
[1] 0 

作为基准,我们从stats包运行函数nlminb。

如果发现它的性能优于DE,我们将有力地表明我们的DE实现存在问题。

我们使用一个随机起始值s0。

> s0 <- algo$min + (algo$max - algo$min) * runif(length(algo$min))
> sol2 <- nlminb(s0, OF, data = data,
lower = data$min,
upper = data$max,
control = list(eval.max = 50000L,
iter.max = 50000L))

同样,我们比较返回的目标函数值和最大误差。

> max( abs(data$model(sol2$par, tm) - data$model(betaTRUE,tm)) )
[1] 1.5787e-07
> sol2$objective
[1] 1.5787e-07

为了比较我们的两个解(DE和nlminb),我们可以将它们与真实的收益率曲线一起绘制。但是必须强调的是,这两种算法的结果都是随机的:对于DE,因为它故意使用随机性;在nlminb的情况下,因为我们随机设置了起始值。为了获得更有意义的结果,我们应该多次运行这两种算法。为了降低插图的构建时间,我们只运行两种方法一次。

> plot(tm, yM, xlab = "maturities in years",
ylab = "yields in %")
> algo$printDetail <- FALSE
> for (i in seq_len(nRuns)) {
sol <- DEopt(OF = OF, algo = algo, data = data)
lines(tm, data$model(sol$xbest,tm), col = "blue")
s0 <- algo$min + (algo$max-algo$min) * runif(length(algo$min))
sol2 <- nlminb(s0, OF, data = data,
lower = data$min,
upper = data$max,
control = list(eval.max = 50000L,
iter.max = 50000L))
lines(tm,data$model(sol2$par,tm), col = "darkgreen", lty = 2)
}
> legend(x = "topright", legend = c("true yields", "DE", "nlminb"),
col = c("black","blue","darkgreen"),
pch = c(1, NA, NA), lty = c(0, 1, 2))


毫无疑问,DE似乎通常只有一条曲线:实际上有nRuns 条线,但是它们是相互叠加的。

其他约束

NS(和NSS)模型的参数约束是要确保所得的零利率为非负数。但实际上,它们不能保证正利率。

> plot(tm, yM, xlab = "maturities in years", ylab = "yields in %")
> abline(h = 0)

这确实是一个虚构的示例,但尽管如此,我们仍可能希望包括针对此类参数向量的约束措施:我们可以仅包含一个所有速率均大于零的约束条件。

同样,这可以通过惩罚函数来完成。

校验:

> penalty2(c(3, -2, -8, 1.5),data)
[1] 0.86343

此惩罚函数仅适用于单个解决方案,因此实际上将其直接写入目标函数最简单。

因此,就像一个数值测试:假设上述参数为真,而利率为负。

> algo$pen <- NULL; data$yM <- yM; data$tm <- tm
> par(ps = 11, bty = "n", las = 1, tck = 0.01,
mgp = c(3, 0.2, 0), mar = c(4, 4, 1, 1))
> plot(tm, yM, xlab = "maturities in years", ylab = "yields in %")
> abline(h = 0)
> sol <- DEopt(OF = OFa, algo = algo, data = data)
> lines(tm,data$model(sol$xbest,tm), col = "blue")
> legend(x = "topleft", legend = c("true yields", "DE (constrained)"),
col = c("black", "blue"),
pch = c(1, NA, NA), lty = c(0, 1, 2))

3将NSS模型拟合到给定的零利率

如果要改用NSS模型,则几乎不需要更改。我们只需要向目标函数传递一个不同的模型。下面是一个示例。同样,我们修复了真实参数并尝试恢复它们。


列表数据和算法与以前几乎相同;目标函数保持完全相同。

仍然需要运行算法。(同样,我们检查返回的目标函数值。)

> sol <- DEopt(OF = OF, algo = algo, data = data)
> max( abs(data$model(sol$xbest, tm) - data$model(betaTRUE, tm)) )
[1] 7.9936e-15
> sol$OFvalue
[1] 7.9936e-15

我们将结果与nlminb进行比较。

最后,我们比较了几次运行所得的收益率曲线。

> par(ps = 11, bty = "n", las = 1, tck = 0.01,
mgp = c(3, 0.2, 0), mar = c(4, 4, 1, 1))
> plot(tm, yM, xlab = "maturities in years", ylab = "yields in %")
> for (i in seq_len(nRuns)) {
sol <- DEopt(OF = OF, algo = algo, data = data)
lines(tm, data$model(sol$xbest,tm), col = "blue")
s0 <- algo$min + (algo$max - algo$min) * runif(length(algo$min))
sol2 <- nlminb(s0, OF, data = data,
lower = data$min,
upper = data$max,
control = list(eval.max = 50000L,
iter.max = 50000L))
lines(tm, data$model(sol2$par,tm), col = "darkgreen", lty = 2)
}
> legend(x = "topright", legend = c("true yields", "DE", "nlminb"),
col = c("black","blue","darkgreen"),
pch = c(1,NA,NA), lty = c(0,1,2), bg = "white")



参考文献

关于数值优化中“良好起始值”的注释,2010年。http://comisef.eu/?q = working_papers

相关文章
|
10天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
4天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
21 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
4天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
25 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
11天前
|
人工智能 算法 大数据
Linux内核中的调度算法演变:从O(1)到CFS的优化之旅###
本文深入探讨了Linux操作系统内核中进程调度算法的发展历程,聚焦于O(1)调度器向完全公平调度器(CFS)的转变。不同于传统摘要对研究背景、方法、结果和结论的概述,本文创新性地采用“技术演进时间线”的形式,简明扼要地勾勒出这一转变背后的关键技术里程碑,旨在为读者提供一个清晰的历史脉络,引领其深入了解Linux调度机制的革新之路。 ###
|
15天前
|
机器学习/深度学习 人工智能 算法
青否数字人声音克隆算法升级,16个超真实直播声音模型免费送!
青否数字人的声音克隆算法全面升级,能够完美克隆真人的音调、语速、情感和呼吸。提供16种超真实的直播声音模型,支持3大AI直播类型和6大核心AIGC技术,60秒快速开播,助力商家轻松赚钱。AI讲品、互动和售卖功能强大,支持多平台直播,确保每场直播话术不重复,智能互动和真实感十足。新手小白也能轻松上手,有效规避违规风险。
|
17天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
21天前
|
存储 缓存 算法
优化轮询算法以提高资源分配的效率
【10月更文挑战第13天】通过以上这些优化措施,可以在一定程度上提高轮询算法的资源分配效率,使其更好地适应不同的应用场景和需求。但需要注意的是,优化策略的选择和实施需要根据具体情况进行详细的分析和评估,以确保优化效果的最大化。
|
24天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
9天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
11天前
|
存储 算法 决策智能
基于免疫算法的TSP问题求解matlab仿真
旅行商问题(TSP)是一个经典的组合优化问题,目标是寻找经过每个城市恰好一次并返回起点的最短回路。本文介绍了一种基于免疫算法(IA)的解决方案,该算法模拟生物免疫系统的运作机制,通过克隆选择、变异和免疫记忆等步骤,有效解决了TSP问题。程序使用MATLAB 2022a版本运行,展示了良好的优化效果。