Python中的隐含波动率计算

时间:2016-02-14 12:38:46

标签: python python-2.7

根据答案中的评论,我重写了下面的代码(math.1p(x) - > math.log(x)),现在应该可以使用并给出波动率的近似值。

我正在尝试创建一个短代码来计算欧洲看涨期权的隐含波动率。我写了下面的代码:

from scipy.stats import norm
import math

norm.cdf(1.96)
#c_p - Call(+1) or Put(-1) option
#P - Price of option
#S - Strike price
#E - Exercise price
#T - Time to expiration
#r - Risk-free rate

#C = SN(d_1) - Ee^{-rT}N(D_2)


def implied_volatility(Price,Stock,Exercise,Time,Rf):
    P = float(Price)
    S = float(Stock)
    E = float(Exercise)
    T = float(Time)
    r = float(Rf)
    sigma = 0.01
    print (P, S, E, T, r)
    while sigma < 1:
        d_1 = float(float((math.log(S/E)+(r+(sigma**2)/2)*T))/float((sigma*(math.sqrt(T)))))
        d_2 = float(float((math.log(S/E)+(r-(sigma**2)/2)*T))/float((sigma*(math.sqrt(T)))))
        P_implied = float(S*norm.cdf(d_1) - E*math.exp(-r*T)*norm.cdf(d_2))
        if P-(P_implied) < 0.001:
            return sigma
        sigma +=0.001
    return "could not find the right volatility"

print implied_volatility(15,100,100,1,0.05)

这产生:0.595波动率,应该是0.3203。这是一个巨大的差异......

我知道这不是一种快速的方法,我只是想证明这个原理是如何工作的,但我无法计算出一个好的近似值。 出于某种原因,当我调用函数时,它给出了我使用Matlab程序和以下网页计算的实际隐含波动率的非常近似值:Implied Volatility。有谁可以帮我弄清楚我犯了哪些错误?

2 个答案:

答案 0 :(得分:2)

我看到有两个问题,其中没有一个与python直接相关:

  1. 您正在使用log1p(x),这是1+x的自然对数,而您实际上需要log(x),这是x的自然对数(cf 。Wikipedia)。

  2. 考虑到其他参数,选项价格100是很高的。尝试计算10价格的隐含波动率 - 您的程序和您链接的计算器应该约为0.18

答案 1 :(得分:0)

在Python2中,5 / 2的结果为2。它使用地板划分。要解决这个问题,请将每个数字设为浮点数。在implied_volatility功能中,将P = Price更改为P = float(Price)S = Stock更改为S = float(Stock)等。