2016-04-09 22 views
1

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)]) 

+0

Verstehst du, warum deine Genauigkeit zurzeit begrenzt wird? –

+0

Ich weiß es nicht. Ich habe versucht, die Anzahl der Punkte in meinem Gitternetz anzupassen, verbessert aber nicht die Genauigkeit. –

+0

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 –

Antwort

0

meiner Meinung nach, da Sie eine explizite Regelung verwenden (das ist nicht unconditionnaly stable), Sie kann nicht Ihre Anzahl der Asset-Schritt gesetzt und deine Zeitangabe tritt unabhängig auf. normalerweise verbinden Leute sie zusammen mit Volatilität, um das Schema stabil zu halten