Python Scipy fsolve:没有解决方案会使所有有效的解决方案无效

Python Scipy fsolve:没有解决方案会使所有有效的解决方案无效,python,scipy,Python,Scipy,我试图从金融期权数据中剔除Black-Scholes隐含的波动性。如果数据包含无法找到隐含波动率的期权,这将使所有结果等于初始猜测。请参见下面的示例 from scipy.optimize import fsolve import numpy as np from scipy.stats import norm S = 1293.77 r = 0.05 K = np.array([1255, 1260, 1265, 1270, 1275]) T = 2./365 price = np.arra

我试图从金融期权数据中剔除Black-Scholes隐含的波动性。如果数据包含无法找到隐含波动率的期权,这将使所有结果等于初始猜测。请参见下面的示例

from scipy.optimize import fsolve
import numpy as np
from scipy.stats import norm

S = 1293.77
r = 0.05
K = np.array([1255, 1260, 1265, 1270, 1275])
T = 2./365
price = np.array([38.9, 34.35, 29.7, 25.35, 21.05])

def black_scholes(S, K, r, T, sigma):
    d1 = (np.log(S / K) + (r + sigma ** 2 / 2) * T) / (sigma * np.sqrt(T))
    d2 = d1 - sigma * np.sqrt(T)
    return S * norm.cdf(d1) - K * np.exp(-r * T) * norm.cdf(d2)

volatility = lambda x: black_scholes(S, K, r, T, x) - price

print fsolve(volatility, np.repeat(0.1, len(K)))
给予

通过使用Matlab或Maple执行相同的操作,我知道无法找到第一个选项的解决方案。如果我排除了那个,那么

K = np.array([1260, 1265, 1270, 1275])
price = np.array([34.35, 29.7, 25.35, 21.05])
我确实得到了正确的结果

[ 0.19557092  0.20618568  0.2174149   0.21533821]

因此,如果找不到解决方案,我希望
fsolve
返回
NaN
,而不是我最初的猜测,并且不会弄乱其余的解决方案。

使用
full\u output
参数告知返回更多信息,并在返回时检查
ier
的值。比如说,

sol, info, ier, msg = fsolve(volatility, np.repeat(0.1, len(K)), full_output=True)

if ier != 1:
    print "ier = %d" % (ier,)
    print msg
else:
    print "sol =", sol
你说:

…如果找不到解决方案,我希望fsolve返回NaN而不是我最初的猜测,并且不会搞乱其余的解决方案


fsolve
无法知道您正在解决的问题实际上是一组解耦的问题。你给了它一个n维的问题。它要么成功,要么无法找到该问题的解决方案。

使用
full\u output
参数告知返回更多信息,并在返回时检查
ier
的值。比如说,

sol, info, ier, msg = fsolve(volatility, np.repeat(0.1, len(K)), full_output=True)

if ier != 1:
    print "ier = %d" % (ier,)
    print msg
else:
    print "sol =", sol
你说:

…如果找不到解决方案,我希望fsolve返回NaN而不是我最初的猜测,并且不会搞乱其余的解决方案


fsolve
无法知道您正在解决的问题实际上是一组解耦的问题。你给了它一个n维的问题。它要么成功,要么无法找到该问题的解决方案。

使用
full\u output
参数告知返回更多信息,并在返回时检查
ier
的值。比如说,

sol, info, ier, msg = fsolve(volatility, np.repeat(0.1, len(K)), full_output=True)

if ier != 1:
    print "ier = %d" % (ier,)
    print msg
else:
    print "sol =", sol
你说:

…如果找不到解决方案,我希望fsolve返回NaN而不是我最初的猜测,并且不会搞乱其余的解决方案


fsolve
无法知道您正在解决的问题实际上是一组解耦的问题。你给了它一个n维的问题。它要么成功,要么无法找到该问题的解决方案。

使用
full\u output
参数告知返回更多信息,并在返回时检查
ier
的值。比如说,

sol, info, ier, msg = fsolve(volatility, np.repeat(0.1, len(K)), full_output=True)

if ier != 1:
    print "ier = %d" % (ier,)
    print msg
else:
    print "sol =", sol
你说:

…如果找不到解决方案,我希望fsolve返回NaN而不是我最初的猜测,并且不会搞乱其余的解决方案

fsolve
无法知道您正在解决的问题实际上是一组解耦的问题。你给了它一个n维的问题。它要么成功,要么无法找到解决问题的办法