Python中的隐含波动率计算

Python中的隐含波动率计算,python,python-2.7,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 - Exer

根据答案中的注释,我重写了下面的代码(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)
来自scipy.stats导入规范
输入数学
标准cdf(1.96)
#买入期权(+1)或卖出期权(-1)
#P-期权价格
#履约价格
#电子交易价格
#T-到期时间
#r-无风险利率
#C=SN(d_1)-Ee^{-rT}N(d_2)
def隐含波动率(价格、股票、行权、时间、Rf):
P=浮动(价格)
S=浮动(股票)
E=浮动(练习)
T=浮动(时间)
r=浮动(Rf)
西格玛=0.01
打印(P、S、E、T、r)
当σ<1时:
d_1=float(float((数学日志(S/E)+(r+(西格玛**2)/2)*T))/float((西格玛*(数学sqrt(T ')))
d_2=浮点(浮点((数学日志(S/E)+(r-(西格玛**2)/2)*T))/float((西格玛*(数学sqrt(T '))))
P_implied=float(S*norm.cdf(d_1)-E*math.exp(-r*T)*norm.cdf(d_2))
如果P-(P_隐含)<0.001:
返回西格玛
西格玛+=0.001
return“无法找到正确的波动率”
打印隐含波动率(15100100,1,0.05)
这个收益率:0.595波动率,应该在0.3203左右。这是一个巨大的差异

我知道这无论如何都不是一个快速的方法,我只是想演示这个原理是如何工作的,但我无法计算出一个好的近似值。
出于某种原因,当我调用该函数时,它给出了实际隐含波动率的非常糟糕的近似值,我使用Matlab程序和以下网页进行了计算:。谁能帮我找出我在哪里犯的错误吗?

在Python2中,
5/2
的结果是
2
。它使用地板分割。要解决这个问题,请将每个数字设为浮点数。在您的
隐含波动率
函数中,将
P=Price
更改为
P=float(Price)
S=Stock
更改为
S=float(Stock)
,等等。

我看到了两个问题,它们都与python无关:

  • 您使用的是
    log1p(x)
    ,它是
    1+x
    的自然对数,而实际上您需要
    log(x)
    ,它是
    x
    的自然对数(参见)

  • 考虑到其他参数,
    100
    的期权价格太高了。尝试计算
    10
    价格的隐含波动率-通过您的程序和链接的计算器,该价格应约为
    0.18


  • 我猜应该是整数运算而不是浮点运算。您是否尝试过将所有变量显式转换为浮点型?所有变量都应该是浮点型,我只是检查了它们。如果其他人卡住了,请尝试此[链接]我刚刚按照您所说的做了,但不幸的是没有任何更改。或者只需先从uuu future uu导入部分执行
    import@MaxNoe:正确;我忘了。谢谢你,你做到了。1)我没有早点注意到这一点是我的错。2) 我想价格是15英镑。但现在它确实起作用了。