【问题标题】:Invalid value encountered in true_divide在 true_divide 中遇到无效值
【发布时间】: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() 代码是什么?另外,当错误发生时,sigmaOldskrt 的值是多少?你用的是哪个python版本?
  • 我在上面编辑了我的问题来回答你的问题。谢谢。
  • “只是一个数字” - floatintnumpy.array?另外,logsqrt 是从哪里导入的? Python 版本可能也很重要。
  • float 我从 scipy 导入了 log 和 sqrt。我正在使用 python 3.5

标签: python


【解决方案1】:

向 stderr 打印错误和警告是 Python 的默认功能。

您收到此警告是因为您除以零,即 fprime 返回零。


如果您想使用warning filters 抑制警告:

np.seterr(divide='ignore')

它会告诉 Numpy 忽略除以零警告 - seterr 的所有允许参数。

【讨论】:

  • 你没有得到什么?警告是因为 fprime 返回 0,并且您将 bs_option_call 的返回除以 0 - 上面我分享了一种抑制此警告的方法,如果您担心 fprime 是否真的返回 0,请在 fprime 之前打印返回语句。
猜你喜欢
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 2018-02-04
  • 2017-07-14
  • 2019-06-12
  • 1970-01-01
相关资源
最近更新 更多