Все методы симуляции требуют, чтобы вы задали сетку времени путем определения количества периодов (NPeriods
). Можно также опционально задать скаляр или вектор из строго положительного шага времени (DeltaTime
) и промежуточные временные шаги (NSteps
). Эти параметры, наряду с начальным шагом расчета, сопоставленным с объектом (StartTime
), исключительно определите последовательность времен, в которые производится вектор состояния. Таким образом методы симуляции позволяют вам пересекать сетку времени с начала до конца (то есть, слева направо).
В отличие от этого методы интерполяции позволяют вам пересекать сетку времени в любом порядке, позволяя и прямые и обратные перемещения вовремя. Они позволяют вам задавать вектор времен интерполяции, элементы которых не должны быть уникальными.
Много ссылок задают Броуниэн-Бридж как условную симуляцию, объединенную со схемой того, чтобы пересечь сетку времени, эффективно объединяя два отличных алгоритма. В отличие от этого метод интерполяции, предлагаемый здесь, обеспечивает дополнительную гибкость путем намеренного разделения алгоритмов. В этом методе для перемещения сетки времени вы выполняете начальную симуляцию Монте-Карло, чтобы произвести состояние в терминальное время, и затем последовательно демонстрационные промежуточные состояния стохастической интерполяцией. Первые несколько выборок определяют полное поведение путей, в то время как более поздние выборки прогрессивно совершенствовали структуру. Такие алгоритмы часто называются методами сокращения отклонения. Этот алгоритм прост, когда номер времен интерполяции является степенью 2. В этом случае каждая интерполяция падает на полпути между двумя известными состояниями, совершенствовав интерполяцию с помощью метода как деление пополам. Этот пример подсвечивает гибкость усовершенствованной интерполяции путем реализации этого алгоритма степени двойки.
Загрузите данные. Загрузите набор исторических данных трехмесячных уровней Euribor, наблюдаемых ежедневно, и соответствующие торговые даты, охватывающие временной интервал с 7 февраля 2001 до 24 апреля 2006:
load Data_GlobalIdx2 plot(dates, 100 * Dataset.EB3M) datetick('x'), xlabel('Date'), ylabel('Daily Yield (%)') title('3-Month Euribor as a Daily Effective Yield')
Подберите модель к данным. Теперь соответствуйте простому одномерному Vasicek
модель к ежедневным эквивалентным выражениям трехмесячных данных Euribor:
Учитывая начальные условия, распределение короткого уровня в некоторое время T в будущем является Гауссовым со средним значением:
и отклонение:
Чтобы калибровать эту простую модель короткого уровня, перепишите его в более знакомом формате регрессии:
где:
выполните обычную линейную регрессию, где энергозависимость модели пропорциональна стандартной погрешности остаточных значений:
yields = Dataset.EB3M; regressors = [ones(length(yields) - 1, 1) yields(1:end-1)]; [coefficients, intervals, residuals] = ... regress(diff(yields), regressors); dt = 1; % time increment = 1 day speed = -coefficients(2)/dt; level = -coefficients(1)/coefficients(2); sigma = std(residuals)/sqrt(dt);
Создайте объект и установите его начальный StartState. Создайте hwv
объект с StartState
установите на последний раз наблюдаемый короткий уровень:
obj = hwv(speed, level, sigma, 'StartState', yields(end))
obj = Class HWV: Hull-White/Vasicek ---------------------------------------- Dimensions: State = 1, Brownian = 1 ---------------------------------------- StartTime: 0 StartState: 7.70408e-05 Correlation: 1 Drift: drift rate function F(t,X(t)) Diffusion: diffusion rate function G(t,X(t)) Simulation: simulation method/function simByEuler Sigma: 4.77637e-07 Level: 6.00424e-05 Speed: 0.00228854
Симулируйте подобранную модель. Примите, например, что вы симулируете подобранную модель более чем 64 (26) торговые дни, с помощью усовершенствованного Броуниэн-Бридж с алгоритмом степени двойки вместо обычного подхода симуляции Монте-Карло начала к концу. Кроме того, примите, что начальное время и состояние совпадают с теми из последнего доступного наблюдения за историческими данными, и что конечное состояние является ожидаемым значением дней модели 64 Вашичека в будущее. В этом случае можно оценить поведение различных путей что вся доля та же начальная буква и конечные состояния, возможно, чтобы поддержать оценивающие зависимые от предшествующего пути развития опции процентной ставки на трехмесячном интервале.
Создайте вектор времен интерполяции, чтобы пересечь сетку времени путем перемещения обоих вперед и назад вовремя. А именно, первый раз интерполяции установлен в новое время наблюдения короткого уровня, второй раз интерполяции установлен в терминальное время и последующие времена интерполяции последовательно демонстрационные промежуточные состояния:
T = 64; times = (1:T)'; t = NaN(length(times) + 1, 1); t(1) = obj.StartTime; t(2) = T; delta = T; jMax = 1; iCount = 3; for k = 1:log2(T) i = delta / 2; for j = 1:jMax t(iCount) = times(i); i = i + delta; iCount = iCount + 1; end jMax = 2 * jMax; delta = delta / 2; end
Постройте времена интерполяции. Исследуйте последовательность времен интерполяции, сгенерированных этим алгоритмом:
stem(1:length(t), t, 'filled') xlabel('Index'), ylabel('Interpolation Time (Days)') title ('Sampling Scheme for the Power-of-Two Algorithm')
Первые несколько выборок широко разделяются вовремя и определяют структуру курса путей. Более поздние выборки близко расположены и прогрессивно совершенствовали подробную структуру.
Инициализируйте сетку временных рядов. Теперь, когда вы сгенерировали последовательность времен интерполяции, инициализируйте сетку временных рядов курса, чтобы начать интерполяцию. Процесс выборки начинается в прошлый наблюдаемый раз и состояние, взятое из исторического ряда короткого уровня, и заканчивает 64 дня в будущее в ожидаемом значении Vasicek
модель вывела из калиброванных параметров:
average = obj.StartState * exp(-speed * T) + level * ...
(1 - exp(-speed * T));
X = [obj.StartState ; average];
Сгенерируйте пять демонстрационных путей. Сгенерируйте пять демонстрационных путей, установив Refine
введите флаг к TRUE
вставить каждое новое интерполированное состояние в сетку временных рядов, когда это становится доступным. Выполните интерполяцию на испытании испытательным сроком. Поскольку входные временные ряды X
имеет пять испытаний (где каждая страница 3D временных рядов представляет независимое испытание), интерполированная выходная серия Y
также имеет пять страниц:
nTrials = 5; rng(63349,'twister') Y = obj.interpolate(t, X(:,:,ones(nTrials,1)), ... 'Times',[obj.StartTime T], 'Refine', true);
Постройте получившиеся демонстрационные пути. Поскольку времена интерполяции монотонно не увеличивают, сортируют времена и переупорядочивают соответствующие короткие уровни:
[t,i] = sort(t); Y = squeeze(Y); Y = Y(i,:); plot(t, 100 * Y), hold('on') plot(t([1 end]), 100 * Y([1 end],1),'. black','MarkerSize',20) xlabel('Interpolation Time (Days into the Future)') ylabel('Yield (%)'), hold('off') title ('Euribor Yields from Brownian Bridge Interpolation')
Короткие уровни в этом графике представляют альтернативные демонстрационные пути, которые совместно используют те же начальные значения и конечную стоимость. Они иллюстрируют специальное предложение, хотя упрощенный, случай более широкого метода выборки, известного как stratified sampling. Для более сложного примера стратифицированной выборки смотрите Стратифицированную Выборку.
Несмотря на то, что этот простой пример симулировал одномерный Vasicek
модель процентной ставки, это применяется к проблемам любой размерности.
Совет
Броуновские мостовые методы также применяют более общие методы сокращения отклонения. Для получения дополнительной информации смотрите Стратифицированную Выборку.
Вся симуляция и методы интерполяции позволяют вам задавать последовательность функций или фоновые процессы, оценивать в конце каждого периода шага расчета. Этот период включает любые промежуточные временные шаги, определенные дополнительным NSteps
введите, как обсуждено в Оптимизации Точности: О Точности Решения и Ошибке. Эти функции заданы как вызываемые функции времени и состояния, и должны возвратить обновленный вектор состояния X t:
Необходимо задать несколько функций обработки как массив ячеек функций. Эти функции вызываются в порядке, в котором они появляются в массиве ячеек.
Обрабатывающие функции не требуются, чтобы использовать время (t) или утверждать (X t). Они также не требуются обновить или изменить вектор состояния ввода. На самом деле симуляция и методы интерполяции не знают о любых деталях реализации, и в этом отношении, они только придерживаются опубликованного интерфейса.
Такие функции обработки обеспечивают мощный инструмент моделирования, который может решить различные задачи. Такие функции позволяют, вы к, например, задаете граничные условия, накапливаете статистику, строите графики и цену зависимые от предшествующего пути развития опции.
За исключением Броуновского движения (BM
) модели, отдельные компоненты симулированного вектора состояния обычно представляют переменные, реальные дубликаты которых являются по сути положительными количествами, такими как цены активов или процентные ставки. Однако по умолчанию большая часть симуляции и методов интерполяции, обеспеченных здесь, моделируют переход между последовательными шагами расчета как масштабированное (возможно многомерный) Гауссова ничья. Так, при аппроксимации процесса непрерывного времени в дискретное время вектор состояния не может остаться положительным. Единственное исключение simBySolution
для gbm
объекты и simBySolution
для hwv
объекты, логарифмическое преобразование отделимых моделей геометрического броуновского движения. Кроме того, по умолчанию, ни одна из симуляции и методов интерполяции не вносит изменения в вектор состояния. Поэтому вы ответственны за обеспечение, что все компоненты вектора состояния остаются положительными как соответствующими.
К счастью, определение неотрицательных состояний гарантирует простую корректировку обработки конца периода. Несмотря на то, что эта корректировка широко применима, это разоблачающе, когда применено одномерный cir
модель диффузии квадратного корня:
Возможно, первичное обращение одномерного cir
модели, где:
это, короткий уровень остается положительным. Однако положительность коротких уровней только содержит для базовой модели непрерывного времени.
Симулируйте ежедневные короткие уровни cir
модель. Чтобы проиллюстрировать последний оператор, симулируйте ежедневные короткие уровни cir
модель, с помощью cir
, за один календарный год (приблизительно 250 торговых дней):
rng(14151617,'twister') obj = cir(0.25,@(t,X)0.1,0.2,'StartState',0.02); [X,T] = simByEuler(obj,250,'DeltaTime',1/250,'nTrials',5); sprintf('%0.4f\t%0.4f+i%0.4f\n',[T(195:205)';... real(X(195:205,1,4))'; imag(X(195:205,1,4))'])
ans = '0.7760 0.0003+i0.0000 0.7800 0.0004+i0.0000 0.7840 0.0002+i0.0000 0.7880 -0.0000+i0.0000 0.7920 0.0001+i0.0000 0.7960 0.0002+i0.0000 0.8000 0.0002+i0.0000 0.8040 0.0008+i0.0001 0.8080 0.0004+i0.0001 0.8120 0.0008+i0.0001 0.8160 0.0008+i0.0001 '
Процентные ставки могут стать отрицательными, если получившиеся пути симулированы в дискретное время. Кроме того, начиная с cir
модели включают термин диффузии квадратного корня, короткие уровни могут даже стать комплексными.
Повторите симуляцию с функцией обработки. Повторите симуляцию, на этот раз задав функцию обработки, которая берет абсолютную величину короткого уровня в конце каждого периода. Можно получить доступ к функции обработки ко времени и состоянию (t, Xt), но это только использует вектор состояния коротких уровней Xt:
rng(14151617,'twister') [Y,T] = simByEuler(obj,250,'DeltaTime',1/250,... 'nTrials',5,'Processes',@(t,X)abs(X));
Сравните настроенные и ненастроенные пути. Графически сравните величину неприспособленного пути (с отрицательными и комплексными числами!) к соответствующему пути, сохраненному положительным при помощи обработки конца периода, функционируют по отрезку времени интереса:
clf plot(T,100*abs(X(:,1,4)),'red',T,100*Y(:,1,4),'blue') axis([0.75 1 0 0.4]) xlabel('Time (Years)'), ylabel('Short Rate (%)') title('Univariate CIR Short Rates') legend({'Negative/Complex Rates' 'Positive Rates'}, ... 'Location', 'Best')
Совет
Можно использовать этот метод, чтобы получить более точные решения SDE. Для получения дополнительной информации смотрите Факторы Эффективности.
bates
| bm
| cev
| cir
| diffusion
| drift
| gbm
| heston
| hwv
| interpolate
| merton
| sde
| sdeddo
| sdeld
| sdemrd
| simByEuler
| simByQuadExp
| simBySolution
| simBySolution
| simulate
| ts2func