Newbie wrote: > > I used: > marketdata <- read.csv(file="S&P 500 calls, jan-jun 2010.csv", > header=TRUE, sep=";") > after changing my directory to where the file is saved. > The data imported should be correct. > The spot is equal to S0, I typed it double in the post, sorry for that. > So S0 = 1136.03 is the spot >
1. it seems that your function difference contains an error: Superfluous closing ) 2. difference contains another possible error: it is not using the last argument mid It's using the global variable mid_bidask. It should read difference <- function (S0, K, T, r, sigma, q, mid) { return(BS_Call(S0, strike, T, r, sigma, q)- mid) } Your function returns a vector of length 460 as you correctly said. But in the documentation of nlminb it clearly states that the objective must return a scalar value. (NB. It doesn't seem to check?) So in function f you should at least reduce the vector to a scalar. In this case I would minimize the sum of the differences squared to prevent the optimization routine from getting negative values for differences. So define f as follows f <- function(x) sum(difference(S0, strike, T, x, implvol, q, mid_bidask)^2) and then nlminb(start=r, f) gives > nlminb(start=r, f) $par [1] 0.01268534 $objective [1] 3140.738 $convergence [1] 0 $iterations [1] 5 $evaluations function gradient 8 5 $message [1] "relative convergence (4)" If you try nlm and optim (with method="BFGS) you'll get similar results. It's up to you to decide if the outcome is plausible/acceptable. Berend -- View this message in context: http://r.789695.n4.nabble.com/Calibrating-the-risk-free-interest-rate-using-nlminb-tp3747509p3747758.html Sent from the R help mailing list archive at Nabble.com. ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.