Существует два общих подхода к управлению памятью при решении большинства задач, поддерживаемых движком SDE:
Выполните традиционную симуляцию, чтобы симулировать представляющие интерес базовые переменные, конкретно запрашивая и затем манипулируя массивами выхода.
Этот подход является простым и наилучшим выбором для малых или средних проблем. Поскольку его выходы являются массивами, удобно манипулировать моделируемыми результатами в MATLAB® матричный язык. Однако, когда масштаб задачи увеличивается, преимущество этого подхода уменьшается, потому что выходные массивы должны хранить большие количества, возможно, посторонней информации.
Например, рассмотрите ценообразование для европейской опции, при которой конечная цена базового актива является единственным значением интереса. Чтобы облегчить бремя памяти традиционного подхода, уменьшите количество моделируемых периодов, заданных необходимым входом NPeriods
и укажите необязательный вход NSteps
. Это позволяет вам управлять памятью, не жертвуя точностью (см. «Оптимизация точности: о точности решения и ошибке»).
В сложение методы симуляции могут определять количество выходных аргументов и выделять память соответственно. В частности, все методы симуляции поддерживают один и тот же список выходных аргументов:
[Paths,Times,Z]
где Paths
и Z
могут быть большими, трехмерными массивами временных рядов. Однако базовый шумовой массив обычно ненужен и сохранена только при запросе в качестве выхода. Другими словами, Z
хранится только по Вашему запросу; не запрашивайте его, если он вам не нужен.
Если вам нужен выходной шумовой массив Z
, но не нужно Paths
массив временных рядов, тогда можно избежать хранения Paths
два способа:
Использовать лучшую практику ~
заполнитель выходного аргумента. Для примера используйте следующий список выходных аргументов для хранения Z
и Times
, но не Paths
:
[~,Times,Z]
Используйте необязательный входной флаг StorePaths
, который поддерживают все методы симуляции. По умолчанию Paths
хранится (StorePaths
= true
). Однако установка StorePaths
на false
возвращает Paths
как пустая матрица.
Задайте одну или несколько функций обработки в конце периода, чтобы управлять и хранить только интересующую информацию, избегая выходов симуляции в целом.
Этот подход требует, чтобы вы задали одну или несколько функций обработки в конце периода, и часто является предпочтительным подходом для крупномасштабных задач. Этот подход позволяет вам вообще избегать выходов симуляции. Поскольку выходов не запрашивается, трехмерные массивы временных рядов Paths
и Z
не хранятся.
Этот подход часто требует больших усилий, но намного более элегантен и позволяет настраивать задачи и резко сокращать использование памяти. См. Раздел «Ценообразование в капитале» Опций.
Следующие подходы улучшают эффективность при решении задач SDE:
Определение параметров модели как традиционных массивов и функций MATLAB в различных комбинациях. Это обеспечивает гибкий интерфейс, который может поддерживать фактически любые общие нелинейные отношения. Однако, хотя функции предлагают удобное и элегантное решение для многих задач, симуляции обычно выполняются быстрее, когда вы задаете параметры как векторы или матрицы двойной точности. Таким образом, рекомендуется задавать параметры модели как массивы, когда это возможно.
Используйте модели, которые перегружали методы симуляции Эйлера, когда это возможно. Использование броуновского движения (BM
) и геометрическое броуновское движение (GBM
) модели, которые обеспечивают перегруженные методы симуляции Эйлера, используют в своих интересах разделяемые модели с постоянными параметрами. Эти специализированные методы являются исключительно быстрыми, но доступны только для моделей с постоянными параметрами, которые моделируются без определения функций обработки в конце периода и генерации шума.
Замените симуляцию одномерной модели с постоянным параметром, выведенной из SDEDDO
класс с классом для диагонали многомерной модели. Обработайте многомерную модель как портфель одномерных моделей. Это увеличивает размерность модели и увеличивает эффективность за счет уменьшения эффективного количества симуляции испытаний.
Примечание
Этот метод применим только к одномерным моделям с постоянными параметрами, не задавая функции обработки в конце периода и генерации шума.
Воспользуйтесь тем, что методы симуляции разработаны, чтобы обнаружить наличие NaN
(не число) условий, возвращенных из функций обработки в конце периода. A NaN
представляет результат неопределенного численного вычисления и любого последующего вычисления на основе NaN
создает другую NaN
. Это помогает улучшить эффективность в определенных ситуациях. Например, рассмотрите симуляцию путей подмножества опции выключенного барьера (то есть опции, которая становится бесполезной, когда цена базового актива пересекает некоторый предписанный барьер). Ваша функция конца периода может обнаружить пересечение барьера и вернуть NaN
чтобы сигнализировать о досрочном прекращении текущего испытания.
Архитектура симуляции в целом не моделирует точные решения каких-либо SDE. Вместо этого архитектура симуляции обеспечивает приближение в дискретном времени базового процесса в непрерывном времени, метод симуляции, часто известный как аппроксимация Эйлера.
В самом общем случае заданную симуляцию получают непосредственно из SDE. Поэтому моделируемый процесс в дискретном времени приближается к базовому процессу в непрерывном времени только в пределе, когда dt временного шага приближается к нулю. Другими словами, архитектура симуляции придает больше значения обеспечению того, чтобы распределения вероятностей процессов в дискретном времени и в непрерывном времени были близки, чем на путевой близости процессов.
Прежде чем проиллюстрировать методы для улучшения приближения решений, полезно понять источник ошибки. На протяжении всей этой архитектуры все методы симуляции предполагают, что параметры модели являются кусочно-постоянными в течение любого временного интервала dt длины. Фактически методы даже оценивают динамические параметры в начале каждого временного интервала и удерживают их фиксированными на время интервала. Этот подход к дискретизации вводит ошибку дискретизации.
Однако существуют определенные модели, для которых кусочно-постоянный подход предоставляет точные решения:
Создание моделей Броуновского движения (BM) с постоянными параметрами, моделируемых Эйлером приближением (simByEuler
).
Создание геометрических моделей броуновского движения (GBM) с постоянными параметрами, моделируемых решением закрытой формы (simBySolution
).
Создание Hull-White/Vasicek (HWV) Гауссовых диффузионных моделей с постоянными параметрами, моделируемых решением закрытой формы (simBySolution
)
В более общем случае можно симулировать точные решения для этих моделей, даже если параметры варьируются со временем, если они изменяются кусочно-постоянным способом, таким образом, что изменения параметра совпадают с заданным временем дискретизации. Однако такое точное совпадение маловероятно; поэтому предварительно рассмотренное условие постоянного параметра обычно используется на практике.
Одним из очевидных способов повышения точности является более частая выборка процесса в дискретном времени. Это уменьшает временной шаг (dt), заставляя дискретизированный процесс более точно аппроксимировать базовый процесс непрерывного времени. Несмотря на то, что уменьшение временного шага повсеместно применимо, существует компромисс между точностью, эффективностью во время выполнения и использованием памяти.
Чтобы управлять этим компромиссом, задайте необязательный входной параметр, NSteps
, для всех методов симуляции. NSteps
указывает количество промежуточных временных шагов в каждом dt временного шага, при котором процесс дискретизируется, но не сообщается.
На данной точке важно и удобно подчеркнуть взаимосвязь входов NSteps
, NPeriods
, и DeltaTime
к вектору выхода Times
, который представляет фактическое время наблюдения, в которое сообщаются моделируемые пути.
NPeriods
, необходимый вход, указывает количество периодов симуляции длины DeltaTime
, и определяет количество строк в моделируемой трехмерной Paths
массив временных рядов (если требуется выход).
DeltaTime
является необязательным и указывает на соответствующее NPeriods
- вектор длины положительных временных шагов между последовательными выборками. Он представляет собой знакомые dt, найденные в стохастических дифференциальных уравнениях. Если DeltaTime
не задан, используется значение по умолчанию 1.
NSteps
также является необязательным и слабо связан с NPeriods
и DeltaTime
. NSteps
задает количество промежуточных временных шагов в каждом временном шаге DeltaTime
.
В частности, каждый временной шаг DeltaTime
разделяется на NSteps
подынтервалы длины DeltaTime
/ NSteps
каждый, и уточняет симуляцию путем оценки вектора моделируемого состояния в (NSteps - 1)
промежуточное время. Несмотря на то, что выход состояния (если запрашивается) не сообщается в эти промежуточные моменты времени, это уточнение улучшает точность, заставляя симуляцию более точно аппроксимировать базовый процесс непрерывного времени. Если NSteps
не задан, значение по умолчанию 1
(для указания отсутствия промежуточной оценки).
Область выхода Times
является NPeriods + 1
-length вектора-столбца времени наблюдения, сопоставленного с моделируемыми путями. Каждый элемент Times
связана с соответствующей строкой Paths
.
Следующий пример иллюстрирует эту промежуточную выборку путем сравнения различия между решением закрытой формы и последовательностью приближений Эйлера, полученных из различных значений NSteps
.
Рассмотрим одномерное геометрическое броуновское движение (GBM
) моделировать с использованием gbm
с постоянными параметрами:
Предположим, что ожидаемые темпы возврата и параметров волатильности указаны в годовом исчислении и что календарный год составляет 250 торговых дней.
Моделируйте приблизительно четыре года одномерных цен как для точного решения, так и для приближения Эйлера для различных значений NSteps
:
nPeriods = 1000; dt = 1/250; obj = gbm(0.1,0.4,'StartState',100); rng(575,'twister') [X1,T1] = simBySolution(obj,nPeriods,'DeltaTime',dt); rng(575,'twister') [Y1,T1] = simByEuler(obj,nPeriods,'DeltaTime',dt); rng(575,'twister') [X2,T2] = simBySolution(obj,nPeriods,'DeltaTime',... dt,'nSteps',2); rng(575,'twister') [Y2,T2] = simByEuler(obj,nPeriods,'DeltaTime',... dt,'nSteps',2); rng(575,'twister') [X3,T3] = simBySolution(obj,nPeriods, 'DeltaTime',... dt,'nSteps',10); rng(575,'twister') [Y3,T3] = simByEuler(obj,nPeriods,'DeltaTime',... dt,'nSteps',10); rng(575,'twister') [X4,T4] = simBySolution(obj,nPeriods,'DeltaTime',... dt,'nSteps',100); rng(575,'twister') [Y4,T4] = simByEuler(obj,nPeriods,'DeltaTime',... dt,'nSteps',100);
Сравните ошибку (различие между точным решением и приближением Эйлера) графически:
clf; plot(T1,X1 - Y1,'red') hold on; plot(T2,X2 - Y2,'blue') plot(T3,X3 - Y3,'green') plot(T4,X4 - Y4,'black') hold off xlabel('Time (Years)') ylabel('Price Difference') title('Exact Solution Minus Euler Approximation') legend({'# of Steps = 1' '# of Steps = 2' ... '# of Steps = 10' '# of Steps = 100'},... 'Location', 'Best') hold off
whos T X Y
Как ожидалось, ошибка симуляции уменьшается, когда количество промежуточных временных шагов увеличивается. Поскольку промежуточные состояния не сообщаются, все моделируемые временные ряды имеют одинаковое количество наблюдений независимо от фактического значения NSteps
.
Кроме того, поскольку ранее смоделированные точные решения верны для любого количества промежуточных временных шагов, дополнительные расчеты для этого примера не требуются. На самом деле эта оценка верна. Точные решения отбираются в промежуточные моменты времени, чтобы убедиться, что в симуляции используется та же последовательность Гауссовых случайных вариаций в том же порядке. Без этой гарантии невозможно сравнить смоделированные цены по путевой базис. Тем не менее, могут быть допустимые причины для дискретизации точных решений с близкими интервалами, такие как опции, зависящие от пути ценообразования.
bates
| bm
| cev
| cir
| diffusion
| drift
| gbm
| heston
| hwv
| interpolate
| merton
| sde
| sdeddo
| sdeld
| sdemrd
| simByEuler
| simByQuadExp
| simBySolution
| simBySolution
| simulate
| ts2func