R优化问题

SC.*_*SC. 3 optimization r

我编写了一个函数bs.pp来计算看跌期权的Black Scholes值.

    bs.pp <- function (Price, Strike, sigma, texp, int) {
  d1=(1 / (sigma*sqrt(texp)))*(log(Price/Strike)+(int+(sigma^2)/2)*texp)
  d2=d1-sigma*sqrt(texp)
  Strike*pnorm(-d2)*exp(-int*texp)-Price*pnorm(-d1)}
Run Code Online (Sandbox Code Playgroud)

这似乎运作良好

> bs.pp(1000,1000,.2,1,.02)
[1] 69.35905
> bs.pp(1000,900,.25,1,.02)
[1] 46.15609
Run Code Online (Sandbox Code Playgroud)

我现在想利用将R optimize函数来计算,当我们知道(该函数的反函数Price,Strike,texp,int)和功能,但没有结果sigma.

我试着这样做如下

gg <- function(Price, Strike, sigma, texp, int, PutPrice){(bs.pp(Price, Strike, sigma, texp, int) - PutPrice)^2}
xmin <- optimize(gg, c(0,1), tol = 0.0001, Price = 1000, Strike = 1000, texp = 1, int = 0.02, PutPrice = 69.4)
xmin$minimum
Run Code Online (Sandbox Code Playgroud)

哪个返回错误

Error in optimize(gg, c(0, 1), tol = 1e-04, Price = 1000, Strike = 1000,  : 
  'xmin' not less than 'xmax'
Run Code Online (Sandbox Code Playgroud)

有趣的是,如果我执行以下操作(注意"int = 0.02"在优化行中仅替换为"0.02")

gg <- function(Price, Strike, sigma, texp, int, PutPrice){(bs.pp(Price, Strike, sigma, texp, int) - PutPrice)^2}
xmin <- optimize(gg, c(0,1), tol = 0.0001, Price = 1000, Strike = 900, texp = 1, 0.02, PutPrice = 46.2)
xmin$minimum
Run Code Online (Sandbox Code Playgroud)

我得到了正确的答案

[1] 0.2501474
Run Code Online (Sandbox Code Playgroud)

并证明这不仅仅是一个侥幸

gg <- function(Price, Strike, sigma, texp, int, PutPrice){(bs.pp(Price, Strike, sigma, texp, int) - PutPrice)^2}
xmin <- optimize(gg, c(0,1), tol = 0.0001, Price = 1000, Strike = 1000, texp = 1, 0.02, PutPrice = 69.4)
xmin$minimum
Run Code Online (Sandbox Code Playgroud)

也会返回正确的答案

[1] 0.2001055
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?我试过移动函数的参数,所以这sigma是第一个,但似乎没有任何区别.

仅供参考我的最终功能将是以下内容,我相信它可以更优雅地编写

bs.piv <- function(Price, Strike, texp, intr, PutPrice){
  optfunc <- function(P, S, sigma, t, i, PP){(bs.pp(Price, Strike, sigma, texp, intr) - PutPrice)^2}
  xmin <- optimize(optfunc, c(0,1), tol = 0.0001, P=Price, S=Strike, t=texp, i=intr, PP=PutPrice)
  xmin$minimum}
Run Code Online (Sandbox Code Playgroud)

Dav*_*ann 5

命名所有参数通常是个好主意,尤其是在使用...参数时.它修复了这种情况下的问题:

xmin <- optimize(f = gg, interval = c(0,1), tol = 0.0001, Price = 1000, Strike = 1000, texp = 1, int = 0.02, PutPrice = 69.4)
Run Code Online (Sandbox Code Playgroud)

编辑:正如@Roland解释的那样,interval匹配int,所以这是R中参数部分匹配危险的一个例子.


Rol*_*and 5

除了@David H的答案,它提供了命名interval参数的解决方案,这里有一个解释:

这是参数部分匹配的结果.有关详细信息,请参阅语言定义部分4.3.2.简而言之,匹配分三步进行:

1.)在提供的参数和优化'参数之间搜索精确的名称匹配.例如,interval将匹配到interval这里.

2.)在提供的参数和优化'参数之间搜索部分名称匹配.例如,int将匹配到interval这里.

3.)发生位置匹配."如果存在'...'参数,它将占用剩余的参数,标记与否." 并...用于optimize将参数传递给中指定的函数f.

因此,第2步会删除您的int参数,因为在位置匹配之前会发生部分匹配.