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