2014-02-09 6 views
0

Я пытаюсь отменить волатильность 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 вместо моего первоначального предположения и не беспорядок остальные решения.

ответ

3

Используйте аргумент full_output, чтобы сообщить fsolve, чтобы вернуть дополнительную информацию, и проверить значение 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-мерную проблему. Либо он преуспевает, либо не находит решения этой проблемы.

Смежные вопросы