Ценообразование Опции американской корзины от Симуляция Монте-Карло

В этом примере показано, как смоделировать жировое поведение возвратов активов и оценить влияние альтернативных совместных распределений на цены опций корзины. Используя различные реализации разделяемого многомерного процесса Geometric Brownian Motion (GBM), часто называемого многомерной рыночной моделью, пример моделирует нейтральные к риску пути выборки портфеля индекса капитала и опции размещения корзины цен с использованием метода Longstaff & Schwartz.

Кроме сложения, этот пример также иллюстрирует основные функции архитектуры Стохастического дифференциального уравнения (SDE), включая

  • Настроенные функции генерации случайных чисел, которые сравнивают броуновское движение и брауновские копулы

  • Функции обработки в конце периода, которые формируют корзину индексов капитала и ценовые американские опции на базовой корзине, основанные на методе наименьших квадратов Longstaff & Schwartz

  • Кусочно- распределения вероятностей и теория экстремальных значений (EVT)

В этом примере также освещаются важные вопросы волатильности и масштабирования процентных ставок. Это иллюстрирует, как эквивалентные результаты могут быть достигнуты путем работы с ежедневными или годовыми данными. Для получения дополнительной информации о EVT и копулах, смотрите Использование теории экстремальных значений и Copulas для оценки рыночного риска (Econometrics Toolbox).

Обзор среды моделирования

Конечная цель этого примера состоит в сравнении цен опций корзины, полученных из различных процессов шума. Первый процесс шума является традиционной броуновской моделью движения, индекс индексной цены портфеля управляется коррелированными гауссовскими случайными рисунками. В качестве альтернативы, бенчмарк Броуновского движения сравнивается с шумовыми процессами, управляемыми t-копулами Гауссова и Стьюдента, называемыми в совокупности брауновской копулой.

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

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

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

Моделируемая модель рынка, нейтральная к рискам

$$dX_t = r X_tdt + \sigma X_t dW_t$$

где безрисковая ставка, r, принято постоянным в течение срока службы опции. Поскольку это разделяемая многомерная модель, безрисковый возврат является диагональной матрицей, в которой тот же безрисковый возврат применяется ко всем индексам. Дивидендные выражений игнорируются, чтобы упростить модель и связанный с ней набор данных.

Напротив, спецификация матрицы воздействия, sigma, зависит от того, как моделируется движущий источник неопределенности. Можно смоделировать его непосредственно как броуновское движение (коррелированные Гауссовы случайные числа, неявно сопоставленные с гауссовыми полями) или смоделировать его как броуновскую копулу (коррелированные Гауссовы или t случайных чисел, явно сопоставленных с полупараметрическими полями).

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

После моделирования путей расчета опции оцениваются методом регрессии методом наименьших квадратов Longstaff & Schwartz (см. «Оценка американских опций по симуляции: Простой подход методом наименьших квадратов», «Обзор финансовых исследований», весна 2001 г.). Этот подход использует наименьшие квадраты, чтобы оценить ожидаемую выплату опции, если она не выполняется немедленно. Это происходит путем регрессии дисконтированных опций денежных потоков, полученных в будущем, на текущую цену нижестоящего поставщика, связанную со всеми путями расчета денежных средств. Функция продолжения оценивается простым полиномом третьего порядка, в котором все денежные потоки и цены в регрессии нормализованы опционной ударной ценой, улучшающей числовую стабильность.

Импорт поддерживающего набора исторических наборов данных

Загрузите ежедневный исторический набор данных 3-месячного Euribor, даты торгов, охватывающие интервал, 07-Feb-2001 к 24-Apr-2006, и уровни закрывающего индекса следующих репрезентативных индексов капитала с большой капитализацией:

  • TSX Composite (Канада)

  • CAC 40 (Франция)

  • DAX (Германия)

  • Nikkei 225 (Япония)

  • FTSE 100 (ВЕЛИКОБРИТАНИЯ)

  • S&P 500 (США)

clear
load Data_GlobalIdx2
dates = datetime(dates,'ConvertFrom','datenum');

Следующие графики иллюстрируют эти данные. В частности, графики показывают относительные изменения цен по каждому индексу и беспроцентному процентному прокси Euribor. Первоначальный уровень каждого индекса был нормирован к единице для облегчения сравнения относительной эффективности по сравнению с историческими записями.

nIndices  = size(Data,2)-1;     % # of indices

prices = Data(:,1:end-1);

yields = Data(:,end);             % daily effective yields
yields = 360 * log(1 + yields);   % continuously-compounded, annualized yield

plot(dates, ret2tick(tick2ret(prices,'Method','continuous'),'Method','continuous'))

xlabel('Date')
ylabel('Index Value')
title ('Normalized Daily Index Closings')
legend(series{1:end-1}, 'Location', 'NorthWest')

plot(dates, 100 * yields)
xlabel('Date')
ylabel('Annualized Yield (%)')
title('Risk Free Rate (3-Month Euribor Continuously-Compounded)')

Теория экстремальной ценности и кусочно-линейные Распределения вероятностей

Чтобы подготовиться к моделированию копулы, охарактеризуйте индивидуально распределение возвратов каждого индекса. Несмотря на то, что распределение каждой серии возврата может быть охарактеризовано параметрически, полезно подгонять полуопараметрическую модель с использованием кусочно-линейного распределения с обобщенными хвостами Парето. Это использует Теорию Экстремальных Значений, чтобы лучше охарактеризовать поведение в каждом хвосте.

Программное обеспечение Statistics and Machine Learning Toolbox™ в настоящее время поддерживает два одномерных распределения вероятностей, связанных с EVT, статистическим инструментом для моделирования жирного поведения финансовых данных, таких как возвраты активов и страховые потери:

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

  • Обобщенное распределение Парето (GP), использует технику моделирования, известный как распределение превышений или peaks над пороговым методом. Этот подход сортирует исторический набор данных и соответствует величине, на которую те наблюдения, которые превышают заданный порог, распределению GP.

В следующем анализе описывается распределение Парето, которое более широко используется в приложениях управления рисками.

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

В конечном счете, копула будет использоваться, чтобы сгенерировать случайные числа для управления симуляциями. CDF и обратные преобразования CDF будут захватывать волатильность моделируемых возвратов как часть срока диффузии SDE. Средний возврат каждого индекса определяется безрисковой скоростью и включена в дрейф SDE. Следующий сегмент кода центрирует возвраты (то есть извлекает среднее значение) каждого индекса.

Поскольку в следующем анализе используется теория экстремального значения для характеристики распределения каждого ряда возврата индекса собственного капитала, полезно изучить детали для конкретной страны:

returns = tick2ret(prices,'Method','continuous');        % convert prices to returns
returns = returns - mean(returns);  % center the returns
index   = 3;                                       % Germany stored in column 3

plot(dates(2:end), returns(:,index))
xlabel('Date')
ylabel('Return')
title(['Daily Logarithmic Centered Returns: ' series{index}])

Обратите внимание, что этот сегмент кода может быть изменен, чтобы изучить детали для любой страны.

Используя эти центрированные возвраты, оцените эмпирический, или непараметрический, CDF каждого индекса с Гауссовым ядром. Это сглаживает оценки CDF, устраняя диаграмму шаблона лестничной клетки не смоченных выборок CDF. Хотя непараметрические оценки CDF ядра хорошо подходят для внутреннего пространства распределения, где большая часть данных найдена, они, как правило, плохо выполняются при применении к верхнему и нижнему хвостам. Чтобы лучше оценить хвосты распределения, примените EVT к возвратам, которые падают в каждом хвосте.

В частности, найдите верхний и нижний пороги, так что 10% возвратов будут зарезервированы для каждого хвоста. Затем подгоняйте величину, на которую экстремальные возвраты в каждом хвосте падают выше связанного порога, к распределению Парето по максимальной вероятности.

Следующий сегмент кода создает один объект типа paretotails для каждого индекса возврата ряда. Эти хвостовые объекты Парето инкапсулируют оценки параметрического нижнего хвоста Парето, непараметрического сглаженного ядром внутреннего пространства и параметрического верхнего хвоста Парето, чтобы создать составной полупараметрический CDF для каждого индекса.

tailFraction = 0.1;               % decimal fraction allocated to each tail
tails = cell(nIndices,1);  % cell array of Pareto tail objects

for i = 1:nIndices
    tails{i} = paretotails(returns(:,i), tailFraction, 1 - tailFraction, 'kernel');
end

Получившееся кусочное распределение объект позволяет интерполяцию внутри CDF и экстраполяцию ( вычисление функции) в каждом хвосте. Экстраполяция позволяет оценивать величины вне исторической записи, что бесценно для приложений управления рисками.

Хвостовые объекты Парето также обеспечивают методы для оценки CDF и обратного CDF (функции квантования) и для запроса совокупных вероятностей и квантований контуров между каждым сегментом кусочно-линейного распределения.

Теперь, когда были оценены три отдельные области кусочно-линейного распределения, графически конкатенируйте и отобразите результат.

Следующий код вызывает CDF и обратные методы CDF для объекта, представляющего интерес, с данными, отличными от тех, на которых основана подгонка. Методы, на которые ссылаются, имеют доступ к установленному состоянию. Теперь они вызываются, чтобы выбрать и проанализировать определенные области кривой вероятности, действуя как мощный механизм фильтрации данных.

Для ссылки, график также включает нулевое Гауссово CDF того же стандартного отклонения. В определенной степени изменение цен опций отражает степень, в которой распределение каждого актива отличается от этой нормальной кривой.

minProbability = cdf(tails{index}, (min(returns(:,index))));
maxProbability = cdf(tails{index}, (max(returns(:,index))));

pLowerTail = linspace(minProbability  , tailFraction    , 200); % lower tail
pUpperTail = linspace(1 - tailFraction, maxProbability  , 200); % upper tail
pInterior  = linspace(tailFraction    , 1 - tailFraction, 200); % interior

plot(icdf(tails{index}, pLowerTail), pLowerTail, 'red'  , 'LineWidth', 2)
hold on
grid on
plot(icdf(tails{index}, pInterior) , pInterior , 'black', 'LineWidth', 2)
plot(icdf(tails{index}, pUpperTail), pUpperTail, 'blue' , 'LineWidth', 2)

limits = axis;
x = linspace(limits(1), limits(2));
plot(x, normcdf(x, 0, std(returns(:,index))), 'green', 'LineWidth', 2)

fig = gcf;
fig.Color = [1 1 1];
hold off
xlabel('Centered Return')
ylabel('Probability')
title (['Semi-Parametric/Piecewise CDF: ' series{index}])
legend({'Pareto Lower Tail' 'Kernel Smoothed Interior' ...
        'Pareto Upper Tail' 'Gaussian with Same \sigma'}, 'Location', 'NorthWest')

Нижняя и верхняя области хвоста, отображаемые красным и синим цветом, соответственно, подходят для экстраполяции, в то время как сглаженный ядром интерьер, в чёрном цвете, подходит для интерполяции.

Калибровка Копулы

Программное обеспечение Statistics and Machine Learning Toolbox включает функциональность, которая калибрует и имитирует Гауссовы и t копулы.

Используя дневные возвраты, оцените параметры Гауссовых и t копул с помощью функции copulafit. Поскольку t копула становится Гауссовой копулой, когда скалярный параметр степени свободы (DoF) становится бесконечно большим, эти две копулы действительно имеют одно и то же семейство и, следовательно, имеют общую линейную матрицу корреляции как фундаментальный параметр.

Хотя калибровка линейной корреляционной матрицы Гауссовой копулы проста, калибровка t-копулы не имеет значения. По этой причине программное обеспечение Statistics and Machine Learning Toolbox предлагает два метода калибровки t-копулы:

  • Первый метод выполняет максимальную оценку правдоподобия (MLE) в двухэтапном процессе. Внутренний шаг максимизирует логарифмическую правдоподобность относительно линейной корреляционной матрицы, учитывая фиксированное значение для степеней свободы. Эта условная максимизация помещена в 1-D максимизацию относительно степеней свободы, таким образом максимизируя логарифмическую правдоподобность по всем параметрам. Функция, максимизированная на этом внешнем шаге, известна как логарифмическая логарифмическая правдоподобность профиля для степеней свободы.

  • Второй метод получают путем дифференцирования функции логарифмической правдоподобности относительно линейной корреляционной матрицы, принимая, что степени свободы являются фиксированной константой. Получившееся выражение является нелинейным уравнением, которое может быть решено итеративно для корреляционной матрицы. Этот метод аппроксимирует логарифмическую правдоподобность профиля для параметра степеней свободы для больших размеров выборки. Этот метод обычно значительно быстрее, чем истинный метод максимальной вероятности, изложенный выше; однако вы не должны использовать его с маленькими или умеренными размерами выборки, поскольку оценки и доверительные пределы могут быть неточными.

Когда однородные вариации преобразуются эмпирическим CDF каждого запаса, метод калибровки часто известен как каноническая максимальная правдоподобность (CML). Следующий сегмент кода сначала преобразует дневной центрированные возвраты к равномерным изменениям с помощью кусочно-полупараметрических CDF, выведенных выше. Затем он подгоняет Гауссов и t копул к преобразованным данным:

U = zeros(size(returns));

for i = 1:nIndices
    U(:,i) = cdf(tails{i}, returns(:,i));    % transform each margin to uniform
end

options     = statset('Display', 'off', 'TolX', 1e-4);
[rhoT, DoF] = copulafit('t', U, 'Method', 'ApproximateML', 'Options', options);
rhoG        = copulafit('Gaussian', U);

Оцененные матрицы корреляции довольно похожи, но не идентичны.

corrcoef(returns)  % linear correlation matrix of daily returns
ans =

    1.0000    0.4813    0.5058    0.1854    0.4573    0.6526
    0.4813    1.0000    0.8485    0.2261    0.8575    0.5102
    0.5058    0.8485    1.0000    0.2001    0.7650    0.6136
    0.1854    0.2261    0.2001    1.0000    0.2295    0.1439
    0.4573    0.8575    0.7650    0.2295    1.0000    0.4617
    0.6526    0.5102    0.6136    0.1439    0.4617    1.0000

rhoG               % linear correlation matrix of the optimized Gaussian copula
rhoG =

    1.0000    0.4745    0.5018    0.1857    0.4721    0.6622
    0.4745    1.0000    0.8606    0.2393    0.8459    0.4912
    0.5018    0.8606    1.0000    0.2126    0.7608    0.5811
    0.1857    0.2393    0.2126    1.0000    0.2396    0.1494
    0.4721    0.8459    0.7608    0.2396    1.0000    0.4518
    0.6622    0.4912    0.5811    0.1494    0.4518    1.0000

rhoT               % linear correlation matrix of the optimized t copula
rhoT =

    1.0000    0.4671    0.4858    0.1907    0.4734    0.6521
    0.4671    1.0000    0.8871    0.2567    0.8500    0.5122
    0.4858    0.8871    1.0000    0.2326    0.7723    0.5877
    0.1907    0.2567    0.2326    1.0000    0.2503    0.1539
    0.4734    0.8500    0.7723    0.2503    1.0000    0.4769
    0.6521    0.5122    0.5877    0.1539    0.4769    1.0000

Обратите внимание на относительно низкий параметр степени свободы, полученный из калибровки t копулы, что указывает на значительный отказ от Гауссовой ситуации.

DoF                % scalar degrees of freedom parameter of the optimized t copula
DoF =

    4.8613

Симуляция Копулы

Теперь, когда параметры копулы были оценены, моделируйте совместно зависимые равномерные изменения с помощью функции copularnd.

Затем, экстраполируя хвосты Парето и интерполируя сглаженное внутреннее пространство, преобразуйте однородные вариаты, выведенные из copularnd к ежедневным центрированным возвратам через обратный CDF каждого индекса. Эти моделируемые центрированные возвраты согласуются с результатами, полученными из исторического набора данных. Возвраты приняты независимыми по времени, но в любой момент времени обладают зависимостью и ранговой корреляцией, вызванной данной копулой.

Следующий сегмент кода иллюстрирует структуру зависимости путем симуляции центрированных возвратов с помощью t-копулы. Затем строится график 2-D графика поля точек с маргинальными гистограммами для французского CAC 40 и немецкого DAX с помощью Statistics and Machine Learning Toolbox scatterhist функция. Французские и немецкие индексы были выбраны просто потому, что они имеют самую высокую корреляцию с имеющимися данными.

nPoints = 10000;                          % # of simulated observations

s = RandStream.getGlobalStream();
reset(s)

R = zeros(nPoints, nIndices);             % pre-allocate simulated returns array
U = copularnd('t', rhoT, DoF, nPoints);   % simulate U(0,1) from t copula

for j = 1:nIndices
    R(:,j) = icdf(tails{j}, U(:,j));
end

h = scatterhist(R(:,2), R(:,3),'Color','r','Marker','.','MarkerSize',1);
fig = gcf;
fig.Color = [1 1 1];
y1 = ylim(h(1));
y3 = ylim(h(3));
xlim(h(1), [-.1 .1])
ylim(h(1), [-.1 .1])
xlim(h(2), [-.1 .1])
ylim(h(3), [(y3(1) + (-0.1 - y1(1)))  (y3(2) + (0.1 - y1(2)))])
xlabel('France')
ylabel('Germany')
title(['t Copula (\nu = ' num2str(DoF,2) ')'])
0

Теперь моделируйте и стройте графики центрированных возвратов, используя Гауссову копулу.

reset(s)
R = zeros(nPoints, nIndices);             % pre-allocate simulated returns array
U = copularnd('Gaussian', rhoG, nPoints); % simulate U(0,1) from Gaussian copula

for j = 1:nIndices
    R(:,j) = icdf(tails{j}, U(:,j));
end

h = scatterhist(R(:,2), R(:,3),'Color','r','Marker','.','MarkerSize',1);
fig = gcf;
fig.Color = [1 1 1];
y1 = ylim(h(1));
y3 = ylim(h(3));
xlim(h(1), [-.1 .1])
ylim(h(1), [-.1 .1])
xlim(h(2), [-.1 .1])
ylim(h(3), [(y3(1) + (-0.1 - y1(1)))  (y3(2) + (0.1 - y1(2)))])
xlabel('France')
ylabel('Germany')
title('Gaussian Copula')
0

Исследуйте эти два рисунков. Существует сильное сходство миниатюрных гистограмм на соответствующих осях каждого рисунка. Это сходство не совпадает.

Обе копулы моделируют равномерные случайные переменные, которые затем преобразуются в ежедневные центрированные возвраты обратным CDF кусочно-линейного распределения каждого индекса. Поэтому моделируемые возвраты любого заданного индекса одинаково распределены независимо от копулы.

Однако график рассеяния каждого рисунка указывает структуру зависимости, связанную с данной копулой, и в отличие от одномерных полей, показанных в гистограммах, графики рассеяния являются различными.

Снова, копула определяет структуру зависимости независимо от ее полей и, следовательно, предлагает много функции, не ограничивающихся только калибровкой.

Для ссылки моделируйте и стройте графики центрированных возвратов с помощью Гауссова распределения, которое лежит в основе традиционной броуновской модели движения.

reset(s)
R = mvnrnd(zeros(1,nIndices), cov(returns), nPoints);
h = scatterhist(R(:,2), R(:,3),'Color','r','Marker','.','MarkerSize',1);
fig = gcf;
fig.Color = [1 1 1];
y1 = ylim(h(1));
y3 = ylim(h(3));
xlim(h(1), [-.1 .1])
ylim(h(1), [-.1 .1])
xlim(h(2), [-.1 .1])
ylim(h(3), [(y3(1) + (-0.1 - y1(1)))  (y3(2) + (0.1 - y1(2)))])
xlabel('France')
ylabel('Germany')
title('Gaussian Distribution')
0

Американские опционные цены с использованием подхода Longstaff & Schwartz

Теперь, когда копулы были калиброваны, сравните цены на опции американской корзины за деньги, полученные из различных подходов. Для простого анализа примите, что:

  • Все индексы начинаются с 100.

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

  • Срок действия опции истекает через 3 месяца.

  • Информация, полученная из ежедневных данных, приводится в годовом исчислении.

  • Каждый календарный год состоит из 252 торговых дней.

  • Уровни индекса моделируются ежедневно.

  • Опция может быть реализована в конце каждого торгового дня и аппроксимирует американский вариант как бермудский вариант.

Теперь вычислите параметры, общие для всех методов симуляции:

dt       = 1 / 252;                  % time increment = 1 day = 1/252 years
yields   = Data(:,end);              % daily effective yields
yields   = 360 * log(1 + yields);    % continuously-compounded, annualized yields
r        = mean(yields);             % historical 3M Euribor average
X        = repmat(100, nIndices, 1); % initial state vector
strike   = sum(X);                   % initialize an at-the-money basket

nTrials  = 100;                      % # of independent trials
nPeriods = 63;   % # of simulation periods: 63/252 = 0.25 years = 3 months

Теперь создайте две разделяемые многомерные модели рынка, в которых матрицы безрискового возврата и воздействия волатильности являются диагональными.

В то время как обе являются диагональными моделями GBM с одинаковыми рискованно-нейтральными возвратами, первая управляется коррелированным броуновским движением и явно задает выборку линейной корреляции матрицы центрированных возвратов. Этот коррелированный процесс Броуновского движения затем взвешивается матрицей диагонали с годовыми волатильностями индекса или стандартными отклонениями.

В качестве альтернативы эта же модель может управляться некоррелированным броуновским движением (стандартным броуновским движением) путем определения correlation как матрица тождеств, или просто приняв значение по умолчанию. В этом случае матрица воздействия sigma задается как нижний Фактор Холецкого матрицы возврата ковариации. Поскольку основанные на копуле подходы моделируют зависимые случайные числа, диагональная форма экспозиции выбирается для согласованности. Для получения дополнительной информации см. «Индукция зависимости и корреляции».

sigma       = std(returns) * sqrt(252);    % annualized volatility
correlation = corrcoef(returns);           % correlated Gaussian disturbances
GBM1        = gbm(diag(r(ones(1,nIndices))), diag(sigma), 'StartState', X, ...
                 'Correlation'             , correlation);

Теперь создайте вторую модель, управляемую брауновской копулой с матрицей тождеств sigma.

GBM2 = gbm(diag(r(ones(1,nIndices))), eye(nIndices), 'StartState', X);

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

При работе с копулами часто удобно позволять функции генератора случайных чисел Z (t, X) вызывать зависимость (из которой традиционное понятие линейной корреляции является частным случаем) с копулой и вызывать величину или шкалу изменения (подобный волатильности или стандартному отклонению) с полупараметрическим CDF и обратным CDF Поскольку CDF и обратные преобразования CDF каждого индекса наследуют характеристики исторических возвращений, это также объясняет, почему возвраты теперь центрированы.

В следующих разделах такие операторы:

z = Example_CopulaRNG(returns * sqrt(252), nPeriods, 'Gaussian');

или

z = Example_CopulaRNG(returns * sqrt(252), nPeriods, 't');

подгонка структур зависимости Гауссова и t копула, соответственно, и полупараметрических полей к центрированным возвратам, масштабируемым квадратным корнем из числа торговых дней в год (252). Это масштабирование не аннуализирует ежедневные центрированные возвраты. Вместо этого он масштабирует их так, что волатильность остается сопоставимой с диагональной годовой матрицей воздействия sigma традиционной броуновской модели движения (GBM1), созданной ранее.

В этом примере вы также задаете функцию обработки в конце периода, которая принимает время, за которым следует состояние (t, X), и записывает шаги расчета и значение портфеля как средневзвешенное среднее значение с одной единицей измерения для всех индексов. Эта функция также делится этой информацией с другими функциями, предназначенными для оценки американских опций с постоянной безрисковой скоростью с помощью регрессионного подхода Longstaff & Schwartz.

f = Example_LongstaffSchwartz(nPeriods, nTrials)
f = 

  struct with fields:

    LongstaffSchwartz: @Example_LongstaffSchwartz/saveBasketPrices
            CallPrice: @Example_LongstaffSchwartz/getCallPrice
             PutPrice: @Example_LongstaffSchwartz/getPutPrice
               Prices: @Example_LongstaffSchwartz/getBasketPrices

Теперь моделируйте независимые испытания цен индекса капитала в течение 3 календарных месяцев с помощью simByEuler по умолчанию способ. Выходов от методов симуляции не запрашивается; фактически, моделируемые цены отдельных индексов, составляющих корзину, не являются необходимыми. Цены на опцию звонков сообщаются для удобства:

reset(s)

simByEuler(GBM1, nPeriods, 'nTrials'  , nTrials, 'DeltaTime', dt, ...
                          'Processes', f.LongstaffSchwartz);

BrownianMotionCallPrice = f.CallPrice(strike, r);
BrownianMotionPutPrice  = f.PutPrice (strike, r);

reset(s)

z = Example_CopulaRNG(returns * sqrt(252), nPeriods, 'Gaussian');
f = Example_LongstaffSchwartz(nPeriods, nTrials);

simByEuler(GBM2, nPeriods, 'nTrials'  , nTrials, 'DeltaTime', dt, ...
                          'Processes', f.LongstaffSchwartz, 'Z', z);

GaussianCopulaCallPrice = f.CallPrice(strike, r);
GaussianCopulaPutPrice  = f.PutPrice (strike, r);

Теперь повторите симуляцию копулы со структурой зависимости t копулы. Вы используете один и тот же объект модели для обеих копул; необходимо повторно инициализировать только генератор случайных чисел и функции расчета цены опций.

reset(s)

z = Example_CopulaRNG(returns * sqrt(252), nPeriods, 't');
f = Example_LongstaffSchwartz(nPeriods, nTrials);

simByEuler(GBM2, nPeriods, 'nTrials'  , nTrials, 'DeltaTime', dt, ...
                          'Processes', f.LongstaffSchwartz, 'Z', z);

tCopulaCallPrice = f.CallPrice(strike, r);
tCopulaPutPrice  = f.PutPrice (strike, r);

Наконец, сравните американские цены put и call option, полученные из всех моделей.

disp(' ')
fprintf('                    # of Monte Carlo Trials: %8d\n'    , nTrials)
fprintf('                    # of Time Periods/Trial: %8d\n\n'  , nPeriods)
fprintf(' Brownian Motion American Call Basket Price: %8.4f\n'  , BrownianMotionCallPrice)
fprintf(' Brownian Motion American Put  Basket Price: %8.4f\n\n', BrownianMotionPutPrice)
fprintf(' Gaussian Copula American Call Basket Price: %8.4f\n'  , GaussianCopulaCallPrice)
fprintf(' Gaussian Copula American Put  Basket Price: %8.4f\n\n', GaussianCopulaPutPrice)
fprintf('        t Copula American Call Basket Price: %8.4f\n'  , tCopulaCallPrice)
fprintf('        t Copula American Put  Basket Price: %8.4f\n'  , tCopulaPutPrice)
 
                    # of Monte Carlo Trials:      100
                    # of Time Periods/Trial:       63

 Brownian Motion American Call Basket Price:  25.9456
 Brownian Motion American Put  Basket Price:  16.4132

 Gaussian Copula American Call Basket Price:  24.5711
 Gaussian Copula American Put  Basket Price:  17.4229

        t Copula American Call Basket Price:  22.6220
        t Copula American Put  Basket Price:  20.9983

Этот анализ представляет только маломасштабную симуляцию. Если симуляция повторяется со 100 000 испытаний, получаются следующие результаты:

                   # of Monte Carlo Trials:   100000
                   # of Time Periods/Trial:       63
Brownian Motion American Call Basket Price:  20.2214
Brownian Motion American Put  Basket Price:  16.5355
Gaussian Copula American Call Basket Price:  20.6097
Gaussian Copula American Put  Basket Price:  16.5539
       t Copula American Call Basket Price:  21.1273
       t Copula American Put  Basket Price:  16.6873

Интересно, что результаты тесно совпадают. Цены опции, полученные из копул, превышают цены броуновского движения менее чем на 1%.

Примечание по волатильности и масштабированию процентных ставок

Те же опции цены также могут быть получены путем работы с негодовыми (в данном случае, ежедневными) центрированными возвратами и рискованными ставками, где временной шаг dt = 1 день, а не 1/252 года. Другими словами, цены на портфель все еще будут моделироваться каждый торговый день; данные просто масштабируются по-разному.

Хотя это не выполнено, и, сначала сбросив случайный поток в его начальное внутреннее состояние, следующие сегменты кода работают с ежедневными центрированными возвратами и рискованными ставками и производят одинаковые цены на опцию.

Гауссов Распределение/Brownian Motion & Daily Данных:

reset(s)
f    = Example_LongstaffSchwartz(nPeriods, nTrials);
GBM1 = gbm(diag(r(ones(1,nIndices))/252), diag(std(returns)), 'StartState', X, ...
          'Correlation', correlation);
simByEuler(GBM1, nPeriods, 'nTrials'  , nTrials, 'DeltaTime', 1, ...
                          'Processes', f.LongstaffSchwartz);
BrownianMotionCallPrice = f.CallPrice(strike, r/252)
BrownianMotionPutPrice  = f.PutPrice (strike, r/252)

Гауссов Копула & Ежедневные данные:

reset(s)
z    = Example_CopulaRNG(returns, nPeriods, 'Gaussian');
f    = Example_LongstaffSchwartz(nPeriods, nTrials);
GBM2 = gbm(diag(r(ones(1,nIndices))/252),   eye(nIndices), 'StartState', X);
simByEuler(GBM2, nPeriods, 'nTrials'  , nTrials, 'DeltaTime',   1, ...
                          'Processes', f.LongstaffSchwartz , 'Z', z);
GaussianCopulaCallPrice = f.CallPrice(strike, r/252)
GaussianCopulaPutPrice  = f.PutPrice (strike, r/252)

t Копула & Ежедневные данные:

reset(s)
z = Example_CopulaRNG(returns, nPeriods, 't');
f = Example_LongstaffSchwartz(nPeriods, nTrials);
simByEuler(GBM2, nPeriods, 'nTrials'  , nTrials, 'DeltaTime',   1, ...
                          'Processes', f.LongstaffSchwartz , 'Z', z);
tCopulaCallPrice = f.CallPrice(strike, r/252)
tCopulaPutPrice  = f.PutPrice (strike, r/252)

См. также

| | | | | | | | | | | | | | | | | | | |

Похожие примеры

Подробнее о

Для просмотра документации необходимо авторизоваться на сайте