2017-01-12 3 views
3

Ich versuche die implizite Volatilität der Black-Scholes-Formel mit Python zu berechnen. Ich habe jedoch ein Problem mit meinem Code. Ich erhalte diese Fehlermeldung, wenn ich den Code ausgeführt wird:Ungültiger Wert in true_divide gefunden

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 

und hier ist mein Code:

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) 

wo fprime ist

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) 

und K, Ta, S, Sigma , call_price_list sind Listen und r ist nur eine Zahl.

Ich habe versucht, aus irgendeinem Grund

import numpy as np 
np.seterr(divide='ignore', invalid='ignore') 

aber es war nicht nützlich für mich zu verwenden!

Kann mir bitte jemand meinen Code ansehen und mir sagen, was ist mein Fehler! Vielen Dank im Voraus

+0

Ich denke, 'fprime()' gibt Null (es?). Was ist 'fprime()' Code? Was sind die Werte von "sigmaOld", "s", "k", "r" und "t", wenn der Fehler auftritt? Welche Python-Version verwendest du? – abukaj

+0

Ich habe meine Frage oben bearbeitet, um Ihre Frage zu beantworten. Vielen Dank. – roby

+0

"nur eine Zahl" - "float", "int" oder "numpy.array"? auch, wo 'log' und' sqrt' importiert werden? Die Python-Version könnte ebenfalls wichtig sein. – abukaj

Antwort

1

Druckfehler und Warnungen zu stderr ist Python-Standardfunktionalität.

Sie erhalten diese Warnung, weil Sie durch Null dividieren, d. H. Die fprime gibt Null zurück.


Wenn Sie die Warnung mit warning filters zu unterdrücken wollen:

np.seterr(divide='ignore') 

Es wird sagen Numpy die Division durch Null Warnung zu ignorieren - alle zulässigen Parameter für seterr.

+0

immer noch nichts! danke – roby

+0

was hast du nicht bekommen? Die Warnung ist, weil fprime 0 zurückgibt, und Sie die Rückgabe von bs_option_call durch 0 teilen - oben habe ich einen Weg geteilt, diese Warnung zu unterdrücken, wenn Sie besorgt sind, wenn fprime wirklich 0 zurückgibt, haben Sie einen Druck in fprime just vorher die Rückgabeanweisung. –

Verwandte Themen