конечная разность для уравнения Блэка-Шоулза не точна

Я преобразовал уравнение Блэкса-Шоулза в уравнение теплоты. Я пытаюсь использовать явный метод конечных разностей, чтобы решить это УЧП и получить цену опциона колл. Я также решаю это, используя уравнение Блэка Шолса «аналитически».

Проблема в том, что я не могу получить более точный численный результат. Вот мой код 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)])


person violet moon    schedule 09.04.2016    source источник
comment
Вы понимаете, почему ваша точность сейчас ограничена?   -  person Brad Thomas    schedule 09.04.2016
comment
Я не знаю. Я попытался настроить количество точек в сетке сетки, но это не повысило точность.   -  person violet moon    schedule 09.04.2016
comment
Я тоже не понимаю, почему, не просматривая код и не наблюдая, как переменные меняются строка за строкой, что, вероятно, является самым простым способом получить нужное вам понимание.   -  person Brad Thomas    schedule 09.04.2016
comment
Я считаю, что мой код правильный. Я предполагаю, что это может быть связано с анализом ошибок числовых УЧП.   -  person violet moon    schedule 09.04.2016


Ответы (1)


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

person lampalork    schedule 05.11.2016