Этот пример получает дифференциальное уравнение с частными производными, которое описывает ожидаемую конечную цену актива, цена которого является стохастическим процессом, заданным стохастическим дифференциальным уравнением.
Задействованы следующие шаги:
Определите параметры модели, используя стохастические дифференциальные уравнения
Применить правило Ито
Решение уравнения Фейнмана-Каца
Вычисление ожидаемого времени для продажи актива
Модель для цены основного средства X(t) заданный во временном интервале [0,T] является стохастическим процессом, заданным стохастическим дифференциальным уравнением вида , где B(t) - процесс Винера с параметром единичного отклонения.
Создайте символьную переменную T и следующие символические функции:
r(t) является непрерывной функцией, представляющей спотовую процентную ставку. Эта ставка определяет коэффициент дисконтирования для окончательного вознаграждения в то время T.
u(t,x) - ожидаемое значение дисконтированной будущей цены, рассчитанное как при условии X(t) = x.
и дрейф и диффузия стохастического процесса X(t).
syms mu(t, X) sigma(t, X) r(t, X) u(t, X) T
Согласно теореме Фейнмана-Каца, u удовлетворяет дифференциальному уравнению с частными производными с конечным условием во время T.
eq = diff(u, t) + sigma^2*diff(u, X, X)/2 + mu*diff(u, X) - u*r;
Численный решатель pdepe работает с начальными условиями. Чтобы преобразовать окончательное условие в начальное условие, примените обращение времени путем установки v(t, X) = u(T - t, X).
syms v(t, X) eq2 = subs(eq, {u, t}, {v(T - t, X), T - t}); eq2 = feval(symengine, 'rewrite', eq2, 'diff')
eq2 =
Решатель pdepe требует дифференциального уравнения с частными производными в следующей форме. Здесь коэффициенты c, f, и s являются функциями x, t, v, и .
Чтобы иметь возможность решить уравнение eq2 с pdepe решатель, map eq2 к этой форме. Во-первых, извлеките коэффициенты и условия eq2.
syms dvt dvXX eq3 = subs(eq2, {diff(v, t), diff(v, X, X)}, {dvt, dvXX}); [k,terms] = coeffs(eq3, [dvt, dvXX])
k =
terms =
Теперь можно переписать eq2 как k(1)*terms(1) + k(2)*terms(2) + k(3)*terms(3) = 0. Перемещая член с производной по времени в левую сторону уравнения, вы получаете
Вручную интегрируйте правую сторону по частям. Результатом является
Поэтому писать eq2 в форме, подходящей для pdepe, используйте следующие параметры:
c = 1; f = k(2) * diff(v, X); s = k(3) - diff(v, X) * diff(k(2), X);
Цены основных средств следуют мультипликативному процессу. То есть логарифм цены может быть описан в терминах SDE, но ожидаемое значение самой цены представляет интерес, потому что она описывает прибыль, и, таким образом, нам нужен SDE для последней.
В целом, если стохастический процесс X дается в терминах SDE, тогда правило Ито говорит, что преобразованный процесс G(t, X) удовлетворяет
Мы предполагаем, что логарифм цены задается одномерной аддитивной броуновским движением, то есть mu и sigma являются постоянными. Задайте функцию, которая применяет правило Ито, и используйте ее, чтобы преобразовать аддитивное броуновское движение в геометрическое броуновское движение.
ito = @(mu, sigma, G, t, X) ... deal( mu * diff(G, X) + sigma^2/2 * diff(G, X, X) + diff(G, t), ... diff(G, X) * sigma ); syms mu0 sigma0 [mu1, sigma1] = ito(mu0, sigma0, exp(X), t, X)
mu1 =
sigma1 =
Замените exp(X) по Y.
syms Y
mu1 = subs(mu1, X, log(Y));
sigma1 = subs(sigma1, X, log(Y));
f = f(t, log(Y));
s = s(t, log(Y));Для простоты примите, что процентная ставка равна нулю. Это особый случай, также известный как обратное уравнение Колмогорова.
r0 = 0;
c = subs(c, {mu, sigma}, {mu1, sigma1});
s = subs(s, {mu, sigma, r}, {mu1, sigma1, r0});
f = subs(f, {mu, sigma}, {mu1, sigma1});Прежде чем можно будет преобразовать символьные выражения в указатели на функцию MATLAB, необходимо заменить вызовы функций, такие как diff(v(t, X), X) и v(t, X), с переменными. Можно использовать любые допустимые имена переменного MATLAB.
syms dvdx V; dvX = diff(v, X); c = subs(c, {dvX, v}, {dvdx, V}); f = subs(f, {dvX, v}, {dvdx, V}); s = subs(s, {dvX, v}, {dvdx, V});
Для плоской геометрии (симметрия перемещения) задайте следующее значение:
m = 0;
Кроме того, присвойте числовые значения символьным параметрам.
muvalue = 0;
sigmavalue = 1;
c0 = subs(c, {mu0, sigma0}, {muvalue, sigmavalue});
f0 = subs(f, {mu0, sigma0}, {muvalue, sigmavalue});
s0 = subs(s, {mu0, sigma0}, {muvalue, sigmavalue});Использование matlabFunction для создания указателя на функцию. Передайте коэффициенты c0, f0, и s0 в форме, требуемой pdepe, а именно, указатель на функцию с тремя выходными аргументами.
FeynmanKacPde = matlabFunction(c0, f0, s0, 'Vars', [t, Y, V, dvdx])FeynmanKacPde = function_handle with value:
@(t,Y,V,dvdx)deal(1.0,0.0,0.0)
В качестве последнего условия примите отображение тождеств. То есть выплата в момент определяется самой ценой актива. Вы можете изменить эту линию в порядок, чтобы исследовать производные инструменты.
FeynmanKacIC = @(x) x;
Численное решение PDE может применяться только к конечной области. Поэтому необходимо задать граничное условие. Предположим, что актив продается в момент, когда его цена поднимается выше или падает ниже определенного предела, и, следовательно, решение v должен удовлетворять x - v = 0 в граничных точках x. Можно выбрать другое граничное условие, например, можно использовать v = 0 для моделирования опций нокаута. Нули во втором и четвертом выходах указывают, что граничное условие не зависит от .
FeynmanKacBC = @(xl, vl, xr, vr, t) ...
deal(xl - vl, 0, xr - vr, 0);Выберите сетку пробел, которая является областью значений значений цены x. Установите левый контур равного нуля: она не достижима геометрической случайной ходьбой. Установите правый контур равной единице: когда цена актива достигает этого предела, актив продается.
xgrid = linspace(0, 1, 101);
Выберите временную сетку. Из-за обращения времени, примененного в начале, это обозначает время, оставшееся до последнего времени T.
tgrid = linspace(0, 1, 21);
Решить уравнение.
sol = pdepe(m,FeynmanKacPde,FeynmanKacIC,FeynmanKacBC,xgrid,tgrid);
Постройте график решения. Ожидаемая цена продажи зависит почти линейно от цены в то время t, а также слабо на t.
surf(xgrid, tgrid, sol) title('Expected selling price of asset'); xlabel('price'); ylabel('time'); zlabel('expected final price');

Состояние геометрического броуновского движения с дрейфом во время t является lognormally распределенной случайной переменной с ожидаемым значением умножает его начальное значение. Это описывает ожидаемую цену продажи актива, который никогда не продается из-за достижения предела.
Expected = transpose(exp(tgrid./2)) * xgrid;
Разделение решения, полученного выше, на ожидаемое значение показывает, сколько прибыли потеряно при преждевременной продаже на пределе.
sol2 = sol./Expected; surf(xgrid, tgrid, sol2) title('Ratio of expected final prices: with / without sales order at x=1') xlabel('price'); ylabel('time'); zlabel('ratio of final prices');

Для примера постройте график отношения ожидаемой выплаты актива, для которого был размещен предела порядка продажи, и того же актива без порядка продажи в течение временного интервала T, как функцию t. Рассмотрим случай предела порядка в два и четыре раза выше текущей цены, соответственно.
plot(tgrid, sol2(:, xgrid == 1/2)); hold on plot(tgrid, sol2(:, xgrid == 1/4)); legend('Limit at two times current price', 'Limit at four times current price'); xlabel('timespan the order is valid'); ylabel('ratio of final prices: with / without sales order'); hold off

Это результат учебника, что ожидаемое время выхода, когда предел достигнут и актив продан, определяется следующим уравнением:
syms y(X)
exitTimeEquation(X) = subs(eq, {r, u}, {0, y(X)}) == -1exitTimeEquation(X) =
В сложение, y должно быть нулем на контурах. Для mu и sigma, вставьте фактический стохастический процесс под фактор:
exitTimeGBM = subs(subs(exitTimeEquation, {mu, sigma}, {mu1, sigma1}), Y, X)exitTimeGBM(X) =
Решите эту задачу для произвольных границ интервала a и b.
syms a b exitTime = dsolve(exitTimeGBM, y(a) == 0, y(b) == 0)
exitTime =
Потому что вы не можете заменить mu0 = 0 непосредственно вычислите предел в mu0 -> 0 вместо этого.
L = limit(subs(exitTime, sigma0, sigmavalue), mu0, muvalue)
L =
L не определено в a = 0. Установите предположение, что 0 < X < 1.
assume(0 < X & X < 1)
Использование значения b = 1 для правой границы вычислите предел.
limit(subs(L, b, 1), a, 0, 'Right')ans =