乐趣区

关于数据挖掘:R语言使用随机技术差分进化算法优化的NelsonSiegelSvensson模型附代码数据

原文链接:http://tecdat.cn/?p=11936

最近咱们被客户要求撰写对于 Nelson-Siegel 的钻研报告,包含一些图形和统计输入。

在本教程中,咱们将钻研如何将 Nelson-Siegel-Svensson(NSS)模型拟合到数据

1 引言

因为咱们将应用随机技术进行优化,因而咱们应该从新运行几次。变量 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) ## 失去正值
[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))

咱们通常心愿获取参数,以便满足某些约束条件。咱们通过惩办函数将它们包含在内。


点击题目查阅往期内容

R 语言中的 Nelson-Siegel 模型在汇率预测的利用

左右滑动查看更多

01

02

03

04

咱们曾经有了数据,因而让咱们看看该函数对违反束缚的解决方案有何作用。假如咱们有三个解的总体 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


点击文末 “浏览原文”

获取全文残缺代码数据资料。

本文选自《R 语言应用随机技术差分进化算法优化的 Nelson-Siegel-Svensson 模型》。

点击题目查阅往期内容

合成商业周期时间序列:线性滤波器、HP 滤波器、Baxter 滤波器、Beveridge Nelson 合成等去趋势法
R 语言中的 Nelson-Siegel 模型在汇率预测的利用
R 语言用神经网络改良 Nelson-Siegel 模型拟合收益率曲线剖析
合成商业周期时间序列:线性滤波器、HP 滤波器、Baxter 滤波器、Beveridge Nelson 合成等去趋势法
用 R 语言用 Nelson Siegel 和线性插值模型对债券价格和收益率建模
R 语言用神经网络改良 Nelson-Siegel 模型拟合收益率曲线剖析
R 语言和 QuantLib 中 Nelson-Siegel 模型收益曲线建模剖析
R 语言应用随机技术差分进化算法优化的 Nelson-Siegel-Svensson 模型
用 R 语言用 Nelson Siegel 和线性插值模型对债券价格和收益率建模 R 语言用神经网络改良 Nelson-Siegel 模型拟合收益率曲线剖析
R 语言中的 Nelson-Siegel 模型在汇率预测的利用
python 应用 LASSO 回归预测股票收益
R 语言数据的收益率和波动性交易
R 语言用线性模型进行预测:加权泊松回归,一般最小二乘,加权负二项式模型,多重插补缺失值
应用 SAS,Stata,HLM,R,SPSS 和 Mplus 的分层线性模型 HLM
R 语言用线性回归模型预测空气质量臭氧数据

退出移动版