我想用一个固定的λ来计算Nelson Siegel模型的beta参数。应该将lambda设置为0.609。我有一个包含54条收益率曲线的excel文件。对于每条收益率曲线,我想从Nelson Siegel模型估计beta参数。
首先,我尝试使用"YieldCurve“包中的Nelson.Siegel函数。但是,该函数只有两个参数,所以我无法获得lambda常量。
其次,我自己创建了一个函数来计算Nelson Siegel模型。我想通过改变函数的beta参数来最小化Nelson Siegel收益率和实际收益率之间的平方差。我用solver在excel中做了这件事。
到目前为止我所拥有的代码:
RTS54_list <- read_xlsx("YieldCurves.xlsx")
nelson_siegel_calculate<-function(theta,lambda,beta0,beta1,beta2){
beta0 + beta1*(1-exp(-lambda * theta))/(lambda * theta) + beta2*((1-exp(-lambda * theta))/(lambda * theta) - exp(-lambda * theta))
}
ns_data <-
data.frame(maturity=1:100) %>%
mutate(NSS=nelson_siegel_calculate(theta=maturity,lambda=0.0609,beta0=0.02,beta1=-0.02,beta2=0.01))我如何在R中做同样的事情?
还是有其他方法可以得到我的结果?
发布于 2019-10-03 00:10:46
您可以在R中使用optim()函数来最小化实际收益率和nelson_siegel预测之间的平方差之和。
我抓取了US Treasury yield curve for 2 Jan 2019;将月份的到期日转换为年的小数,最终得到以下数据帧:
yldmat <- structure(list(maturity = c(0.0833333333333333, 0.166666666666667,
0.25, 0.5, 1, 2, 3, 5, 7, 10, 20, 30), yield = c(0.024, 0.024,
0.0242, 0.0251, 0.026, 0.025, 0.0247, 0.0249, 0.0256, 0.0266,
0.0283, 0.0297)), class = "data.frame", row.names = c(NA, -12L))然后我创建了以下最小化函数,lambda缺省为0.609,theta与每个曲线点的‘成熟度’值相同:
min.ns <- function(data, param) {
with(data, sum((yield - nelson_siegel_calculate(maturity, 0.609, param[1], param[2], param[3]))^2))
}现在,我可以使用初始参数集0.02,-0.02,0.01来调用optim()例程,根据您的示例:
optim(par = c(0.02,-0.02,0.01), fn = min.ns, data = yldmat)
$par
[1] 0.029152661 -0.004403284 -0.007526309
$value
[1] 7.983234e-06
$counts
function gradient
132 NA
$convergence
[1] 0
$message
NULL$par值是您想要的beta0、beta1和beta2的值。
https://stackoverflow.com/questions/58167808
复制相似问题