【问题标题】:R Optimize issuesR 优化问题
【发布时间】:2017-04-08 00:31:12
【问题描述】:

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

当我们知道 (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

返回错误

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

有趣的是,如果我运行以下命令(注意“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

我答对了

[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 是第一个,但这似乎没有任何区别。

仅供参考,我的最终函数将如下所示,我确信可以更优雅地编写它

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}

【问题讨论】:

  • @Alex A 你是怎么做到的?
  • @Alex A 编辑文本,例如 bs.pp 不再显示为“普通文本”
  • 用反引号把它括起来`like this`。它是内联代码格式。请参阅here 了解更多信息。
  • @Alex A 谢谢。我实际上看过格式选项,但一定错过了。

标签: r optimization


【解决方案1】:

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

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 中参数部分匹配的危险的一个示例。

【讨论】:

  • 非常感谢大卫。我实际上想知道使用“int”是否是问题,但我担心它会将“int”与“integer”命令混淆,但找不到。我什至尝试将“int”更改为“inte”,但它仍然没有用。当然,“inte”仍然与“interval”混淆。非常感谢。
【解决方案2】:

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

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

1.) 在提供的参数和优化的参数之间搜索精确的名称匹配。例如,interval 将在此处与 interval 匹配。

2.) 在提供的参数和优化的参数之间搜索部分名称匹配。例如,int 将在此处与 interval 匹配。

3.) 发生位置匹配。 “如果有一个‘...’参数,它将占用剩余的参数,无论是否标记。”并且...optimize 用来将参数传递给f 中指定的函数。

因此,第 2 步取消了您的 int 参数,因为部分匹配发生在位置匹配之前。

【讨论】:

  • 非常感谢 Roland。我实际上想知道使用“int”是否是问题,但我担心它会将“int”与“integer”命令混淆,但找不到。我什至尝试将“int”更改为“inte”,但它仍然没有用。当然,“inte”仍然与“interval”混淆。将来我肯定会更加小心地命名所有函数输入。非常感谢。
猜你喜欢
  • 2011-05-30
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 2018-05-08
相关资源
最近更新 更多