Вы можете использовать функцию optim () в R, чтобы минимизировать сумму квадратов разностей между фактическими доходностями и прогнозами nelson_siegel.
Я взял кривую доходности казначейства США за 2 января 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))
Затем я создал следующую функцию минимизации, лямбда по умолчанию равняется 0,609, а тета совпадает с 'значение зрелости для каждой точки кривой:
min.ns <- function(data, param) {
with(data, sum((yield - nelson_siegel_calculate(maturity, 0.609, param[1], param[2], param[3]))^2))
}
Теперь я могу вызвать подпрограмму optim () с начальным набором параметров 0,02, -0,02, 0,01 для бета-версий, в соответствии с вашим примером:
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 - это те значения для бета0, бета1, бета2, которые вы хотите.