2016-04-09 2 views
1

Я преобразовал уравнение Блэша Скоулза в уравнение теплоты. Я пытаюсь использовать явный метод конечных разностей для решения этого PDE и получения цены опциона на вызов. Я также решаю для этого, используя уравнение «чёрные» schols «аналитически».конечная разница для уравнения Чёрного Скоулза неточна

Проблема в том, что я не могу получить более точное числовое значение. Вот мой код Python.

Вот нота моего алгоритма: 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

Вы понимаете, почему ваша точность в настоящее время ограничена? –

+0

Не знаю. Я попытался настроить количество точек в сетке сетки, но это не повышает точность. –

+0

Я не совсем понимаю, почему, не перешагнув код и наблюдая, как переменные меняются по строкам, что, вероятно, самый простой способ получить ваше понимание. –

ответ

0

на мой взгляд, так как вы используете явную схему (то есть не unconditionnaly стабильный), вы не можете установить нб шага активов и ваш nb временного шага незаметно. обычно люди связывают их вместе с волатильностью, чтобы сохранить стабильность схемы.