我编写了一个函数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)
命名所有参数通常是个好主意,尤其是在使用...参数时.它修复了这种情况下的问题:
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中参数部分匹配危险的一个例子.
除了@David H的答案,它提供了命名interval参数的解决方案,这里有一个解释:
这是参数部分匹配的结果.有关详细信息,请参阅语言定义部分4.3.2.简而言之,匹配分三步进行:
1.)在提供的参数和优化'参数之间搜索精确的名称匹配.例如,interval将匹配到interval这里.
2.)在提供的参数和优化'参数之间搜索部分名称匹配.例如,int将匹配到interval这里.
3.)发生位置匹配."如果存在'...'参数,它将占用剩余的参数,标记与否." 并...用于optimize将参数传递给中指定的函数f.
因此,第2步会删除您的int参数,因为在位置匹配之前会发生部分匹配.