exponenta event banner

Повышение производительности моделирования Monte Carlo с помощью параллельных вычислений

В этом примере показано, как повысить производительность моделирования Monte Carlo с помощью Parallel Computing Toolbox™.

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

dS (t) = r (t) S (t) dt + V (t, S (t)) S (t) dW (t)

для цены акций 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);

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

См. также

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

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

Подробнее