在R中实现unitroot函数时出现问题

在R中实现unitroot函数时出现问题,r,R,我是编程新手,我接触过R和Python的基本知识。我一直在尝试使用单位根函数(一个传统的过程)实现波动率微笑函数,但我遇到了问题。以下是我正在编写的代码: BlackScholesFormulaBach <- function (spot,timetomat,strike,r, q=0, sigma) { d1<-(spot-strike)/(sigma*sqrt(timetomat)) d2<-(spot-strike)/(sigma*sqrt(timeto

我是编程新手,我接触过R和Python的基本知识。我一直在尝试使用单位根函数(一个传统的过程)实现波动率微笑函数,但我遇到了问题。以下是我正在编写的代码:

BlackScholesFormulaBach  <- function (spot,timetomat,strike,r, q=0, sigma)
{ 
  
  d1<-(spot-strike)/(sigma*sqrt(timetomat))
  d2<-(spot-strike)/(sigma*sqrt(timetomat))
  
  
  result<-(spot-strike)*pnorm(d1)+sigma*sqrt(timetomat)*dnorm(d1)
  
  
  BlackScholesFormulaBach<-result
  
}

BlackScholesImpVol  <- function (obsprice,spot,timetomat,strike,r, q=0)
  
{ difference<- function(sigBS, obsprice,spot,timetomat,strike,r,q)
{BlackScholesFormulaBach(spot,timetomat,strike,r,q,sigBS)-obsprice
}

uniroot(difference, c(-1,1),obsprice=obsprice,spot=spot,timetomat=timetomat,strike=strike,r=r,q=q)$root

}

S_0<-100
cap_T<-1
sigma_1<-15
N<-1000

BlackScholesImpVol(S_0,cap_T,1,0,0,15)
如果我改变间隔,我会得到同样的错误。我一直在检查代码,但它似乎是正确的。我咨询过其他人,没有人发现问题。根据R,问题出在unitroot函数上,但我看不出在哪里

问题:

有人能帮我解决这个实现问题吗


感谢advance

让函数返回一个结果,您将得到一个结果。您可以像下面的一样重写其他函数,它们应该可以工作

BlackScholesFormulaBach  <-
  function (spot, timetomat, strike, r, q = 0, sigma) {
    d1 <- (spot - strike) / (sigma * sqrt(timetomat))
    d2 <- (spot - strike) / (sigma * sqrt(timetomat))
    result <-
      (spot - strike) * pnorm(d1) + sigma * sqrt(timetomat) * dnorm(d1)
    return(result)
  }

S_0 <- 100
cap_T <- 1
sigma_1 <- 15
N <- 1000

> BlackScholesFormulaBach(S_0, cap_T, 1, 0, 0, 15)
[1] 99

BlackScholesFormulaBach让函数返回一个结果,您将得到一个结果。您可以像下面的一样重写其他函数,它们应该可以工作

BlackScholesFormulaBach  <-
  function (spot, timetomat, strike, r, q = 0, sigma) {
    d1 <- (spot - strike) / (sigma * sqrt(timetomat))
    d2 <- (spot - strike) / (sigma * sqrt(timetomat))
    result <-
      (spot - strike) * pnorm(d1) + sigma * sqrt(timetomat) * dnorm(d1)
    return(result)
  }

S_0 <- 100
cap_T <- 1
sigma_1 <- 15
N <- 1000

> BlackScholesFormulaBach(S_0, cap_T, 1, 0, 0, 15)
[1] 99

BlackScholesFormulaBach获得该错误的唯一方法是,如果您意外地使用了R函数
c

比如说,

uniroot(sin,c(-1,1))
这是没有问题的。但是

c <- function(x) x^2
uniroot(sin(c(-1,1))

然后,您的函数应该可以工作(或者至少不会抛出相同的错误)。如果您确实需要此函数
c
,您当然可能希望在删除它之前将其分配给其他名称。

获得该错误的唯一方法是如果您意外使用了R函数
c

比如说,

uniroot(sin,c(-1,1))
这是没有问题的。但是

c <- function(x) x^2
uniroot(sin(c(-1,1))

然后,您的函数应该可以工作(或者至少不会抛出相同的错误)。如果您确实需要此函数
c
,您当然可能希望在删除它之前将其分配给其他名称。

我问的问题中有一个错误。不起作用的函数是BlackScholesImpVol。请看我的编辑。谢谢你的回答!我问的问题有个错误。不起作用的函数是BlackScholesImpVol。请看我的编辑。谢谢你的回答!是的,这就是问题所在。我发现我在另一页中定义了函数c。我刚刚用“rm”删除了它,它现在正在工作。谢谢是的,这就是问题所在。我发现我在另一页中定义了函数c。我刚刚用“rm”删除了它,它现在正在工作。谢谢