Я пытаюсь отменить волатильность Black-Scholes из финансовых опционов. Если данные содержат параметры, для которых неявная волатильность не может быть найдена, это приведет к тому, что все результаты будут равны начальному предположению. Смотрите следующий примерScipy fsolve: решение не отменяет все допустимые решения
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)))
дает
RuntimeWarning: The iteration is not making good progress, as measured by the
improvement from the last ten iterations.
warnings.warn(msg, RuntimeWarning)
[ 0.1 0.1 0.1 0.1 0.1]
Делая ту же операцию с Matlab или Клен я знаю, что ни одно решение не может быть найдено для первого варианта. Если я исключаю, что один, такой, что
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
вместо моего первоначального предположения и не беспорядок остальные решения.