【问题标题】:Calculating implied volatility using Scipy optimize brentq error使用 Scipy 优化 brentq 错误计算隐含波动率
【发布时间】:2021-03-16 04:53:47
【问题描述】:

我想使用 scipy 优化布伦特根查找算法计算隐含波动率:

def calcimpliedvol(S,K,T,r,marketoptionPrice):
  d1=(np.log(S/K)+(r-0.5*sigma**2)*T)/(sigma*np.sqrt(T))
  d2=d1-(sigma*np.sqrt(T))
  BSprice_call=S*si.norm.cdf(d1,0,1)-K*np.exp(-r*T)*si.norm.cdf(d2,0,1)

  fx=BSprice_call-marketoptionPrice
  return optimize.brentq(fx,0,1,maxiter=1000)

但是,当我运行该函数并为其指定所有输入 K=6,S=8,T=0.25,r=0,OptionPrice=4 时,我收到一条错误消息,提示未定义 sigma。 Sigma是我想用优化算法找到的。

有人可以告诉我在定义函数时我做错了什么吗?

【问题讨论】:

    标签: optimization scipy


    【解决方案1】:

    您的代码存在多个问题

    • brentq 需要一个 function 作为第一个参数,它会找到它的根。你给它传递了一个变量。这是主要问题
    • 布莱克-斯科尔斯公式错误(d1(r+0.5*sigma**2) 而不是 (r-0.5*sigma**2)
    • 代码不适用于sigma=0,因为你除以sigma。至少您不应该将 0 作为边界之一传递。更好的是,在代码中单独处理 sigma=0 大小写
    • 期权价格的值 4 非常高,S=8,K=6,T=0.25。在这种情况下,隐含波动率为 2.18(即 218%),超出了您为根求解器提供的上限

    这是更正后的代码。对于第一点,请注意我们如何在您的函数中定义函数bs_price,然后将其传递给求解器。还解决了其他问题

    from scipy import optimize
    import scipy.stats as si
    def calcimpliedvol(S,K,T,r,marketoptionPrice):
      
        def bs_price(sigma):
            d1=(np.log(S/K)+(r+0.5*sigma**2)*T)/(sigma*np.sqrt(T))
            d2=d1-(sigma*np.sqrt(T))
            BSprice_call=S*si.norm.cdf(d1,0,1)-K*np.exp(-r*T)*si.norm.cdf(d2,0,1)
            fx=BSprice_call-marketoptionPrice
            return fx
    
        return optimize.brentq(bs_price,0.0001,100,maxiter=1000)
    
    calcimpliedvol(S=8,K=6,T=0.25, r=0, marketoptionPrice=4)
    

    它返回2.188862879492475

    【讨论】:

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