КМВ в г решение нелинейных уравнений - PullRequest
0 голосов
/ 21 октября 2018

Сейчас я делаю магистерскую диссертацию по модели Merton KMV, и мне нужно внедрить ее для ряда компаний.Вот ссылка на CSV-файл , который я использовал.

Я пытаюсь зациклить процесс для решения нелинейных уравнений.До сих пор я нашел решение, чтобы решить его один раз, применяя каждый параметр вручную, но теперь мне нужно применить его ко всему фрейму данных.

Это код, который я создал до сих пор:

Загрузка файла и библиотеки, установка индекса

library(nleqslv) #this is a package that solve a non linear equation to compute both the value of teh asset and its volatility according to the Black and Scholes formula in the Merton model


df <- read.csv("/AREX_D.csv")
rownames(df) <- df$Date

start <- as.Date("31-12-16",format="%d-%m-%y")
end   <- as.Date("31-12-17",format="%d-%m-%y")
theDate <- start

Определение переменных

E <- df$Market.Cap
D <- df$Default.point
T <- 1
sigmaE <- df$stdev
r <- -0.017
df$Asset <- NA
df$sigmaA <- NA
df$DD <- NA
df$PD <- NA

Функция из пакета nleqslv, которая решает нелинейное уравнение

fnewton <- function(x)
  {
  y <- numeric(2)
  d1 <- (log(x[1]/D)+(r+x[2]^2/2)*T)/x[2]*sqrt(T)
  d2 <- d1-x[2]*sqrt(T)
  y[1] <- E-(x[1]*pnorm(d1)-exp(-r*T)*D*pnorm(d2))
  y[2] <- sigmaE*E-pnorm(d1)*x[2]*x[1]
  y
  }

Цикл, который должен реализовывать функцию для каждой строки в наборе данных за выбранные даты.

xstart <- c(E+D, sigmaE)#initialising the x-values (asset value and volatility for the function to solve the non linear equation

while (theDate<=end)
  {
  out <- nleqslv(xstart,fnewton,method="Newton")
  df$Asset <- out[1]
  df$sigmaA <- out[2]
  theDate <- theDate+1
}
print(tail(df))

Мои две проблемы:

  1. Мне нужно решить уравнение для каждой выбранной строки в наборе данных
  2. Вывод уравнения представляет собой список, и мне нужно добавить каждое значениесписок до двух отдельных столбцов.Я не знаю, возможно ли это.

Я нашел пакет, который мог бы решить эту проблему: ifrogs, но он недоступен в версии R 3.5.1

Если кто-нибудьимеет какое-либо понимание любой проблемы, которая может оказать огромную помощь.

Заранее спасибо:)

1 Ответ

0 голосов
/ 22 октября 2018

Вы должны прочитать csv с

df <- read.csv("AREX_D.csv", stringsAsFactors=FALSE)

, чтобы сохранить даты в символах.См. Ниже, почему.

Ваша функция fnewton содержит ошибкиОн использует D, E и sigmaE, но это векторы.Функция принимает вектор в качестве аргумента (аргумент x) и использует отдельные элементы этого вектора.Эта комбинация будет генерировать сообщения об ошибках.В вашем коде xstart это один длинный вектор.Это не будет принято nleqslv.

Определение функции должно быть изменено на

fnewton <- function(x, D, E, sigmaE)
  {
  y <- numeric(2)
  d1 <- (log(x[1]/D)+(r+x[2]^2/2)*T)/x[2]*sqrt(T)
  d2 <- d1-x[2]*sqrt(T)
  y[1] <- E-(x[1]*pnorm(d1)-exp(-r*T)*D*pnorm(d2))
  y[2] <- sigmaE*E-pnorm(d1)*x[2]*x[1]
  y
  }

Значения D и т. Д. Должны быть переданы в функцию как скаляры.

nleqslv возвращает список, состоящий из различных элементов.Одним из них является x: окончательное значение для аргумента x.Вы не можете получить к ним доступ как out[1] и выход [2] .. Вам необходимо сохранить выходные данные в каждой строке кадра данных.

Вы хотите сохранить их в кадре данных, поэтому используйте out$x[1] и out$x[2].Некоторые начальные значения для начального значения xstart содержат NA.Поэтому нужно проверить, содержит ли xstart NA перед вызовом nleqslv.

В вашем коде есть другие ошибки и последний цикл while.Так что измените последний цикл на этот

df$termcd <- -1
kstart <- which(df$Date == "03/01/2017")
kend  <- NROW(df)

for( k in kstart:kend ) {
    xstart <- c(E[k]+D[k], sigmaE[k])
    if(anyNA(xstart)) { next } # skip NA in input
    out <- nleqslv(xstart,fnewton,method="Newton", D=D[k],E=E[k],sigmaE=sigmaE[k])
    df$Asset[k] <- out$x[1]
    df$sigmaA[k] <- out$x[2]
    df$termcd[k] <- out$termcd
}

А теперь проверьте, были ли получены решения, проверяя df$termcd.

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