Ich verwandelte Blacks Scholes Gleichung in eine Wärmeleitungsgleichung. Ich versuche, explizite Finite-Differenzen-Methode zu verwenden, um diese PDE zu lösen und den Preis einer Call-Option zu erhalten. Ich löse das auch, indem ich die schwarze schols-Gleichung "analytisch" benutze.Finiter Difference für Black Scholes Gleichung nicht genau
Das Problem ist, dass ich im numerischen Ergebnis nicht genauer werden kann. Hier ist mein Python-Code. Hier
ist die Kenntnis von meinem Algorithmus: https://drive.google.com/file/d/0B5h3oewtgjFgdVFpNFJRNTB5LXM/view?usp=sharing
import math
import numpy as np
from scipy.stats import norm
s0 = 15
sigma = 0.2
r = 0.01
t = 1
Xmax = 10
'''B-S price'''
def C(s,k,t):
d1 = (math.log(s/k)+(r+sigma*sigma/2)*t)/(sigma*math.sqrt(t))
d2 = (math.log(s/k)+(r-sigma*sigma/2)*t)/(sigma*math.sqrt(t))
return s*norm.cdf(d1)-math.exp(-r*t)*k*norm.cdf(d2)
print('B-S', C(s0,10,t))
'''Explicit_finite_difference'''
EFD_n_x = 500
EFD_n_t = 100
EFD_k = Xmax/EFD_n_x
EFD_h = t/EFD_n_t
EFD_xx = np.linspace(Xmax,-Xmax, 2 * EFD_n_x + 1)
EFD_xx = EFD_xx[1:2 * EFD_n_x]
def EFD_T0_Bound(x):
return max(math.exp(x)-10*math.exp(-r*t),0)
def EFD_U_Bound(tao):
return math.exp(Xmax)-10*math.exp(-r*(t-tao))
def EFD_L_Bound(tao):
return 0
EFD_T0bound = np.vectorize(EFD_T0_Bound)
EFD_lambda = EFD_h*sigma*sigma/2/EFD_k/EFD_k
EFD_A = (np.eye(2 * EFD_n_x - 1) * (1-2*EFD_lambda)
+ np.eye(2 * EFD_n_x - 1, k=1)*EFD_lambda
+ np.eye(2 * EFD_n_x - 1, k=-1)*EFD_lambda)
EFD_Y = np.zeros(2 * EFD_n_x - 1)
EFD_U = EFD_T0bound(EFD_xx)
for i in range(EFD_n_t):
EFD_Y[0] = EFD_lambda*EFD_U_Bound(EFD_h*i)
EFD_Y[2 * EFD_n_x - 2] = EFD_lambda*EFD_L_Bound(EFD_h*i)
EFD_U = np.dot(EFD_A,EFD_U) + EFD_Y #U_t_i+1 = A * U_t_i + Y
print('Explicit_finite_difference',EFD_U[EFD_n_x - 1 - round(math.log(s0)/EFD_k)])
Verstehst du, warum deine Genauigkeit zurzeit begrenzt wird? –
Ich weiß es nicht. Ich habe versucht, die Anzahl der Punkte in meinem Gitternetz anzupassen, verbessert aber nicht die Genauigkeit. –
Ich bin nicht klar, warum auch, ohne Schritt durch den Code und beobachten Sie die Variablen ändern Zeile für Zeile, die wahrscheinlich der einfachste Weg für Sie ist, das Verständnis zu bekommen, die Sie benötigen –