R优化问题

时间:2015-04-30 13:28:18

标签: r optimization

我编写了一个函数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)}

这似乎运作良好

> bs.pp(1000,1000,.2,1,.02)
[1] 69.35905
> bs.pp(1000,900,.25,1,.02)
[1] 46.15609

我现在正试图利用R optimize函数计算函数的反函数(PriceStriketexp,{{1} })和函数的结果,但不是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

有趣的是,如果我运行以下内容(注意“int = 0.02”在优化行中仅替换为“0.02”)

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

我得到了正确答案

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

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

[1] 0.2501474

也会返回正确的答案

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

有什么想法吗? 我已经尝试移动函数的参数,以便[1] 0.2001055 是第一个,但这似乎没有任何区别。

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

sigma

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:5)

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

这是参数部分匹配的结果。有关详细信息,请参阅the language definition第4.3.2节。简而言之,匹配分三步进行:

1。)在提供的参数之间搜索确切的名称匹配并优化&#39;参数。例如,interval将与interval匹配。

2。)在提供的参数之间搜索部分名称匹配并优化&#39;参数。例如,int将与interval匹配。

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

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