【发布时间】:2017-01-12 11:53:05
【问题描述】:
我正在尝试使用 python 计算 Black Scholes 公式的隐含波动率。但是,我的代码有问题。运行代码时,我不断收到此错误消息:
RuntimeWarning: divide by zero encountered in true_divide
v = sigmaOld - bs_option_call(v, s, k, r, t, call_price1)/fprime(sigmaOld, s, k, r, t)e here
这是我的代码:
while True:
for (v, k, s, t, call_price1) in zip(sigma, K, S, Ta, call_price_list):
sigmaOld = v
v = sigmaOld - bs_option_call(v, s, k, r, t, call_price1) / fprime(sigmaOld, s, k, r, t)
if scipy.absolute( v - sigmaOld ) < epsilon:
break
print(sigma)
fprime 在哪里
def fprime(sigma, S, K, r, T):
logSoverK = log(S / K)
numerd1 = logSoverK + (r + sigma**2 / 2) * T
d1 = numerd1 / (sigma*sqrt(T))
return S * sqrt(T) * norm.pdf(d1) * exp(-r * T)
而 K、Ta、S、sigma、call_price_list 是列表,而 r 只是一个数字。
我尝试使用
import numpy as np
np.seterr(divide='ignore', invalid='ignore')
但由于某种原因它对我没有用!
任何人都可以看看我的代码并告诉我我的错误是什么! 非常感谢提前
【问题讨论】:
-
我猜
fprime()返回零(es?)。fprime()代码是什么?另外,当错误发生时,sigmaOld、s、k、r和t的值是多少?你用的是哪个python版本? -
我在上面编辑了我的问题来回答你的问题。谢谢。
-
“只是一个数字” -
float、int或numpy.array?另外,log和sqrt是从哪里导入的? Python 版本可能也很重要。 -
float 我从 scipy 导入了 log 和 sqrt。我正在使用 python 3.5
标签: python