Как прогнозировать параметры Нельсона Сигеля с постоянной лямбдой в R? - PullRequest
0 голосов
/ 30 сентября 2019

Я хочу рассчитать бета-параметры модели Нельсона Сигеля с фиксированной лямбдой. Лямбда должна быть установлена ​​на 0,609. У меня есть файл Excel, который содержит 54 кривых доходности. Для каждой кривой доходности я хочу оценить бета-параметры из модели Нельсона Сигеля.

Сначала я попытался использовать функцию Nelson.Siegel из пакета "YieldCurve". Однако у функции есть только два аргумента, поэтому я не могу получить лямбда-константу.

Во-вторых, я сам создал функцию для вычисления модели Нельсона Зигеля. Я хочу минимизировать квадратную разницу между доходностью Нельсона Сигеля и фактической доходностью, изменив бета-параметры функции. Я сделал это в Excel с помощью Solver.

Код, который у меня есть:

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?

Или есть другой способ получить мой результат?

1 Ответ

0 голосов
/ 02 октября 2019

Вы можете использовать функцию 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, которые вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...