Этот пример показывает, как улучшить эффективность симуляции Монте-Карло с помощью Parallel Computing Toolbox™.
Рассмотрим геометрический процесс броуновского движения (GBM), в котором вы хотите включить альтернативную динамику цен на активы. В частности, предположим, что вы хотите включить изменяющуюся во времени короткую скорость и поверхность волатильности. Процесс для симуляции записывается как
для S(t) цен на акции, скорости < reservedrangesplaceholder2 > возврата, V(t,S(t)) волатильности и W(t) движения Брауна. В этом примере норма возврата является детерминированной функцией времени, а волатильность является функцией времени и текущей цены акций. И возврат, и волатильность заданы на дискретной сетке, так что промежуточные значения получаются линейной интерполяцией. Например, такая симуляция может использоваться для поддержки ценообразования тонко торгуемых опций.
Чтобы включить временные ряды рискованных коротких скоростей, предположим, что вы выводите следующий детерминированный процесс короткой скорости как функцию времени.
times = [0 0.25 0.5 1 2 3 4 5 6 7 8 9 10]; % in years
rates = [0.1 0.2 0.3 0.4 0.5 0.8 1.25 1.75 2.0 2.2 2.25 2.50 2.75]/100;
Предположим, что затем вы выводите следующую поверхность волатильности, столбцы которой соответствуют простой относительной денежности или отношению спотовой цены к цене доставки, и строки которой соответствуют времени к сроку или тенору.
surface = [28.1 25.3 20.6 16.3 11.2 6.2 4.9 4.9 4.9 4.9 4.9 4.9
22.7 19.8 15.4 12.6 9.6 6.7 5.2 5.2 5.2 5.2 5.2 5.2
21.7 17.6 13.7 11.5 9.4 7.3 5.7 5.4 5.4 5.4 5.4 5.4
19.8 16.4 12.9 11.1 9.3 7.6 6.2 5.6 5.6 5.6 5.6 5.6
18.6 15.6 12.5 10.8 9.3 7.8 6.6 5.9 5.9 5.9 5.9 5.9
17.4 13.8 11.7 10.8 9.9 9.1 8.5 7.9 7.4 7.3 7.3 7.3
17.1 13.7 12.0 11.2 10.6 10.0 9.5 9.1 8.8 8.6 8.4 8.0
17.5 13.9 12.5 11.9 11.4 10.9 10.5 10.2 9.9 9.6 9.4 9.0
18.3 14.9 13.7 13.2 12.8 12.4 12.0 11.7 11.4 11.2 11.0 10.8
19.2 19.6 14.2 13.9 13.4 13.0 13.2 12.5 12.1 11.9 11.8 11.4]/100;
tenor = [0 0.25 0.50 0.75 1 2 3 5 7 10]; % in years
moneyness = [0.25 0.5 0.75 0.8 0.9 1 1.10 1.25 1.50 2 3 5];
Установите параметры симуляции. Следующее предполагает, что цена базового актива первоначально равна цене забастовки и что цена базового актива моделируется ежемесячно в течение 10 лет, или 120 месяцев. Как простой рисунок, моделируются 100 путей расчета.
price = 100; strike = 100; dt = 1/12; NPeriods = 120; NTrials = 100;
Для воспроизводимости установите генератор случайных чисел по умолчанию и нарисуйте Гауссовы случайные вариации, которые управляют симуляцией. Генерация случайных вариаций не является необходимой для улучшения эффективности параллельных расчетов, но это позволяет полученным моделируемым путям совпадать с путями обычного (то есть непараллелированного) симуляции. Кроме того, генерация независимых Гауссовых случайных вариаций как входов также гарантирует, что все моделируемые пути являются независимыми.
rng default
Z = randn(NPeriods,1,NTrials);
Создайте функции возврата и волатильности и модель GBM с помощью gbm
. Заметьте, что скорость возврата является детерминированной функцией времени, и, следовательно, принимает время симуляции как его единственный входной параметр. Напротив, волатильность должна учитывать денежность и является функцией как времени, так и цены акций. Кроме того, поскольку поверхность волатильности определяется как функция времени до зрелости, а не времени симуляции, функция волатильности вычитает текущее время симуляции из последнего времени, в которое моделируется процесс цены (10 лет). Это гарантирует, что когда время симуляции приближается к своему конечному значению, время до зрелости поверхности волатильности приближается к нулю. Несмотря на то, что при желании могут использоваться намного более сложные функции возврата и волатильности, следующее предполагает простую линейную интерполяцию.
mu = @(t) interp1(times,rates,t);
sigma = @(t,S) interp2(moneyness,tenor,surface,S/strike,tenor(end)-t);
mdl = gbm(mu,sigma,'StartState',price);
Моделируйте пути базового геометрического броуновского движения без параллелизации.
tStart = tic; paths = simBySolution(mdl,NPeriods,'NTrials',NTrials,'DeltaTime',dt,'Z',Z); time1 = toc(tStart);
Моделируйте пути параллельно с помощью a parfor
Цикл (Parallel Computing Toolbox). Для пользователей, имеющих лицензию на доступ к Parallel Computing Toolbox, следующий сегмент кода автоматически создает параллельный пул с использованием локального профиля по умолчанию. При желании это поведение можно изменить, предварительно вызвав parpool
(Parallel Computing Toolbox) функция. Если параллельный пул еще не создан, следующая симуляция, вероятно, будет медленнее, чем предыдущая симуляция без параллелизации. В этом случае перезапустите следующую симуляцию, чтобы оценить истинные преимущества параллелизации.
tStart = tic; parPaths = zeros(NPeriods+1,1,NTrials); parfor i = 1:NTrials parPaths(:,:,i) = simBySolution(mdl,NPeriods,'DeltaTime',dt,'Z',Z(:,:,i)); end time2 = toc(tStart);
Если вы исследуете любой заданный путь, полученный без параллелизации соответствующему пути с параллелизацией, вы видите, что они идентичны. Кроме того, хотя относительная эффективность изменяются, результаты, полученные при параллелизации, в целом будут иметь значительное улучшение. Чтобы оценить улучшение эффективности, исследуйте время выполнения каждого подхода в секундах и speedup
полученный от симуляции путей параллельно.
time1 % elapsed time of conventional simulation, in seconds time2 % elapsed time of parallel simulation, in seconds speedup = time1/time2 % speedup factor
time1 = 6.1329 time2 = 2.5918 speedup = 2.3663
bates
| bm
| cev
| cir
| diffusion
| drift
| gbm
| heston
| hwv
| interpolate
| merton
| sde
| sdeddo
| sdeld
| sdemrd
| simByEuler
| simByQuadExp
| simBySolution
| simBySolution
| simulate
| ts2func