Вы должны прочитать 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
.