我编写了一个函数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
函数计算函数的反函数(Price
,Strike
,texp
,{{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
答案 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所解释的那样,interval
与int
相匹配,所以这是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
参数,因为在位置匹配之前会发生部分匹配。