В этом примере показано, как моделировать жиростное поведение доходности активов и оценивать влияние альтернативных совместных распределений на цены опционов на корзины. Используя различные реализации разделяемого многомерного процесса геометрического броуновского движения (GBM), часто называемого многомерной рыночной моделью, пример моделирует нейтральные с точки зрения риска пути выборки портфеля индексов акций и опционов по корзине цен с использованием методики Longstaff & Schwartz.
Кроме того, этот пример также иллюстрирует основные особенности архитектуры стохастического дифференциального уравнения (SDE), включая
Настраиваемые функции генерации случайных чисел, которые сравнивают броуновское движение и броуновские копулы
Функции обработки на конец периода, которые формируют корзину индексов акций и ценят американские опционы на базовую корзину на основе метода наименьших квадратов Longstaff & Schwartz
Кусочные распределения вероятностей и теория экстремальных значений (EVT)
В этом примере также освещаются важные вопросы волатильности и масштабирования процентных ставок. Он иллюстрирует, как эквивалентные результаты могут быть достигнуты путем работы с ежедневными или годовыми данными. Дополнительные сведения об EVT и копулах см. в разделе Использование теории экстремальных значений и копул для оценки рыночных рисков (инструментарий для эконометрики).
Конечной целью этого примера является сравнение цен опционов на корзины, полученных в результате различных шумовых процессов. Первый шумовой процесс - это традиционная броуновская модель движения, индексная цена которой определяется коррелированными гауссовыми случайными розыгрышами. В качестве альтернативы броуновский эталон движения сравнивается с шумовыми процессами, управляемыми Gaussian и Student's t copulas, называемыми совместно броуновской копулой.
Копула - многомерная кумулятивная функция распределения (CDF) с равномерно распределенными полями. Хотя теоретические основы были созданы десятилетия назад, копулы испытали огромный всплеск популярности за последние несколько лет, прежде всего, как метод моделирования негауссовых портфельных рисков.
Хотя существуют многочисленные семейства, все копулы представляют собой статистическое устройство для моделирования структуры зависимости между двумя или более случайными переменными. Кроме того, важные статистические данные, такие как ранговая корреляция и зависимость хвоста, являются свойствами данной копулы и не изменяются монотонными преобразованиями их краев.
Эти розыгрыши копулы производят зависимые случайные величины, которые впоследствии преобразуются в отдельные переменные (поля). Это преобразование достигается с полупараметрическим распределением вероятностей с обобщенными хвостами Парето.
Модель рынка, нейтральная к риску, для моделирования

где безрисковая ставка, r, предполагается постоянным в течение срока действия опциона. Поскольку это разделяемая многомерная модель, безрисковая доходность представляет собой диагональную матрицу, в которой ко всем индексам применяется одинаковая безрисковая доходность. Дивидендная доходность игнорируется для упрощения модели и связанного с ней сбора данных.
Напротив, спецификация матрицы экспозиции, sigma, зависит от того, как моделируется движущий источник неопределенности. Его можно моделировать непосредственно как броуновское движение (коррелированные гауссовы случайные числа неявно отображены на гауссовы поля) или моделировать как броуновскую копулу (коррелированные гауссовы или t случайных чисел явно отображены на полупараметрические поля).
Поскольку CDF и обратная CDF (квантовая функция) одномерных распределений являются как монотонными преобразованиями, копула обеспечивает удобный способ моделирования зависимых случайных величин, чьи поля различны и произвольно распределены. Кроме того, поскольку копула определяет заданную структуру зависимости независимо от ее полей, калибровка параметров копулы обычно проще, чем оценка функции совместного распределения.
После моделирования путей выборки параметры оцениваются методом регрессии методом наименьших квадратов Longstaff & Schwartz (см. Оценка американских вариантов путем моделирования: простой подход наименьших квадратов, обзор финансовых исследований, весна 2001 г.). Этот подход использует наименьшие квадраты для оценки ожидаемой окупаемости опциона, если он не выполняется немедленно. Это делается путем регрессии денежных потоков дисконтированного опциона, полученных в будущем, на текущую цену ниже, связанную со всеми путями выборки в деньгах. Функция продолжения оценивается простым многочленом третьего порядка, в котором все денежные потоки и цены в регрессии нормализуются ценой страйка опциона, улучшая числовую устойчивость.
Загрузите ежедневный исторический набор данных Euribor за 3 месяца, даты торгов, охватывающие интервал от 07-Feb-2001 до 24-Apr-2006, и уровни индекса закрытия следующих репрезентативных индексов акций с большим капиталом:
TSX Composite (Канада)
CAC 40 (Франция)
DAX (Германия)
Никкэй 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)')

Чтобы подготовиться к моделированию копулы, характеризуйте индивидуально распределение доходностей каждого индекса. Хотя распределение каждого возвратного ряда может быть охарактеризовано параметрически, полезно подогнать полупараметрическую модель, используя кусочное распределение с обобщенными хвостами Парето. Для лучшей характеристики поведения в каждом хвосте используется Extreme Value Theory.
Программное обеспечение Statistics and Machine Learning Toolbox™ в настоящее время поддерживает два одномерных распределения вероятностей, связанных с EVT, статистическим инструментом для моделирования жирного поведения финансовых данных, таких как доходность активов и страховые убытки:
Обобщенное распределение экстремальных значений (GEV), в котором используется метод моделирования, известный как максимумы блоков или минимумы. Этот подход делит исторический набор данных на набор подинтервалов или блоков, и наибольшее или наименьшее наблюдение в каждом блоке записывается и устанавливается в распределение GEV.
Обобщенное распределение Парето (GP), использует метод моделирования, известный как распределение превышений или пиков над пороговым методом. Этот подход сортирует исторический набор данных и подбирает величину, на которую те наблюдения, которые превышают заданный порог, к распределению GP.
Следующий анализ подчеркивает распределение Pareto, которое более широко используется в приложениях для управления рисками.
Предположим, мы хотим создать полное статистическое описание распределения вероятности ежедневной доходности активов любого из индексов акций. Предположим, что это описание предоставлено кусочно-полупараметрическим распределением, где асимптотическое поведение в каждом хвосте характеризуется обобщённым распределением Парето.
В конечном счете, копула будет использоваться для генерации случайных чисел, чтобы управлять моделированием. 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 интересующего объекта Парето хвостов с данными, отличными от тех, на которых основана подгонка. Указанные методы имеют доступ к подобранному состоянию. Теперь они вызываются для выбора и анализа конкретных областей кривой вероятности, действуя как мощный механизм фильтрации данных.
Для справки график также включает в себя среднее значение Gaussian 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 с помощью инструментария статистики и машинного обучения 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

Теперь, когда копулы были откалиброваны, сравните цены опционов американской корзины на деньги, полученные из различных подходов. Для простого анализа предположим, что:
Все индексы начинаются с 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);
Теперь повторите моделирование копулы со структурой зависимости от копулы. Для обеих копул используется один и тот же объект модели; необходимо повторно инициализировать только генератор случайных чисел и функции ценообразования опционов.
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) 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
Этот анализ представляет собой только маломасштабное моделирование. Если моделирование повторяют с 100000 испытаний, получают следующие результаты:
# of Monte Carlo Trials: 100000
# of Time Periods/Trial: 63Brownian 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 года. Другими словами, цены портфеля по-прежнему будут моделироваться каждый торговый день; данные просто масштабируются по-разному.
Несмотря на то, что они не выполнены, и при первом сбросе случайного потока в его исходное внутреннее состояние следующие сегменты кода работают с ежедневной центрированной доходностью и безрисковыми ставками и производят те же цены опциона.
Gaussian Distribution/броуновское движение и ежедневные данные:
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)
Gaussian 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 & Ежедневные данные:
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)
bates | bm | cev | cir | diffusion | drift | gbm | heston | hwv | interpolate | merton | sde | sdeddo | sdeld | sdemrd | simByEuler | simByQuadExp | simBySolution | simBySolution | simulate | ts2func