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

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

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

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

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

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

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

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

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

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

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

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

Нейтральная к риску модель рынка, чтобы симулировать

dXt=rXtdt+σXtdWt

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

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

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

Если вы симулировали демонстрационные пути, опции оценены методом регрессии наименьших квадратов Longstaff & Schwartz (см. Оценивающие американские Опции Симуляцией: Простой Подход Наименьших квадратов, Анализ Финансовых Исследований, Spring 2001). Этот подход использует наименьшие квадраты, чтобы оценить ожидаемую выплату опции, если это сразу не осуществлено. Это делает так путем регрессирования обесцененных потоков наличности опции, полученных в будущем на текущей цене underlier, сопоставленного со всеми демонстрационными путями в деньгах. Функция продолжения оценивается простым полиномом третьего порядка, в котором все потоки наличности и цены в регрессии нормированы на цену исполнения опциона опции, улучшив числовую устойчивость.

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

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

  • Составной объект TSX (Канада)

  • (Франция) 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')

Figure contains an axes object. The axes object with title Normalized Daily Index Closings contains 6 objects of type line. These objects represent (TSX) Canadian TSX Composite, (CAC) French CAC 40, (DAX) German DAX, (NIK) Japanese Nikkei 225, (FTSE) UK FTSE 100, (SP) US S&P 500.

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

Figure contains an axes object. The axes object with title Risk Free Rate (3-Month Euribor Continuously-Compounded) contains an object of type line.

Экстремум Theory & Piecewise Probability Distributions

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

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

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

  • Распределение Обобщенного Парето (GP), использует технику моделирования, известную как распределение exceedances или 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}])

Figure contains an axes object. The axes object with title Daily Logarithmic Centered Returns: (DAX) German DAX contains an object of type line.

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

Используя их сосредоточенные возвращается, оцените эмпирический, или непараметрический, CDF каждого индекса с Гауссовым ядром. Это приглаживает оценки CDF, устраняя шаблон лестницы не сглаживавшего демонстрационного CDFS. Несмотря на то, что непараметрическое ядро, оценки 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')

Figure contains an axes object. The axes object with title Semi-Parametric/Piecewise CDF: (DAX) German DAX contains 4 objects of type line. These objects represent Pareto Lower Tail, Kernel Smoothed Interior, Pareto Upper Tail, Gaussian with Same \sigma.

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

Калибровка связки

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

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

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

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

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

Когда универсальные варьируемые величины преобразовываются эмпирическим CDF каждого поля, калибровочный метод часто известен как каноническое наибольшее правдоподобие (CML). Следующий сегмент кода сначала преобразовывает сосредоточенную ежедневную газету, возвращается к универсальным варьируемым величинам кусочным, полупараметрическим CDFS, выведенным выше. Это затем соответствует Гауссовым и 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 = 6×6

    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 = 6×6

    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 = 6×6

    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 связки. Это затем строит 2D график рассеивания с крайними гистограммами для французского CAC 40 и немецкого DAX с помощью scatterhist Statistics and Machine Learning Toolbox функция. Французские и немецкие индексы были выбраны просто, потому что у них есть самая высокая корреляция доступных данных.

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

Figure contains an axes object. The axes object with title t blank C o p u l a blank ( nu blank = blank 4 . 9 ) contains an object of type line.

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

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

Figure contains an axes object. The axes object with title Gaussian Copula contains an object of type line.

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

Обе связки симулируют универсальные случайные переменные, которые затем преобразовываются к сосредоточенной ежедневной газете, возвращается обратным 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')

Figure contains an axes object. The axes object with title Gaussian Distribution contains an object of type line.

Американская оценка опции Используя Longstaff & Schwartz Approach

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

  • Все индексы начинаются в 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);

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

disp(' ')
 
fprintf('                    # of Monte Carlo Trials: %8d\n'    , nTrials)
                    # of Monte Carlo Trials:      100
fprintf('                    # of Time Periods/Trial: %8d\n\n'  , nPeriods)
                    # of Time Periods/Trial:       63
fprintf(' Brownian Motion American Call Basket Price: %8.4f\n'  , BrownianMotionCallPrice)
 Brownian Motion American Call Basket Price:  25.9456
fprintf(' Brownian Motion American Put  Basket Price: %8.4f\n\n', BrownianMotionPutPrice)
 Brownian Motion American Put  Basket Price:  16.4132
fprintf(' Gaussian Copula American Call Basket Price: %8.4f\n'  , GaussianCopulaCallPrice)
 Gaussian Copula American Call Basket Price:  24.5711
fprintf(' Gaussian Copula American Put  Basket Price: %8.4f\n\n', GaussianCopulaPutPrice)
 Gaussian Copula American Put  Basket Price:  17.4229
fprintf('        t Copula American Call Basket Price: %8.4f\n'  , tCopulaCallPrice)
        t Copula American Call Basket Price:  22.6220
fprintf('        t Copula American Put  Basket Price: %8.4f\n'  , tCopulaPutPrice)
        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 Data:

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)

Гауссова Copula & Daily Data:

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 Copula & Daily Data:

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)

Смотрите также

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

Связанные примеры

Больше о