У меня есть функция Black-Scholes и моя модель деления пополам для параметров вызова с данными из CSV. Кажется, что он застревает во внутреннем цикле, потому что он остается выше допустимого. Мой Black-Scholes точно вычисляет, и я использую среднее значение ставки и запрашиваю рыночную цену вместо фактической цены опциона. Поработав над этим часами, возможно, я просто пропустил что-то очевидное.R: Расчет IV с использованием метода Блэка-Скоулза и деления пополам, петля, отказывающаяся работать
Ссылка на CSV здесь: http://s000.tinyupload.com/?file_id=06213890949979926112
########################################################################
#Black-Scholes-Merton Call
bsmCall <- function(S, K, M, sig, r) {
yrTime=(M/252)
d1 <- (log(S/K)+(r+(sig^2/2))*(yrTime))/(sig*(sqrt(yrTime)))
d2 <- d1-sig*(sqrt(yrTime))
C <- (S*(pnorm(d1)))-((pnorm(d2))*K*(exp(-r*yrTime)))
return(C)
}
########################################################################
myData = read.csv("09-26-16.csv", stringsAsFactors=FALSE) #DATA
myData <- myData[,2:24] #omit first column
####### start bisection method of CALLS and put IV in database #######
i <- 1 # reset counter
tol <- 0.000001 #tolerance
while(i <= nrow(myData)) {
if((myData[i,5] != 0) & (myData[i,6] != 0)) {
volLower <- .0001 #will need to reset with each iteration
volUpper <- 1 #will need to reset with each iteration
volMid <- (volLower + volUpper)/2 #will need to reset with each iteration
while(abs(bsmCall(as.numeric(as.character(myData[i,17])),as.numeric(as.character(myData[i,1])),as.numeric(as.character(myData[i,22])),volMid,as.numeric(as.character(myData[i,23])))-(as.numeric(as.character(myData[i,5])))) >= tol) {
if((bsmCall(as.numeric(as.character(myData[i,17])),as.numeric(as.character(myData[i,1])),as.numeric(as.character(myData[i,22])),volMid,as.numeric(as.character(myData[i,23])))-(as.numeric(as.character(myData[i,5])))) < 0) {
volLower <- volMid
volMid <- (volUpper + volMid)/2
} else {
volUpper <- volMid
volMid <- (volLower + volMid)/2
}
}
myData[i,8] <- volMid
} else { myData[i,8] <- 0 }
i=i+1
}
Вместо ссылки на csv (ссылки умереть, а SO - создание ресурса), пожалуйста, предоставьте минимальный воспроизводимый пример http://stackoverflow.com/questions/5963269/how-to-make-a-great -r-воспроизводимый пример. – Shape
Непонятно, каков ваш вопрос на самом деле. Есть ли фактическая ошибка R при запуске этого кода? Или это просто не ведет себя так, как ожидалось? Если да, то как это не ведет себя так, как ожидалось? (что такое «это», которое остается выше толерантности? Предполагается ли, что он остается выше толерантности? Проблема в том, что «bmsCall» не возвращает ожидаемое число? Многие из нас не знают деталей системы Black Scholes и bisection models для опций вызова) –
Он заканчивается бесконечным циклом. Вот кадровый резерв CSV. – Probability1