Этот пример сравнивает альтернативные реализации отделимого многомерного процесса геометрического броуновского движения, который часто упоминается как многомерная модель рынка. Это моделирует демонстрационные пути портфеля фондового индекса с помощью sde
, sdeddo
, sdeld
, cev
и объектов gbm
.
Модель рынка, чтобы моделировать:
(1) |
где:
μ является диагональной матрицей ожидаемого индекса, возвращается.
D является диагональной матрицей с X t по диагонали.
σ является диагональной матрицей стандартных отклонений индекса, возвращается.
Создайте объект sde
с помощью sde
, чтобы представлять модель фондового рынка.
Загрузите набор данных Data_GlobalIdx2
:
load Data_GlobalIdx2 prices = [Dataset.TSX Dataset.CAC Dataset.DAX ... Dataset.NIK Dataset.FTSE Dataset.SP];
Преобразуйте ежедневные цены в возвраты:
returns = tick2ret(prices);
Вычислите статистику данных, чтобы ввести к методам симуляции:
nVariables = size(returns, 2); expReturn = mean(returns); sigma = std(returns); correlation = corrcoef(returns); t = 0; X = 100; X = X(ones(nVariables,1));
Создайте простой анонимный дрейф и функции диффузии, доступные (t, Xt):
F = @(t,X) diag(expReturn) * X; G = @(t,X) diag(X) * diag(sigma);
Используйте эти функции с sde
, чтобы создать объект sde
представлять модель рынка в уравнении 1:
SDE = sde(F, G, 'Correlation', correlation, 'StartState', X)
SDE = Class SDE: Stochastic Differential Equation ------------------------------------------- Dimensions: State = 6, Brownian = 6 ------------------------------------------- StartTime: 0 StartState: 100 (6x1 double array) Correlation: 6x6 double array Drift: drift rate function F(t,X(t)) Diffusion: diffusion rate function G(t,X(t)) Simulation: simulation method/function simByEuler
Объект sde
запрашивает дополнительную информацию, чтобы определить размерность модели, потому что функции, переданные объекту thesde
, известны только их (t, Xt) интерфейс. Другими словами, thesde
объект требует только двух входных параметров: функция уровня дрейфа и функция уровня диффузии, и доступная путем передачи шага расчета и соответствующего вектора состояния (t, Xt).
В этом случае эта информация недостаточна, чтобы определить однозначно размерность вектора состояния и Броуновского движения. Вы разрешаете размерность путем определения вектора начального состояния, StartState
. Механизм SDE присвоил метод симуляции по умолчанию, simByEuler
, к параметру Simulation
.
Создайте объект sdeddo
с помощью sdeddo
, чтобы представлять модель рынка в уравнении 1:
Загрузите набор данных Data_GlobalIdx2
:
load Data_GlobalIdx2 prices = [Dataset.TSX Dataset.CAC Dataset.DAX ... Dataset.NIK Dataset.FTSE Dataset.SP];
Преобразуйте ежедневные цены в возвраты:
returns = tick2ret(prices);
Вычислите статистику данных, чтобы ввести к методам симуляции:
nVariables = size(returns, 2); expReturn = mean(returns); sigma = std(returns); correlation = corrcoef(returns);
Создайте drift
и объекты diffusion
с помощью drift
и diffusion
:
F = drift(zeros(nVariables,1), diag(expReturn))
F = Class DRIFT: Drift Rate Specification ------------------------------------- Rate: drift rate function F(t,X(t)) A: 6x1 double array B: 6x6 diagonal double array
G = diffusion(ones(nVariables,1), diag(sigma))
G = Class DIFFUSION: Diffusion Rate Specification --------------------------------------------- Rate: diffusion rate function G(t,X(t)) Alpha: 6x1 double array Sigma: 6x6 diagonal double array
Передайте drift
, и diffusion
возражает против sdeddo
:
SDEDDO = sdeddo(F, G, 'Correlation', correlation, ... 'StartState', 100)
SDEDDO = Class SDEDDO: SDE from Drift and Diffusion Objects -------------------------------------------------- Dimensions: State = 6, Brownian = 6 -------------------------------------------------- StartTime: 0 StartState: 100 (6x1 double array) Correlation: 6x6 double array Drift: drift rate function F(t,X(t)) Diffusion: diffusion rate function G(t,X(t)) Simulation: simulation method/function simByEuler A: 6x1 double array B: 6x6 diagonal double array Alpha: 6x1 double array Sigma: 6x6 diagonal double array
Объект sdeddo
требует двух входных объектов, которые предоставляют больше информации, чем две функции от шага 4 Представления Моделей Рынка Используя Объекты SDE. Таким образом размерность более легко разрешена. На самом деле начальная цена каждого индекса как скаляр (StartState
= 100
). Это в отличие от объекта sde
, который потребовал, чтобы явный вектор состояния исключительно определил размерность проблемы.
Еще раз класс каждого объекта ясно идентифицирован, и отображение параметров как поля структуры. В частности, параметр Rate
дрейфа и объектов диффузии идентифицирован как вызываемая функция времени и состояния, F(t,Xt) и G(t,Xt), соответственно. Дополнительные параметры, A
, B
, Alpha
, и Sigma
, являются массивами соответствующей размерности, указывая на статические (неизменяющиеся во времени) параметры. Другими словами, A(t,Xt), B(t,Xt), Alpha(t,Xt) и Sigma(t,Xt) являются постоянными функциями времени и состояния.
Создайте sdeld
, cev
, и gbm
возражает, чтобы представлять модель рынка в уравнении 1.
Загрузите набор данных Data_GlobalIdx2
:
load Data_GlobalIdx2 prices = [Dataset.TSX Dataset.CAC Dataset.DAX ... Dataset.NIK Dataset.FTSE Dataset.SP];
Преобразуйте ежедневные цены в возвраты:
returns = tick2ret(prices);
Вычислите статистику данных, чтобы ввести к методам симуляции:
nVariables = size(returns, 2); expReturn = mean(returns); sigma = std(returns); correlation = corrcoef(returns); t = 0; X = 100; X = X(ones(nVariables,1));
Создайте объект sdeld
с помощью sdeld
:
SDELD = sdeld(zeros(nVariables,1), diag(expReturn), ... ones(nVariables,1), diag(sigma),'Correlation', ... correlation, 'StartState', X)
SDELD = Class SDELD: SDE with Linear Drift ---------------------------------------- Dimensions: State = 6, Brownian = 6 ---------------------------------------- StartTime: 0 StartState: 100 (6x1 double array) Correlation: 6x6 double array Drift: drift rate function F(t,X(t)) Diffusion: diffusion rate function G(t,X(t)) Simulation: simulation method/function simByEuler A: 6x1 double array B: 6x6 diagonal double array Alpha: 6x1 double array Sigma: 6x6 diagonal double array
Создайте объект cev
с помощью cev
:
CEV = cev(diag(expReturn), ones(nVariables,1), ... diag(sigma), 'Correlation', correlation, ... 'StartState', X)
CEV = Class CEV: Constant Elasticity of Variance ------------------------------------------ Dimensions: State = 6, Brownian = 6 ------------------------------------------ StartTime: 0 StartState: 100 (6x1 double array) Correlation: 6x6 double array Drift: drift rate function F(t,X(t)) Diffusion: diffusion rate function G(t,X(t)) Simulation: simulation method/function simByEuler Return: 6x6 diagonal double array Alpha: 6x1 double array Sigma: 6x6 diagonal double array
Создайте объект gbm
с помощью gbm
:
GBM = gbm(diag(expReturn), diag(sigma), 'Correlation', ... correlation, 'StartState', X)
GBM = Class GBM: Generalized Geometric Brownian Motion ------------------------------------------------ Dimensions: State = 6, Brownian = 6 ------------------------------------------------ StartTime: 0 StartState: 100 (6x1 double array) Correlation: 6x6 double array Drift: drift rate function F(t,X(t)) Diffusion: diffusion rate function G(t,X(t)) Simulation: simulation method/function simByEuler Return: 6x6 diagonal double array Sigma: 6x6 diagonal double array
Отметьте последовательность интерфейсных ограничений:
Однако все три объекта представляют ту же многомерную модель рынка.
Кроме того, cev
и объекты gbm
отображают базовый параметр B
, выведенный от объекта sdeld
как Return
. Это - интуитивное имя, обычно сопоставляемое с моделями акции.
Загрузите набор данных Data_GlobalIdx2
и используйте sde
, чтобы задать модель SDE как в Представлении Моделей Рынка Используя Объекты SDE.
load Data_GlobalIdx2 prices = [Dataset.TSX Dataset.CAC Dataset.DAX ... Dataset.NIK Dataset.FTSE Dataset.SP]; returns = tick2ret(prices); nVariables = size(returns,2); expReturn = mean(returns); sigma = std(returns); correlation = corrcoef(returns); t = 0; X = 100; X = X(ones(nVariables,1)); F = @(t,X) diag(expReturn)* X; G = @(t,X) diag(X) * diag(sigma); SDE = sde(F, G, 'Correlation', ... correlation, 'StartState', X);
Моделируйте один путь коррелированых цен фондового индекса за один календарный год (заданный как приблизительно 250 торговых дней) использование defaultsimulate
метода:
nPeriods = 249; % # of simulated observations dt = 1; % time increment = 1 day rng(142857,'twister') [S,T] = simulate(SDE, nPeriods, 'DeltaTime', dt); whos S
Name Size Bytes Class Attributes S 250x6 12000 double
Выходной массив S
250 6 = (NPERIODS + 1
-by-nVariables-by-
1
) массив с тем же начальным значением, 100
, для всех индексов. Каждая строка S
является наблюдением за вектором состояния Xt во время t.
Постройте моделируемые пути.
plot(T, S), xlabel('Trading Day'), ylabel('Price') title('Single Path of Multi-Dimensional Market Model') legend({'Canada' 'France' 'Germany' 'Japan' 'UK' 'US'}, ... 'Location', 'Best')
Поскольку simByEuler
является допустимым методом симуляции, можно вызвать его непосредственно, заменив существующий метод параметра Simulation
или функцию (который в этом случае является simByEuler
). Следующие операторы производят те же ценовые пути, как сгенерировано в Симуляции Фондовых рынков Используя Значение по умолчанию, Моделируют Метод:
Загрузите набор данных Data_GlobalIdx2
и используйте sde
, чтобы задать модель SDE как в Представлении Моделей Рынка Используя Объекты SDE.
load Data_GlobalIdx2 prices = [Dataset.TSX Dataset.CAC Dataset.DAX ... Dataset.NIK Dataset.FTSE Dataset.SP]; returns = tick2ret(prices); nVariables = size(returns,2); expReturn = mean(returns); sigma = std(returns); correlation = corrcoef(returns); t = 0; X = 100; X = X(ones(nVariables,1)); F = @(t,X) diag(expReturn)* X; G = @(t,X) diag(X) * diag(sigma); SDE = sde(F, G, 'Correlation', ... correlation, 'StartState', X);
Моделируйте один путь с помощью simByEuler
.
nPeriods = 249; % # of simulated observations dt = 1; % time increment = 1 day rng(142857,'twister') [S,T] = simByEuler(SDE, nPeriods, 'DeltaTime', dt);
Моделируйте 10 испытаний с теми же начальными условиями и исследуйте S
:
rng(142857,'twister') [S,T] = simulate(SDE, nPeriods, 'DeltaTime', dt, 'nTrials', 10); whos S
Name Size Bytes Class Attributes S 250x6x10 120000 double
Теперь выходным массивом S
является NPERIODS + 1
-by-nVariables-by-
nTrials
массив временных рядов.
Постройте первые пути.
plot(T, S(:,:,1)), xlabel('Trading Day'), ylabel('Price') title('First Path of Multi-Dimensional Market Model') legend({'Canada' 'France' 'Germany' 'Japan' 'UK' 'US'},... 'Location', 'Best')
Первая реализация S
идентична путям в графике.
Наконец, рассмотрите симуляцию с помощью методов симуляции GBM
. Отделимые модели GBM
имеют два определенных метода симуляции:
Перегруженный Эйлеров метод симуляции, simByEuler
, разработан для оптимальной производительности
Функция, simBySolution
, предоставляет приближенное решение базового стохастического дифференциального уравнения, разработанного для точности
Загрузите набор данных Data_GlobalIdx2
и используйте sde
, чтобы задать модель SDE как в Представлении Моделей Рынка Используя Объекты SDE и модели GBM как в Представлении Моделей Рынка Используя SDELD, CEV и Объекты GBM.
load Data_GlobalIdx2 prices = [Dataset.TSX Dataset.CAC Dataset.DAX ... Dataset.NIK Dataset.FTSE Dataset.SP]; returns = tick2ret(prices); nVariables = size(returns,2); expReturn = mean(returns); sigma = std(returns); correlation = corrcoef(returns); t = 0; X = 100; X = X(ones(nVariables,1)); F = @(t,X) diag(expReturn)* X; G = @(t,X) diag(X) * diag(sigma); SDE = sde(F, G, 'Correlation', ... correlation, 'StartState', X); GBM = gbm(diag(expReturn),diag(sigma), 'Correlation', ... correlation, 'StartState', X);
Чтобы проиллюстрировать выигрыш в производительности перегруженного Эйлерового метода приближения, увеличьте число испытаний к 10000
.
nPeriods = 249; % # of simulated observations dt = 1; % time increment = 1 day rng(142857,'twister') [X,T] = simulate(GBM, nPeriods, 'DeltaTime', dt, ... 'nTrials', 10000); whos X
Name Size Bytes Class Attributes X 250x6x10000 120000000 double
Вывод X
является намного большим массивом временных рядов.
Используя этот объем выборки, исследуйте терминальное распределение Составного объекта TSX Канады, чтобы проверить качественно логарифмически нормальный символ данных.
histogram(squeeze(X(end,1,:)), 30), xlabel('Price'), ylabel('Frequency') title('Histogram of Prices after One Year: Canada (TSX Composite)')
Моделируйте 10 испытаний решения и постройте первое испытание:
rng(142857,'twister') [S,T] = simulate(SDE, nPeriods, 'DeltaTime', dt, 'nTrials', 10); rng(142857,'twister') [X,T] = simBySolution(GBM, nPeriods,... 'DeltaTime', dt, 'nTrials', 10); subplot(2,1,1) plot(T, S(:,:,1)), xlabel('Trading Day'),ylabel('Price') title('1st Path of Multi-Dim Market Model:Euler Approximation') subplot(2,1,2) plot(T, X(:,:,1)), xlabel('Trading Day'),ylabel('Price') title('1st Path of Multi-Dim Market Model:Analytic Solution')
В этом примере все параметры являются константами, и simBySolution
действительно выбирает точное решение. Детали одного индекса для любого данного испытательного показа, что ценовые пути Эйлерового приближения и точного решения близки, но не идентичны.
Следующий график иллюстрирует различие между этими двумя методами:
subplot(1,1,1) plot(T, S(:,1,1) - X(:,1,1), 'blue'), grid('on') xlabel('Trading Day'), ylabel('Price Difference') title('Euler Approx Minus Exact Solution:Canada(TSX Composite)')
Приближение Эйлера simByEuler
буквально оценивает стохастическое дифференциальное уравнение непосредственно от уравнения движения для некоторого подходящего значения шага времени dt
. Это простое приближение страдает от ошибки дискретизации. Эта ошибка может быть приписана несоответствию между выбором шага времени dt
и что в теории является непрерывно-разовым параметром.
Приближение дискретного времени улучшается как нуль подходов DeltaTime
. Метод Эйлера часто является наименее точным и доступным наиболее общим методом. Все модели, поставленные в комплекте симуляции, имеют этот метод.
Напротив, thesimBySolution
метод предоставляет более детальное описание базовой модели. Этот метод моделирует ценовые пути приближением решения закрытой формы отделимых моделей. А именно, это применяет Эйлеров подход к преобразованному процессу, который в целом не является точным решением этой модели GBM
. Это вызвано тем, что распределения вероятностей моделируемых и истинных векторов состояния идентичны только для кусочных постоянных параметров.
Когда все параметры модели являются кусочной константой за каждый период наблюдения, моделируемый процесс точен в течение времен наблюдения, в которые выбирается вектор состояния. Поскольку все параметры являются константами в этом примере, simBySolution
действительно выбирает точное решение.
Для примера того, как использовать simBySolution
, чтобы оптимизировать точность решений, смотрите Точность Оптимизации: О Точности Решения и Ошибке.
Этот пример иллюстрирует два метода, которые вызывают зависимость между отдельными элементами вектора состояния. Это также иллюстрирует взаимодействие между Sigma
и Correlation
.
Первый метод генерирует коррелируемые Гауссовы варьируемые величины, чтобы сформировать процесс Броуновского движения с зависимыми компонентами. Эти компоненты затем взвешиваются диагональной энергозависимостью или матрицей воздействия Sigma
.
Второй метод генерирует независимые Гауссовы варьируемые величины, чтобы сформировать стандартный процесс Броуновского движения, который затем взвешивается более низким Фактором Холесского желаемой ковариационной матрицы. Несмотря на то, что эти методы могут использоваться на многих моделях, отношение между ними наиболее легко проиллюстрировано путем работы с отделимой моделью GBM
(см., что Цены Акции Симуляции Используют Методы Симуляции GBM). Модель рынка, чтобы моделировать:
где μ является диагональной матрицей.
Загрузите набор данных:
load Data_GlobalIdx2 prices = [Dataset.TSX Dataset.CAC Dataset.DAX ... Dataset.NIK Dataset.FTSE Dataset.SP];
Преобразуйте ежедневные цены в возвраты:
returns = tick2ret(prices);
Задайте Sigma
и Correlation
с помощью первого метода:
Используя первый метод, задайте Sigma
, когда диагональная матрица актива возвращает стандартные отклонения:
expReturn = diag(mean(returns)); % expected return vector sigma = diag(std(returns)); % volatility of returns
Задайте Correlation
как матрицу корреляции выборки тех возвратов. В этом случае компоненты Броуновского движения зависят:
correlation = corrcoef(returns); GBM1 = gbm(expReturn,sigma,'Correlation',... correlation);
Задайте Sigma
и Correlation
с помощью второго метода:
Используя второй метод, задайте Sigma
, когда более низкий Фактор Холесского актива возвращает ковариационную матрицу:
covariance = cov(returns); sigma = cholcov(covariance)';
Установите Correlation
на единичную матрицу:
GBM2 = gbm(expReturn,sigma);
Здесь, получения sigma
и корреляция и значение актива возвращают неуверенность. В отличие от первого метода, компоненты Броуновского движения независимы. Кроме того, этот метод принимает присвоение по умолчанию единичной матрицы к Correlation
и является более прямым.
Моделируйте один суд над 1 000 наблюдений (примерно четыре года ежедневных данных) использующий оба метода. По умолчанию все переменные состояния запускаются в 1
:
rng(22814,'twister') [X1,T] = simByEuler(GBM1,1000); % correlated Brownian motion rng(22814,'twister') [X2,T] = simByEuler(GBM2,1000); % standard Brownian motion
Когда на основе того же начального состояния случайных чисел, каждый метод генерирует идентичные пути цен активов:
subplot(2,1,1) plot(T, X1) title('Sample Paths from Correlated Brownian Motion') ylabel('Asset Price') subplot(2,1,2) plot(T, X2) title('Sample Paths from Standard Brownian Motion') xlabel('Trading Day') ylabel('Asset Price')
Как обсуждено в Создании Объектов SDE, параметры объекта могут быть оценены, как будто они - функции MATLAB®, доступные общим интерфейсом. Эта доступность обеспечивает впечатление от динамического поведения независимо от того, являются ли базовые параметры действительно изменяющимися во времени. Кроме того, потому что параметры доступны общим интерфейсом, на вид простые линейные построения могут на самом деле представлять комплексные, нелинейные проекты.
Например, рассмотрите одномерную модель геометрического броуновского движения (GBM) формы:
В этой модели возврат, μ(t), и энергозависимость, σ(t), является динамическими параметрами одного только времени. Однако при создании объекта gbm
представлять базовую модель, такое динамическое поведение должно быть доступным общим (t, Xt) интерфейс. Это отражает то, что модели GBM
(и другие) являются ограниченной параметризацией, которая выводит от общего класса SDE
.
Как удобство, можно задать параметры ограниченных моделей, такие как модели GBM
, как традиционные массивы MATLAB соответствующей размерности. В этом случае такие массивы представляют статический особый случай более общей динамической ситуации, доступной (t, Xt) интерфейс.
Кроме того, когда вы вводите параметры как функции, конструкторы Object могут проверить что они возвращаемые массивы правильного размера путем оценки их в начальное время и состояние. В противном случае конструкторы Object не знают о какой-то конкретной функциональной форме.
Следующий пример иллюстрирует метод, который включает динамическое поведение путем отображения традиционного массива временных рядов MATLAB с вызываемой функцией с (t, Xt) интерфейс. Это также сравнивает функцию с в противном случае идентичной моделью с постоянными параметрами.
Поскольку массивы временных рядов представляют динамическое поведение, которое должно быть получено функциями, доступными (t, Xt) интерфейс, вам нужны утилиты, чтобы преобразовать традиционные массивы временных рядов в вызываемые функции времени и состояния. Следующий пример показывает, как сделать это использование функции преобразования ts2func
(временные ряды, чтобы функционировать).
Загрузите данные. Загрузите ежедневный набор исторических данных, содержащий трехмесячные уровни Euribor и закрывающий индексные уровни CAC 40 Франции, охватывающего временной интервал 7 февраля 2001 до 24 апреля 2006:
load Data_GlobalIdx2
Моделируйте нейтральные к риску демонстрационные пути. Моделируйте нейтральные к риску демонстрационные пути индекса CAC 40 с помощью модели (GBM
) геометрического броуновского движения:
где r(t) представляет эволюцию безрисковой нормы прибыли.
Кроме того, примите, что необходимо пересчитать на год релевантную информацию, выведенную от ежедневных данных (пересчитывающий на год данные, является дополнительным, но является полезным для сравнения с другими примерами), и что каждый календарный год включает 250 торговых дней:
dt = 1/250; returns = tick2ret(Dataset.CAC); sigma = std(returns)*sqrt(250); yields = Dataset.EB3M; yields = 360*log(1 + yields);
Сравните демонстрационные пути от двух нейтральных к риску исторических подходов симуляции. Сравните получившиеся демонстрационные пути, полученные из двух нейтральных к риску исторических подходов симуляции, где ежедневные урожаи Euribor служат прокси для безрисковой нормы прибыли.
Первый подход задает нейтральный к риску возврат как демонстрационное среднее значение урожаев Euribor, и поэтому принимает постоянный (нединамический) безрисковый возврат:
nPeriods = length(yields); % Simulated observations rng(5713,'twister') obj = gbm(mean(yields),diag(sigma),'StartState',100)
obj = Class GBM: Generalized Geometric Brownian Motion ------------------------------------------------ Dimensions: State = 1, Brownian = 1 ------------------------------------------------ StartTime: 0 StartState: 100 Correlation: 1 Drift: drift rate function F(t,X(t)) Diffusion: diffusion rate function G(t,X(t)) Simulation: simulation method/function simByEuler Return: 0.0278117 Sigma: 0.231906
[X1,T] = simulate(obj,nPeriods,'DeltaTime',dt);
Напротив, второй подход задает нейтральный к риску возврат как исторические временные ряды урожаев Euribor. Это поэтому принимает динамическую, все же детерминированную, норму прибыли; этот пример не иллюстрирует стохастические процентные ставки. Чтобы проиллюстрировать этот динамический эффект, используйте утилиту ts2func
:
r = ts2func(yields,'Times',(0:nPeriods - 1)');
ts2func
группирует массив серии требуемого времени в вызываемой функции времени и состояния, и синхронизирует его с дополнительным временным вектором. Например:
r(0,100)
ans = 0.0470
выполняет функцию в (t = 0, X t = 100) и возвращает первый наблюдаемый урожай Euribor. Однако можно также выполнить получившуюся функцию в любое промежуточное время t и утвердить Xt:
r(7.5,200)
ans = 0.0472
Кроме того, следующая команда приводит к тому же результату, когда названо одним только временем:
r(7.5)
ans = 0.0472
Эквивалентность этих последних двух команд подсвечивает некоторые важные функции.
Когда вы задаете параметры как функции, они должны оценить правильно, когда передано скаляр, шаг расчета с действительным знаком (t) и NVARS-by-1
вектор состояния (Xt). Они должны также сгенерировать массив соответствующих размерностей, который в первом случае является скалярной константой, и во втором случае скаляр, кусочная постоянная функция одного только времени.
Вы не обязаны использовать или время (t) или состояние (Xt). В текущем примере функция оценивает правильно когда переданное время, сопровождаемое состоянием, таким образом, удовлетворяя минимальные требования. То, что это также оценивает правильно, когда передано только время просто, указывает, что функция не требует вектора состояния Xt. Важный момент, чтобы сделать - то, что это работает, когда вы передаете его (t, Xt).
Кроме того, функция ts2func
выполняет "нулевой порядок содержит" (ZOH) кусочная постоянная интерполяция. Понятие кусочных постоянных параметров является распространяющимся в архитектуре SDE и обсуждено более подробно в Оптимизации Точности: О Точности Решения и Ошибке.
Выполните вторую симуляцию с помощью того же начального состояния случайных чисел. Завершите сравнение путем выполнения второй симуляции с помощью того же начального состояния случайных чисел:
rng(5713,'twister') obj = gbm(r, diag(sigma),'StartState',100)
obj = Class GBM: Generalized Geometric Brownian Motion ------------------------------------------------ Dimensions: State = 1, Brownian = 1 ------------------------------------------------ StartTime: 0 StartState: 100 Correlation: 1 Drift: drift rate function F(t,X(t)) Diffusion: diffusion rate function G(t,X(t)) Simulation: simulation method/function simByEuler Return: function ts2func/vector2Function Sigma: 0.231906
X2 = simulate(obj,nPeriods,'DeltaTime',dt);
Сравните два испытания симуляции. Постройте серию безрисковых ссылочных уровней, чтобы сравнить два испытания симуляции:
subplot(2,1,1) plot(dates,100*yields) datetick('x') xlabel('Date') ylabel('Annualized Yield (%)') title('Risk Free Rate(3-Mo Euribor Continuously-Compounded)') subplot(2,1,2) plot(T,X1,'red',T,X2,'blue') xlabel('Time (Years)') ylabel('Index Level') title('Constant vs. Dynamic Rate of Return: CAC 40') legend({'Constant Interest Rates' 'Dynamic Interest Rates'},... 'Location', 'Best')
Пути близки, но не точны. Синяя строка в последнем графике использует все исторические данные Euribor и иллюстрирует один суд над исторической симуляцией.
Как обсуждено в Обеспечении Положительных Процентных ставок, вся симуляция и методы интерполяции позволяют вам задавать одну или несколько функций формы:
оценивать в конце каждого шага расчета.
Связанный пример иллюстрирует простую, общую функцию обработки конца периода, чтобы гарантировать неотрицательные процентные ставки. Этот пример иллюстрирует функцию обработки, которая позволяет вам избегать симуляции выходные параметры в целом.
Рассмотрите оценивающие европейские фондовые опционы симуляцией Монте-Карло в среде Мертона Блэка-Шоулза. Примите, что запас имеет следующие характеристики:
Запас в настоящее время стоит в 100.
Запас не выплачивает дивидендов.
Энергозависимость запаса составляет 50% в год.
Цена исполнения опциона опции равняется 95.
Опция истекает за три месяца.
Безрисковый уровень является постоянным в 10% в год.
Чтобы решить эту проблему, смоделируйте эволюцию базового запаса одномерной моделью геометрического броуновского движения (GBM) с постоянными параметрами:
Кроме того, примите, что курс акций ежедневно моделируется, и что каждый календарный месяц включает 21 торговый день:
strike = 95;
rate = 0.1;
sigma = 0.5;
dt = 1/252;
nPeriods = 63;
T = nPeriods*dt;
obj = gbm(rate,sigma,'StartState',100);
Цель состоит в том, чтобы моделировать независимые контуры ежедневных курсов акций и вычислить цену европейских опций как нейтральное к риску демонстрационное среднее значение обесцененной терминальной выплаты опции по истечению 63 дня с этого времени. Этот пример вычисляет цены опции двумя подходами:
Симуляция Монте-Карло, которая явным образом запрашивает моделируемые пути к запасу как вывод. Выходные пути затем используются, чтобы оценить опции.
Функция обработки конца периода, доступная ко времени и состоянию, которое записывает терминальный курс акций каждого демонстрационного пути. Эта функция обработки реализована как вложенная функция с доступом к общей информации. Для получения дополнительной информации смотрите Example_BlackScholes.m
.
Перед симуляцией вызовите файл в качестве примера, чтобы получить доступ к функции обработки конца периода:
nTrials = 10000; % Number of independent trials (i.e., paths)
f = Example_BlackScholes(nPeriods,nTrials)
f = struct with fields:
BlackScholes: @Example_BlackScholes/saveTerminalStockPrice
CallPrice: @Example_BlackScholes/getCallPrice
PutPrice: @Example_BlackScholes/getPutPrice
Моделируйте 10 000 независимых испытаний (демонстрационные пути). Запросите моделируемые пути к курсу акций как вывод и задайте функцию обработки конца периода:
rng(88161,'twister') X = simBySolution(obj,nPeriods,'DeltaTime',dt,... 'nTrials',nTrials,'Processes',f.BlackScholes);
Вычислите цены опции непосредственно от моделируемых путей к курсу акций. Поскольку они - европейские опции, игнорируют все промежуточные курсы акций:
call = mean(exp(-rate*T)*max(squeeze(X(end,:,:)) - strike, 0))
call = 13.9342
put = mean(exp(-rate*T)*max(strike - squeeze(X(end,:,:)), 0))
put = 6.4166
Оцените опции косвенно путем вызова вложенных функций:
f.CallPrice(strike,rate)
ans = 13.9342
f.PutPrice(strike,rate)
ans = 6.4166
Для ссылки теоретическим вызовом и помещенными ценами, вычисленными из формул опции Блэка-Шоулза, является 13.6953
и 6.3497
, соответственно.
Несмотря на то, что шаги 3 и 4 производят те же цены опции, последний подход работает непосредственно с терминальными курсами акций каждого демонстрационного пути. Поэтому это - намного больше эффективной памяти. В этом примере нет никакого неопровержимого довода, чтобы запросить вывод.
bm
| cev
| cir
| diffusion
| drift
| gbm
| heston
| hwv
| interpolate
| sde
| sdeddo
| sdeld
| sdemrd
| simByEuler
| simBySolution
| simBySolution
| simulate
| ts2func