【问题标题】:Newton Raphson Algorithm in R for Implied volatilityR 中用于隐含波动率的 Newton Raphson 算法
【发布时间】: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


【解决方案1】:

implied_volatility_NR= function(Market,Flag, St, K,D,sigma, Ti, r) {
  max_iterations = 100
  tolerance      = 0.0001
  
  # Manaster & Koehler Seed Value
  sigma  =  sqrt(abs(log(St/K)+r*Ti)*(2/Ti))
  
  for(i in 1: max_iterations){

    vega  = vega_BS(St,K,r,D,Ti,sigma)
    diff  = Market - BS(Flag,St, K, D, r, Ti, sigma)
    
    if (abs(diff) < tolerance | vega < tolerance) {
      return(sigma)
    }
    sigma = sigma + diff/vega 
  }
  return(sigma)
}    
>implied_volatility_NR(32.4,Flag="call", St=505.15, K=500,D=0,sigma=0.2, Ti=33/250, r=0.033)
[1] 0.3936608

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    相关资源
    最近更新 更多