В этом примере показано, как улучшать производительность симуляции Монте-Карло с помощью Parallel Computing Toolbox™.
Рассмотрите процесс геометрического броуновского движения (GBM), в который вы хотите включить альтернативную динамику цен активов. А именно, предположите, что вы хотите включать изменяющийся во времени короткий уровень и поверхность энергозависимости. Процесс, чтобы симулировать записан как
для курса акций S(t), норма прибыли r(t), энергозависимость 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);
Симулируйте пути в параллели с помощью parfor
цикл. Для пользователей, разрешенных получить доступ к Parallel Computing Toolbox, следующий сегмент кода автоматически создает параллельный пул с помощью локального профиля по умолчанию. При желании это поведение может быть изменено первым вызовом parpool
функция. Если параллельный пул не будет уже создан, следующая симуляция, вероятно, будет медленнее, чем предыдущая симуляция без распараллеливания. В этом случае повторно выполните следующую симуляцию, чтобы оценить истинные преимущества распараллеливания.
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);
Если вы исследуете какой-либо данный путь, полученный без распараллеливания к соответствующему пути с распараллеливанием, вы видите, что они идентичны. Кроме того, несмотря на то, что относительная производительность варьируется, результаты, полученные с распараллеливанием, будут обычно подвергаться существенному улучшению. Чтобы оценить повышение производительности, исследуйте время выполнения каждого подхода в секундах и ускорении, полученном от симуляции путей параллельно.
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