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

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

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

    sde объект запрашивает дополнительную информацию, чтобы определить размерность модели, потому что функции передали thesde объект известен только их (t, Xt) интерфейс. Другими словами, thesde объект требует только двух входных параметров: функция уровня дрейфа и функция уровня диффузии, и доступная путем передачи шага расчета и соответствующего вектора состояния (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
    

    sdeddo объект требует двух входных объектов, которые предоставляют больше информации, чем две функции от шага 4 Представления Моделей Рынка Используя Объекты SDE. Таким образом размерность более легко разрешена. На самом деле начальная цена каждого индекса как скаляр (StartState= 100 ). Это в отличие от sde объект, который потребовал, чтобы явный вектор состояния исключительно определил размерность проблемы.

    Еще раз класс каждого объекта ясно идентифицирован, и отображение параметров как поля структуры. В частности, Rate параметр дрейфа и объектов диффузии идентифицирован как вызываемая функция времени и состояния, F(t,Xt) и G(t,Xt), соответственно. Дополнительные параметры, AB\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 объекты требуют, чтобы вы задали AB\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 торговых дней) использование 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.

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

Симуляция фондовых рынков Используя метод 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- nVariables- 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')

Первая реализация 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 Канады, чтобы проверить качественно логарифмически нормальный символ данных.

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

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

    В этом примере все параметры являются константами и 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)')

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

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

В отличие от этого thesimBySolution метод предоставляет более детальное описание базовой модели. Этот метод симулирует ценовые пути приближением решения закрытой формы отделимых моделей. А именно, это применяет Эйлеров подход к преобразованному процессу, который в целом не является точным решением этого 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. Симулируйте один суд над 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) формы:

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

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

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

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

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

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

    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
    

    Для ссылки теоретическим вызовом и помещенными ценами, вычисленными из формул опции Блэка-Шоулза, является 13.6953 и 6.3497, соответственно.

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

Смотрите также

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

Связанные примеры

Больше о