Симуляция цен на акции

Симуляция многомерных моделей рынка

Этот пример сравнивает альтернативные реализации разделяемого многомерного геометрического процесса броуновского движения, который часто упоминается как многомерная рыночная модель. Он моделирует пути расчета портфеля индекса собственного капитала с помощью sde, sdeddo, sdeld, cev, и gbm объекты.

Моделируемая рыночная модель:

dXt=μXtdt+D(Xt)σdWt(1)

где:

  • μ - диагональная матрица ожидаемых возвратов индекса.

  • D - диагональная матрица с X t по диагонали.

  • σ - диагональная матрица стандартных отклонений возвращаемых индексов.

Представление рыночных моделей с использованием объектов SDE

Создайте sde объект, использующий sde для представления модели рынка акций.

  1. Загрузите Data_GlobalIdx2 набор данных:

    load Data_GlobalIdx2
    prices  = [Dataset.TSX Dataset.CAC Dataset.DAX ...
    Dataset.NIK Dataset.FTSE Dataset.SP];
  2. Преобразуйте ежедневные цены в возвраты:

    returns =  tick2ret(prices);
  3. Вычислите статистику данных для ввода в методы симуляции:

    nVariables  = size(returns, 2);
    expReturn   = mean(returns);
    sigma       = std(returns);
    correlation = corrcoef(returns);
    t           = 0;
    X           = 100;
    X           = X(ones(nVariables,1));
  4. Создайте простые анонимные функции дрейфа и диффузии, доступные (t, Xt):

    F = @(t,X) diag(expReturn) * X;
    G = @(t,X) diag(X) * diag(sigma);
  5. Используйте эти функции с 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 объект, использующий sdeddo для представления модели рынка в Уравнении 1:

  1. Загрузите Data_GlobalIdx2 набор данных:

    load Data_GlobalIdx2
    prices  = [Dataset.TSX Dataset.CAC Dataset.DAX ...
    Dataset.NIK Dataset.FTSE Dataset.SP];
  2. Преобразуйте ежедневные цены в возвраты:

    returns =  tick2ret(prices);
  3. Вычислите статистику данных для ввода в методы симуляции:

    nVariables  = size(returns, 2);
    expReturn   = mean(returns);
    sigma       = std(returns);
    correlation = corrcoef(returns);
  4. Создание 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
    
  5. Передайте 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

Создание sdeld, cev, и gbm объекты, для представления рыночной модели в Уравнении 1.

  1. Загрузите Data_GlobalIdx2 набор данных:

    load Data_GlobalIdx2
    prices  = [Dataset.TSX Dataset.CAC Dataset.DAX ...
        Dataset.NIK Dataset.FTSE Dataset.SP];
  2. Преобразуйте ежедневные цены в возвраты:

    returns =  tick2ret(prices);
  3. Вычислите статистику данных для ввода в методы симуляции:

    nVariables  = size(returns, 2);
    expReturn   = mean(returns);
    sigma       = std(returns);
    correlation = corrcoef(returns);
    t           = 0;
    X           = 100;
    X           = X(ones(nVariables,1));
  4. Создайте 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
    
  5. Создайте 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
    
  6. Создайте 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
    

    Обратите внимание на последовательность ограничений интерфейса:

    • sdeld объекты требуют, чтобы вы задавали A, B, Alpha, и Sigma.

    • cev объекты требуют, чтобы вы задавали Return, Alpha, и Sigma.

    • gbm объекты требуют, чтобы вы задавали только Return и Sigma.

    Однако все три объекта представляют одну и ту же многомерную модель рынка.

    Кроме того, cev и gbm объекты отображают базовый параметр B получен из sdeld объект как Return. Это интуитивное имя, обычно связанное с моделями собственного капитала.

Симуляция фондовых рынков с использованием метода моделирования по умолчанию

  1. Загрузите 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);
  2. Симулируйте один путь коррелированных цен индекса капитала за один календарный год (определяемый как приблизительно 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 времени.

  3. Постройте график моделируемых путей.

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

    Figure contains an axes. The axes with title Single Path of Multi-Dimensional Market Model contains 6 objects of type line. These objects represent Canada, France, Germany, Japan, UK, US.

Симуляция фондовых рынков с помощью метода SimByEuler

Поскольку simByEuler является действительным методом симуляции, можно вызвать его непосредственно, переопределяя Simulation текущий метод или функция параметра (который в этом случае является simByEuler). Следующие операторы создают те же пути цен, что и сгенерированные в Симуляции фондовых рынков с использованием метода моделирования по умолчанию:

  1. Загрузите 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);
  2. Симулируйте один путь, используя simByEuler.

    nPeriods = 249;      % # of simulated observations
    dt       =   1;      % time increment = 1 day
    rng(142857,'twister')
    [S,T] = simByEuler(SDE, nPeriods, 'DeltaTime', dt);
  3. Симулируйте 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 массив временных рядов.

  4. Постройте график первых путей.

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

    Figure contains an axes. The axes with title First Path of Multi-Dimensional Market Model contains 6 objects of type line. These objects represent Canada, France, Germany, Japan, UK, US.

Первая реализация S идентичен путям на графике.

Симуляция фондовых рынков с помощью методов моделирования GBM

Наконец, рассмотрите симуляцию, используя GBM методы симуляции. Разделяемые GBM модели имеют два конкретных метода симуляции:

  • Перегруженный метод симуляции Эйлера, simByEuler, предназначенный для оптимальной эффективности

  • Функция, simBySolution, обеспечивает приблизительное решение базового стохастического дифференциального уравнения, предназначенного для точности

  1. Загрузите 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);
  2. Чтобы проиллюстрировать преимущества эффективности перегруженного метода приближения Эйлера, увеличьте количество испытаний до 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 является гораздо большим массивом временных рядов.

  3. Используя этот размер выборки, исследуйте терминальное распределение канадского TSX Composite, чтобы качественно проверить логнормальный символ данных.

    histogram(squeeze(X(end,1,:)), 30), xlabel('Price'), ylabel('Frequency')
    title('Histogram of Prices after One Year: Canada (TSX Composite)')

    Figure contains an axes. The axes with title Histogram of Prices after One Year: Canada (TSX Composite) contains an object of type histogram.

  4. Симулируйте 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')

    Figure contains 2 axes. Axes 1 with title 1st Path of Multi-Dim Market Model:Euler Approximation contains 6 objects of type line. Axes 2 with title 1st Path of Multi-Dim Market Model:Analytic Solution contains 6 objects of type line.

    В этом примере все параметры являются константами, и simBySolution Действительно ли выборка точного решения. Детали одного индекса для любого данного исследования показывают, что ценовые пути приближения Эйлера и точное решение близки, но не идентичны.

  5. Следующий график иллюстрирует различие между этими двумя методами:

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

    Figure contains an axes. The axes with title Euler Approx Minus Exact Solution:Canada(TSX Composite) contains an object of type line.

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

Приближение в дискретном времени улучшается следующим DeltaTime приближается к нулю. Метод Эйлера часто является наименее точным и наиболее общим из доступных методов. Все модели, поставляемые в наборе симуляции, имеют этот метод.

В противоположность этому,simBySolution способ обеспечивает более точное описание базовой модели. Этот метод моделирует пути цен путем приближения решения разделяемых моделей в закрытой форме. В частности, он применяет подход Эйлера к трансформированному процессу, который в целом не является точным решением этого GBM модель. Это потому, что распределения вероятностей моделируемого и истинного векторов состояния идентичны только для кусочно-постоянных параметров.

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

Для примера того, как использовать simBySolution для оптимизации точности решений см. «Оптимизация точности: о точности решения и ошибке».

Индуцирование зависимости и корреляции

Этот пример иллюстрируют два методов, которые вызывают зависимость между отдельными элементами массива вектора состояний. Он также иллюстрирует взаимодействие между Sigma и Correlation.

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

Второй метод генерирует независимые Гауссовы вариаты, чтобы сформировать стандартный процесс Броуновского движения, который затем взвешивается более низким фактором Холецкого желаемой ковариационной матрицы. Несмотря на то, что эти методы могут использоваться на многих моделях, отношения между ними легче всего проиллюстрировать, работая с разделяемым GBM модель (см. Симуляцию цен на акции с использованием методов симуляции GBM). Моделируемая рыночная модель:

dXt=μXtdt+σXtdWt

где μ - диагональная матрица.

  1. Загрузите набор данных:

    load Data_GlobalIdx2
    prices  = [Dataset.TSX Dataset.CAC Dataset.DAX ...
        Dataset.NIK Dataset.FTSE Dataset.SP];
  2. Преобразуйте дневные цены в возвраты:

    returns =  tick2ret(prices);
  3. Задайте Sigma и Correlation используя первый метод:

    1. Используя первый метод, задайте Sigma как диагональная матрица стандартных отклонений по возврату активов:

      expReturn   = diag(mean(returns));  % expected return vector
      sigma       = diag(std(returns));   % volatility of returns
    2. Задайте Correlation как корреляция выборки из этих возвратов. В этом случае компоненты броуновского движения зависимы:

      correlation = corrcoef(returns);    
      GBM1        = gbm(expReturn,sigma,'Correlation',...
                        correlation);
  4. Задайте Sigma и Correlation используя второй метод:

    1. Используя второй метод, задайте Sigma как нижний фактор Холецкого ковариационной матрицы возврата активов:

      covariance = cov(returns);
      sigma      = cholcov(covariance)';
    2. Задайте Correlation в матрицу тождеств:

      GBM2       = gbm(expReturn,sigma);

      Здесь, sigma фиксирует как корреляцию, так и величину неопределенности возврата активов. В отличие от первого метода, компоненты броуновского движения являются независимыми. Кроме того, этот метод принимает назначение матрицы тождеств по умолчанию Correlation, и является более простым.

  5. Симулируйте одно исследование 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')

Figure contains 2 axes. Axes 1 with title Sample Paths from Correlated Brownian Motion contains 6 objects of type line. Axes 2 with title Sample Paths from Standard Brownian Motion contains 6 objects of type line.

Динамическое поведение рыночных параметров

Как обсуждалось в Создании объектов SDE, параметры объекта могут быть оценены, как если бы они были MATLAB® функций, доступных через общий интерфейс. Эта доступность обеспечивает впечатление динамического поведения независимо от того, являются ли базовые параметры действительно изменяющимися во времени. Кроме того, поскольку параметры доступны с помощью общего интерфейса, кажется, что простые линейные конструкции могут на самом деле представлять сложные, нелинейные проекты.

Для примера рассмотрим одномерную геометрическую броуновскую модель движения (GBM) вида:

dXt=μ(t)Xtdt+σ(t)XtdWt

В этой модели возврат, μ(t) и волатильность, σ(t), являются одними только динамическими параметрами времени. Однако при создании gbm объект, чтобы представлять базовую модель, такое динамическое поведение должно быть доступно с помощью общего (t, Xt) интерфейса. Это отражает тот факт, что GBM модели (и другие) являются ограниченными параметризациями, которые получают из общего SDE класс.

Для удобства можно задать параметры ограниченных моделей, таких как GBM модели, как традиционные массивы MATLAB соответствующей размерности. В этом случае такие массивы представляют статический особый случай более общей динамической ситуации, доступной (t, Xt) интерфейсом.

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

Следующий пример иллюстрирует метод, который включает динамическое поведение путем сопоставления традиционного массива временных рядов MATLAB с вызываемой функцией с (t, Xt) интерфейсом. Это также сравнивает функцию с идентичной моделью с постоянными параметрами.

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

  1. Загрузите данные. Загрузите набор ежедневных исторических данных, содержащий трехмесячные ставки Euribor и уровни закрывающего индекса CAC 40 Франции, охватывающие временной интервал с 7 февраля 2001 года по 24 апреля 2006 года:

    load Data_GlobalIdx2
  2. Симулируйте пути выборки, нейтральные к риску. Симулируйте нейтральные к риску пути расчета индекса CAC 40 с помощью геометрического броуновского движения (GBM) модель:

    dXt=r(t)Xtdt+σXtdWt

    где r(t) представляет собой эволюцию безрисковой нормы возврата.

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

    dt      = 1/250;
    returns = tick2ret(Dataset.CAC);
    sigma   = std(returns)*sqrt(250);
    yields  = Dataset.EB3M;
    yields  = 360*log(1 + yields);
  3. Сравните пути расчета из двух нейтральных к риску исторических подходов к симуляции. Сравнение полученных выборочных путей, полученных с помощью двух нейтральных к риску исторических подходов к симуляции, где ежедневные выражения Euribor служат прокси для безрисковой нормы возврата.

    1. Первый подход определяет нейтральную с точки зрения риска возврат как среднюю выборку выражений 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);
    2. Напротив, второй подход определяет нейтральную с точки зрения риска возврат как исторические временные ряды выражений 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 и более подробно обсуждается в Оптимизации Точности: О Точности Решения и Ошибке .

  4. Выполните вторую симуляцию, используя то же начальное состояние случайных чисел. Завершите сравнение, выполнив вторую симуляцию с использованием того же начального состояния случайных чисел:

    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);
  5. Сравните два испытания симуляции. Постройте график серии ссылочных ставок без риска для сравнения двух испытаний симуляции:

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

    Figure contains 2 axes. Axes 1 with title Risk Free Rate(3-Mo Euribor Continuously-Compounded) contains an object of type line. Axes 2 with title Constant vs. Dynamic Rate of Return: CAC 40 contains 2 objects of type line. These objects represent Constant Interest Rates, Dynamic Interest Rates.

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

Ценообразование долевых опций

Как обсуждалось в Обеспечении Положительных Процентных Ставок, все методы симуляции и интерполяции позволяют вам задать одну или несколько функций формы:

Xt=f(t,Xt)

для оценки в конце каждого шага расчета.

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

Рассмотрите ценообразование европейских фондовых опций симуляцией Монте-Карло в среда. Предположим, что запас имеет следующие признаки:

  • В настоящее время акции торгуются на уровне 100.

  • Акции не выплачивают дивидендов.

  • Волатильность акций составляет 50% годовых.

  • Цена опции доставки - 95.

  • Срок действия опции истекает через три месяца.

  • Безрисковая ставка постоянна на уровне 10% годовых.

Чтобы решить эту задачу, моделируйте эволюцию базового запаса одномерной геометрической броуновской моделью движения (GBM) с постоянными параметрами:

dXt=0.1Xtdt+0.5XtdWt

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

  1. Перед симуляцией вызовите файл с примером для доступа к функции обработки в конце периода:

    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
    
    
  2. Симулируйте 10000 независимых испытаний (пути расчета). Запросите моделируемые пути цен на акции в качестве выхода и задайте функцию обработки в конце периода:

    rng(88161,'twister')
    X = simBySolution(obj,nPeriods,'DeltaTime',dt,... 
        'nTrials',nTrials,'Processes',f.BlackScholes);
  3. Вычислите опционные цены непосредственно из моделируемых путей цен на акции. Поскольку это европейские опции, игнорируйте все промежуточные цены на акции:

    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
    
  4. Косвенно оцените опции путем вызова вложенных функций:

    f.CallPrice(strike,rate)
    ans = 13.9342
    
    f.PutPrice(strike,rate)
    ans = 6.4166
    

    Для ссылки, теоретический вызов и размещение цен, вычисленных из опционных формул Black-Scholes 13.6953 и 6.3497, соответственно.

  5. Несмотря на то, что этапы 3 и 4 обеспечивают одинаковые цены на опцию, последний подход непосредственно работает с ценами на конечные акции каждого пути расчета. Поэтому он намного эффективнее памяти. В этом примере нет убедительной причины запрашивать выход.

См. также

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

Похожие примеры

Подробнее о