【发布时间】:2022-11-21 20:29:46
【问题描述】:
我有 R 中期权定价的 Black Scholes 公式:
BS = function(Flag,St, K, D, r, Ti, sigma) {
d1 = (log(St/K) + (r - D + (sigma^2)/2)*Ti) / (sigma*sqrt(Ti))
d2 = d1- sigma*sqrt(Ti)
if(Flag == "call") price = St*exp(-D*(Ti)) * pnorm(d1) - K*exp(-r*Ti)*pnorm(d2)
if(Flag != "call") price = K*exp(-r*Ti)*pnorm(-d2)-St*exp(-D*Ti)*pnorm(-d1)
return(price)}
BS("call",St=505.15, K=500, D=0, r=0.033, Ti=33/250, sigma=0.2)
[1] 18.48827
上式关于 sigma 的一阶导数:
vega_BS = function(St, K, D, r, Ti, sigma){
d1 = (log(St/K) + (r - D + (sigma^2)/2)*Ti) / (sigma*sqrt(Ti))
vega = St * dnorm(d1) * sqrt(Ti)
return(round(vega,4))
}
我想计算给定市场价值 32.4 的隐含波动率。
这样做 :
sig_implied = function(St, K, D,r, Ti,sigma,Market) {
root_find = function(sigma){
BS("call",St, K,D,r, Ti, sigma) - Market}
round(uniroot(root_find, c(0,1))$root,3)
}
Market = 32.4
sig_implied(St=505.15, K=500, r=0.033,D=0, Ti=33/250,sigma=0.2,Market=Market)
[1] 0.394
现在我想为隐含波动率计算实施 NR 算法。NR 的结果必须接近 0.394 但这样做远非接近:
ImpliedVolNewton = function(Market,Flag, St, K, Ti, r, D,sigma, tol=0.0001, maxiter = 100) {
s = 0.3
not_converged = Ti
vega = vega_BS(St, K, D, r, Ti, sigma)
i = 1
while (not_converged & (i < maxiter)) {
err = (Market - BS(Flag,St, K, D, r, Ti, sigma) )
s = s + err/vega
not_converged = (abs(err/vega) > tol)
i = i + 1
}
s }
ImpliedVolNewton(Market=32.4,"call",St=505.15, K=500, Ti=33/250, r=0.033, D=0,sigma=0.2,tol=0.0001)
[1] 22.73685
我在这里做错了什么?
有什么帮助吗?
更新编辑甚至这也行不通
implied_volatility = function(Market,Flag,St,K,Ti,r,D,sigma,tol=0.0001,max_iterations=100){
sigma0 = sqrt(abs(log(St/K)+r*Ti)*(2/Ti))
for(i in max_iterations){
diff = BS(Flag,St,K,Ti,r,D,sigma)-Market
if(abs(diff)<tol){
break
}
Sigma = sigma0 -diff/vega_BS(St,K,r,D,Ti,sigma)
}
return(Sigma)
}
implied_volatility (Market=32.4,"call",St=505.15, K=500, Ti=33/250, r=0.033, D=0,sigma=0.2,tol=0.0001)
【问题讨论】:
-
NR里面没有迭代公式,
x0 - f(x0)/f'(x0)。在哪里计算导数? -
@RuiBarradas vega 是 Black Scholes 公式关于 sigma 的一阶导数
-
是的,但它不是在循环中计算的。
s没有根据 Newton-Raphson 公式更新。 -
@RuiBarradas 有什么帮助吗?我怎样才能相应地更新它?可能这就是问题所在
标签: r algorithm newtons-method