Этот пример сравнивает альтернативные реализации разделяемого многомерного геометрического процесса броуновского движения, который часто упоминается как многомерная рыночная модель. Он моделирует пути расчета портфеля индекса собственного капитала с помощью 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
The sde
объект требует дополнительной информации для определения размерности модели, потому что функции перешли к sde
объект известен только с помощью их (t, Xt) интерфейса. Другими словами, sde
объект требует только двух входов: функции скорости дрейфа и функции скорости диффузии, доступной путем прохождения шага расчета и соответствующего вектора состояния (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
The 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 торговых дней) с помощью дефолтаsimulate
метод:
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 Composite, чтобы качественно проверить логнормальный символ данных.
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
приближается к нулю. Метод Эйлера часто является наименее точным и наиболее общим из доступных методов. Все модели, поставляемые в наборе симуляции, имеют этот метод.
В противоположность этому,simBySolution
способ обеспечивает более точное описание базовой модели. Этот метод моделирует пути цен путем приближения решения разделяемых моделей в закрытой форме. В частности, он применяет подход Эйлера к трансформированному процессу, который в целом не является точным решением этого 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
, и является более простым.
Симулируйте одно исследование 1000 наблюдений (примерно четыре года ежедневных данных), используя оба метода. По умолчанию все переменные состояния начинаются с 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) интерфейсом.
Более того, когда вы вводите параметры как функции, конструкторы объектов могут проверить, что они возвращают массивы правильного размера, оценив их в начальном времени и состоянии. В противном случае конструкторы объектов не имеют никаких знаний о какой-либо конкретной функциональной форме.
Следующий пример иллюстрирует метод, который включает динамическое поведение путем сопоставления традиционного массива временных рядов 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
Симулируйте 10000 независимых испытаний (пути расчета). Запросите моделируемые пути цен на акции в качестве выхода и задайте функцию обработки в конце периода:
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
Для ссылки, теоретический вызов и размещение цен, вычисленных из опционных формул Black-Scholes 13.6953
и 6.3497
, соответственно.
Несмотря на то, что этапы 3 и 4 обеспечивают одинаковые цены на опцию, последний подход непосредственно работает с ценами на конечные акции каждого пути расчета. Поэтому он намного эффективнее памяти. В этом примере нет убедительной причины запрашивать выход.
bates
| bm
| cev
| cir
| diffusion
| drift
| gbm
| heston
| hwv
| interpolate
| merton
| sde
| sdeddo
| sdeld
| sdemrd
| simByEuler
| simByQuadExp
| simBySolution
| simBySolution
| simulate
| ts2func