共计 5356 个字符,预计需要花费 14 分钟才能阅读完成。
原文链接: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 语言用线性回归模型预测空气质量臭氧数据