拓端tecdat|R语言编程指导使用随机技术差分进化算法优化的Nelson-Siegel-Svensson模型
原文链接:http://tecdat.cn/?p=11936
1引言
在本教程中,我们将研究如何将Nelson-Siegel-Svensson(NSS)模型拟合到数据。由于我们将使用随机技术进行优化,因此我们应该重新运行几次。变量nRuns设置示例重启的次数。
2将NS模型拟合到给定的零利率
NS模型
我们使用给定的参数betaTRUE创建“真实”的收益曲线yM。付款时间(以年为单位)在向量tm中。
目的是通过这些点拟合平滑曲线。我们从目标函数OF开始。它有两个参数:param和list数据(包含所有其他变量)。返回观察到的(“市场”)收益率yM的向量与参数param的模型收益率之间的最大绝对差。
我们添加了一个粗略而有效的约束,以防止导致“ NA”值的参数值:目标函数返回较大的正值。我们将其最小化,因此产生NA值的参数被标记为不良。在第一个示例中,我们将数据设置如下:
我们添加了一个模型(在本例中为NS),该模型描述了从参数到收益曲线的映射,以及向量min和max,我们稍后将其用作约束。ww是惩罚权重,如下所述。
OF将采用候选解决方案参数,通过data $ model将此解决方案转换为收益,并将这些收益与yM进行比较,这意味着要计算最大绝对差。
我们还可以根据收益率曲线比较解决方案。
我们通常希望获取参数,以便满足某些约束条件。我们通过惩罚函数将它们包括在内。
我们已经有了数据,因此让我们看看该函数对违反约束的解决方案有何作用。假设我们有三个解的总体mP。
第一个和第三个解决方案违反了约束。在第一个解决方案中,λ为负。在第三个解中,β1为负。
参数ww控制了我们的惩罚程度。
对于有效的解决方案,惩罚应为零。
请注意,惩罚会立即生效;无需遍历解决方案。
这样我们就可以进行测试了。我们首先定义DE的参数。请特别注意,我们传递了惩罚函数,并将loopPen设置为FALSE。
然后使用目标函数OF,列表数据和列表算法调用DEopt。
差异演化。
最佳解的目标函数值为0;
最终人群中OF的标准偏差为3.0455e-16。
为了检查目标函数是否正常工作,我们将最大误差与返回的目标函数值进行比较–它们应该相同。
作为基准,我们从stats包运行函数nlminb。
如果发现它的性能优于DE,我们将有力地表明我们的DE实现存在问题。
我们使用一个随机起始值s0。
同样,我们比较返回的目标函数值和最大误差。
为了比较我们的两个解(DE和nlminb),我们可以将它们与真实的收益率曲线一起绘制。但是必须强调的是,这两种算法的结果都是随机的:对于DE,因为它故意使用随机性;在nlminb的情况下,因为我们随机设置了起始值。为了获得更有意义的结果,我们应该多次运行这两种算法。为了降低插图的构建时间,我们只运行两种方法一次。
毫无疑问,DE似乎通常只有一条曲线:实际上有nRuns 条线,但是它们是相互叠加的。
其他约束
NS(和NSS)模型的参数约束是要确保所得的零利率为非负数。但实际上,它们不能保证正利率。
这确实是一个虚构的示例,但尽管如此,我们仍可能希望包括针对此类参数向量的约束措施:我们可以仅包含一个所有速率均大于零的约束条件。
同样,这可以通过惩罚函数来完成。
校验:
此惩罚函数仅适用于单个解决方案,因此实际上将其直接写入目标函数最简单。
因此,就像一个数值测试:假设上述参数为真,而利率为负。
3将NSS模型拟合到给定的零利率
如果要改用NSS模型,则几乎不需要更改。我们只需要向目标函数传递一个不同的模型。下面是一个示例。同样,我们修复了真实参数并尝试恢复它们。
列表数据和算法与以前几乎相同;目标函数保持完全相同。
仍然需要运行算法。(同样,我们检查返回的目标函数值。)
我们将结果与nlminb进行比较。
最后,我们比较了几次运行所得的收益率曲线。
参考文献
关于数值优化中“良好起始值”的注释,2010年。http://comisef.eu/?q = working_papers