根据答案中的注释,我重新编写了下面的代码(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。有谁能帮我找出我在哪里犯的错误吗?
我看到有两个问题,没有一个与python直接相关:
你使用的是
log1p(x)
,这是1+x
的自然对数,而你实际上想要的是log(x)
,这是x
(cf.Wikipedia)的自然对数。考虑到其他参数,期权价格
100
会非常高。尝试计算10
价格的隐含波动率-这应该是0.18
左右,由您的程序和您链接的计算器。在Python2中,
5 / 2
的结果是2
。它使用楼层划分。要解决这个问题,把每个数字都变成浮点数。在implied_volatility
函数中,将P = Price
更改为P = float(Price)
,将S = Stock
更改为S = float(Stock)
,等等相关问题 更多 >
编程相关推荐