В этом примере показано, как оценить и рассчитать чувствительность для европейских и американских вариантов спреда с использованием различных методов. Во-первых, цена и чувствительность для европейского варианта спреда рассчитывается с использованием решений закрытой формы. Затем цена и чувствительность для американского варианта спреда рассчитывается с использованием моделирования конечной разницы и Монте-Карло. Наконец, проводится дальнейший анализ вариантов распределения с другим диапазоном входных данных.
Опционы спреда - это опционы на разницу двух базовых цен активов. Например, опцион колл на спред между двумя активами имеет следующее погашение при погашении:
)
где - цена первого базового актива, - цена второго базового актива, а - цена страйка. При погашении, если спреда больше цены страйка , держатель опциона осуществляет опцион и получает разницу между ценой спреда и ценой страйка. Если спред меньше 0, владелец опциона не выполняет опцион, а выплата равна 0. Опционы на спред часто торгуются на энергетическом рынке. Два примера:
Распространение трещин: Варианты распределения между нефтепродуктами и сырой нефтью. Разброс представляет собой маржу нефтепереработки, получаемую нефтеперерабатывающим заводом путем «крекинга» сырой нефти в нефтепродукт.
Spark spreads: Варианты на разброс между электричеством и некоторым видом топлива. Спред представляет собой запас электростанции, которая берет топливо, чтобы запустить свой генератор для производства электроэнергии.
Существует несколько методов опционов спреда цен, как описано в [1]. Этот пример использует закрытую форму, конечную разницу и моделирование Монте-Карло для вариантов спреда цен. Преимущества и недостатки каждого способа обсуждаются ниже.
Решения с закрытой формой и аппроксимации дифференциальных уравнений в частных производных (PDE) выгодны, потому что они очень быстрые и хорошо распространяются на вычислительные чувствительности (греки). Однако решения с закрытой формой доступны не всегда, например, для вариантов американского спреда.
Метод конечных разностей - это численная процедура для решения PDE путем дискретизации переменных цены и времени в сетку. Подробный анализ этого метода приведен в [2]. Он может обрабатывать случаи, когда решения закрытой формы недоступны. Кроме того, конечная разница распространяется на расчет чувствительности, поскольку она выводит сетку опционных цен для диапазона базовых цен и времени. Однако она медленнее, чем решения с закрытой формой.
Моделирование Монте-Карло использует случайную выборку для моделирования движений базовых цен активов. Он обрабатывает случаи, когда закрытых решений не существует. Однако для выполнения обычно требуется много времени, особенно если вычисляются чувствительности.
В следующем примере демонстрируется расчет цены опции распространения трещин.
Нефтеперерабатывающий завод обеспокоен предстоящим графиком технического обслуживания и нуждается в защите от снижения цен на сырую нефть и повышения цен на мазут. Во время технического обслуживания нефтеперерабатывающий завод должен продолжать предоставлять клиентам мазут для удовлетворения их потребностей. Стратегия рафинера заключается в использовании опционов спреда для управления его хеджированием.
В январе 2013 года нефтепереработчик покупает опцион на распространение трещины 1:1, приобретая фьючерсы на мазут и продавая фьючерсы на сырую нефть. CLF14 фьючерсы на нефть WTI находятся на уровне $100 за баррель, а HOF14 фьючерсный контракт на мазут - на уровне $2,6190 за галлон.
clear; % Price, volatility, and dividend of heating oil Price1gallon = 2.6190; % $/gallon Price1 = Price1gallon*42; % $/barrel Vol1 = 0.10; Div1 = 0.03; % Price, volatility, and dividend of WTI crude oil Price2 = 100; % $/barrel Vol2 = 0.15; Div2 = 0.02; % Correlation of underlying prices Corr = 0.3; % Option type OptSpec = 'call'; % Strike Strike = 5; % Settlement date Settle = '01-Jan-2013'; % Maturity Maturity = '01-Jan-2014'; % Risk free rate RiskFreeRate = 0.05;
Функции ценообразования принимают в качестве входных данных структуру срока процентной ставки и структуру запаса. Кроме того, необходимо указать, какие выходные данные представляют интерес.
% Define RateSpec Compounding = -1; Basis = 1; RateSpec = intenvset('ValuationDate', Settle, 'StartDates', Settle, ... 'EndDates', Maturity, 'Rates', RiskFreeRate, 'Compounding', ... Compounding, 'Basis', Basis); % Define StockSpec for the two assets StockSpec1 = stockspec(Vol1, Price1, 'Continuous', Div1); StockSpec2 = stockspec(Vol2, Price2, 'Continuous', Div2); % Specify price and sensitivity outputs OutSpec = {'Price', 'Delta', 'Gamma'};
Toolbox™ финансовых инструментов содержит два типа приближений закрытой формы для расчета цены и чувствительности европейских вариантов спреда: приближение Кирка (spreadbykirk, spreadsensbykirk) и модель Бьерксунда и Стенсланда (spreadbybjs, spreadsensbybjs) [3].
Функция spreadsensbykirk рассчитывает цены и чувствительность для европейского варианта спреда с использованием аппроксимации Кирка.
% Kirk's approximation [PriceKirk, DeltaKirk, GammaKirk] = ... spreadsensbykirk(RateSpec, StockSpec1, StockSpec2, Settle, ... Maturity, OptSpec, Strike, Corr, 'OutSpec', OutSpec)
PriceKirk = 8.3636
DeltaKirk = 1×2
0.6108 -0.5590
GammaKirk = 1×2
0.0225 0.0249
Функция spreadsensbybjs вычисляет цены и чувствительность для европейского варианта спреда с использованием модели Бьерксунда и Стенсланда. В [3] Бьерксунд и Стенсланд объясняют, что приближение Кирка имеет тенденцию недооценивать опцию разброса, когда удар близок к нулю, и завышать цену, когда удар дальше от нуля. Для сравнения, модель Bjerksund и Stensland имеет более высокую точность.
% Bjerksund and Stensland model [PriceBJS, DeltaBJS, GammaBJS] = ... spreadsensbybjs(RateSpec, StockSpec1, StockSpec2, Settle, ... Maturity, OptSpec, Strike, Corr, 'OutSpec', OutSpec)
PriceBJS = 8.3662
DeltaBJS = 1×2
0.6115 -0.5597
GammaBJS = 1×2
0.0225 0.0248
Сравнение рассчитанных цен показывает, что две модели закрытой формы дают сходные результаты по цене и чувствительности. Помимо дельты и гамма, функции также могут вычислять тету, вегу, лямбду и ро.
displayComparison('Kirk', 'BJS', PriceKirk, PriceBJS, DeltaKirk, DeltaBJS, GammaKirk, GammaBJS)
Comparison of prices: Kirk: 8.363641 BJS : 8.366158 Comparison of delta: Kirk: 0.610790 -0.558959 BJS : 0.611469 -0.559670 Comparison of gamma: Kirk: 0.022533 0.024850 BJS : 0.022495 0.024819
Хотя закрытые приближенные формы быстро и хорошо подходят для ценообразования европейских опционов спреда, они не могут оценить американские опционы спреда. Используя метод конечных разностей и метод Монте-Карло, можно оценить американский вариант спреда. В этом примере американская опция спреда оценивается с теми же атрибутами, что и вышеупомянутая опция спреда трещин.
Метод конечных разностей численно решает PDE путем дискретизации базовых переменных цены и времени в сетку. Финансовый инструмент Toolbox™ содержащий функции. spreadbyfd и spreadsensbyfd, которые рассчитывают цены и чувствительность для европейских и американских вариантов спреда с использованием метода конечных разниц. Для метода конечных разностей состав сетки оказывает большое влияние на качество вывода и время выполнения. Как правило, тонко дискретизированная сетка приводит к выходам, которые ближе к теоретическому значению, но они происходят за счет более длительного времени выполнения. Управление составом сетки осуществляется с использованием дополнительных параметров. PriceGridSize, TimeGridSize, AssetPriceMin и AssetPriceMax.
Чтобы указать цену американского опциона, добавьте дополнительный ввод AmericanOpt со значением 1 к аргументу функции.
% Finite difference method for American spread option [PriceFD, DeltaFD, GammaFD, PriceGrid, AssetPrice1, ... AssetPrice2] = ... spreadsensbyfd(RateSpec, StockSpec1, StockSpec2, Settle, ... Maturity, OptSpec, Strike, Corr, 'OutSpec', OutSpec, ... 'PriceGridSize', [500 500], 'TimeGridSize', 100, ... 'AssetPriceMin', [0 0], 'AssetPriceMax', [2000 2000], ... 'AmericanOpt', 1); % Display price and sensitivities PriceFD
PriceFD = 8.5463
DeltaFD
DeltaFD = 1×2
0.6306 -0.5777
GammaFD
GammaFD = 1×2
0.0233 0.0259
Функция spreadsensbyfd также возвращает сетку, которая содержит цены опционов для диапазона базовых цен и времени. Сетка опционных цен в нулевое время, которая является опционными ценами на дату расчета, может быть выведена на график для диапазона базовых цен.
% Plot option prices figure; mesh(AssetPrice1, AssetPrice2, PriceGrid(:, :, 1)'); title('American Spread Option Prices for Range of Underlying Prices'); xlabel('Price of underlying asset 1'); ylabel('Price of underlying asset 2'); zlabel('Price of spread option');

Вариант американского стиля может быть оценен методами Монте-Карло методом наименьшего квадрата Лонгстаффа и Шварца [4]. Toolbox™ Финансовые инструменты содержит функции spreadbyls и spreadsensbyls, которые рассчитывают цены и чувствительность европейских и американских вариантов с использованием моделирования. Метод моделирования Монте-Карло в spreadsensbyls генерирует несколько путей моделирования в соответствии с геометрическим движением Броуна (GBM) для двух базовых цен активов. Аналогично методу конечных разностей, где гранулярность сетки определяла качество вывода и время выполнения, качество вывода и время выполнения моделирования Монте-Карло зависит от количества путей (NumTrialsи количество периодов времени на тракт (NumPeriods). Также результаты, полученные при моделировании Монте-Карло, не являются детерминированными. Каждый прогон будет иметь различные результаты в зависимости от результатов моделирования.
% To indicate that we are pricing an American option using the Longstaff % and Schwartz method, add an optional input of |AmericanOpt| with a value % of |1| to the argument of the function. % Monte Carlo method for American spread option [PriceMC, DeltaMC, GammaMC] = ... spreadsensbyls(RateSpec, StockSpec1, StockSpec2, Settle, ... Maturity, OptSpec, Strike, Corr, 'OutSpec', OutSpec, ... 'NumTrials', 1000, 'Antithetic', true, 'AmericanOpt', 1)
PriceMC = 8.4999
DeltaMC = 1×2
0.6325 -0.5931
GammaMC = 1×2
-0.0873 0.0391
Результаты двух моделей сравниваются. Цены и чувствительность, рассчитанные методом Лонгстаффа и Шварца, будут варьироваться на каждом прогоне в зависимости от результата моделирования. Важно отметить, что качество результатов метода конечных разностей и моделирования Монте-Карло зависит от необязательных входных параметров. Например, увеличение количества путей (NumTrials) для spreadsensbyls функция приведет к более точным результатам за счет более длительного времени выполнения.
displayComparison('Finite Difference', 'Monte Carlo', PriceFD, PriceMC, DeltaFD, DeltaMC, GammaFD, GammaMC)
Comparison of prices: Finite Difference: 8.546285 Monte Carlo : 8.499894 Comparison of delta: Finite Difference: 0.630606 -0.577686 Monte Carlo : 0.632549 -0.593106 Comparison of gamma: Finite Difference: 0.023273 0.025852 Monte Carlo : -0.087340 0.039120
Как обсуждалось ранее, приближение Кирка имеет тенденцию к опциям распространения завышенной цены, когда удар дальше от нуля. Чтобы подтвердить это, опция спреда оценивается с теми же атрибутами, что и раньше, но для диапазона цен страйка.
% Specify outputs OutSpec = {'Price', 'Delta'}; % Range of strike prices Strike = [-25; -15; -5; 0; 5; 15; 25];
Результаты аппроксимации Кирка и модели Бьерксунда и Стенсланда сравниваются с численным аппроксимацией метода конечных разностей. С тех пор spreadsensbyfd может стоить только один вариант за раз, он вызывается в цикле для каждого значения страйка. Симуляция Монте-Карло (spreadsensbyls) с большим количеством пробных путей также можно использовать в качестве эталона, но для этого примера используется конечная разница.
% Kirk's approximation [PriceKirk, DeltaKirk] = ... spreadsensbykirk(RateSpec, StockSpec1, StockSpec2, Settle, ... Maturity, OptSpec, Strike, Corr, 'OutSpec', OutSpec); % Bjerksund and Stensland model [PriceBJS, DeltaBJS] = ... spreadsensbybjs(RateSpec, StockSpec1, StockSpec2, Settle, ... Maturity, OptSpec, Strike, Corr, 'OutSpec', OutSpec); % Finite difference PriceFD = zeros(numel(Strike), 1); DeltaFD = zeros(numel(Strike), 2); for i = 1:numel(Strike) [PriceFD(i), DeltaFD(i,:)] = ... spreadsensbyfd(RateSpec, StockSpec1, StockSpec2, Settle, ... Maturity, OptSpec, Strike(i), Corr, 'OutSpec', OutSpec, ... 'PriceGridSize', [500 500], 'TimeGridSize', 100, ... 'AssetPriceMin', [0 0], 'AssetPriceMax', [2000 2000]); end displayComparisonPrices(PriceKirk, PriceBJS, PriceFD, Strike)
Prices for range of strikes: Kirk BJS FD 32.707787 32.672353 32.676040 23.605307 23.577099 23.580307 15.236908 15.228510 15.230919 11.560332 11.560332 11.562023 8.363641 8.366158 8.367212 3.689909 3.678862 3.680493 1.243753 1.219079 1.221866
Разница в ценах между закрытой формой и методом конечных разниц показана ниже. Понятно, что по мере того, как удар отдаляется от 0, разница между аппроксимацией Кирка и конечной разницей (красной линией) увеличивается, в то время как разница между моделью Бьерксунда и Стенсланда и конечной разницей (синей линией) остается на одном уровне. Как сказано в [3], приближение Кирка завышает цену варианта спреда, когда удар находится далеко от 0.
% Plot of difference in price against the benchmark figure; plot(PriceKirk-PriceFD, 'Color', 'red'); hold on; plot(PriceBJS-PriceFD, 'Color', 'blue'); hold off; title('Difference in Price Against Finite Difference'); legend('Kirk', 'BJS', 'Location', 'EastOutside'); xlabel('Strike'); ax = gca; ax.XTickLabel = Strike; ylabel('Difference in Price');

Затем выводится на печать разность в дельте между моделями замкнутой формы и конечной разностью. Верхний график показывает разницу в дельте для первого основного средства, а нижний график показывает разницу в дельте для второго основного средства. Как видно из малых приращений в оси y порядка 10e-3, можно видеть, что все три модели (Kirk, BJS, конечная разность) производят аналогичные значения для дельты.
% Plot of difference in delta of first asset against the benchmark figure; subplot(2, 1, 1); plot(DeltaKirk(:,1)-DeltaFD(:,1), 'Color', 'red'); hold on; plot(DeltaBJS(:,1)-DeltaFD(:,1), 'Color', 'blue'); hold off; title('Difference in Delta (Asset 1) Against FD'); legend('Kirk', 'BJS', 'Location', 'EastOutside'); xlabel('Strike'); ax = gca; ax.XTickLabel = Strike; ylabel('Difference in Delta'); % Plot of difference in delta of second asset against the benchmark subplot(2, 1, 2); plot(DeltaKirk(:,2)-DeltaFD(:,2), 'Color', 'red'); hold on; plot(DeltaBJS(:,2)-DeltaFD(:,2), 'Color', 'blue'); hold off; title('Difference in Delta (Asset 2) Against FD'); legend('Kirk', 'BJS', 'Location', 'EastOutside'); xlabel('Strike'); ax = gca; ax.XTickLabel = Strike; ylabel('Difference in Delta');

Чтобы дополнительно показать тип анализа, который может быть проведен с использованием этих моделей, вышеупомянутый вариант спреда оценивается при различных уровнях волатильности для первого актива. Цена и вега сравниваются при трех уровнях волатильности для первого актива: 0.1, 0.3, и 0.5. Для этого анализа используется модель Бьерксунда и Стенсланда.
% Strike Strike = 5; % Specify output OutSpec = {'Price', 'Vega'}; % Different levels of volatility for asset 1 Vol1 = [0.1, 0.3, 0.5]; StockSpec1 = stockspec(Vol1, Price1, 'Continuous', Div1); % Bjerksund and Stensland model [PriceBJS, VegaBJS] = ... spreadsensbybjs(RateSpec, StockSpec1, StockSpec2, Settle, ... Maturity, OptSpec, Strike, Corr, 'OutSpec', OutSpec); displaySummary(Vol1, PriceBJS, VegaBJS)
Prices for different vol levels in asset 1: 8.366158 14.209112 21.795746 Asset 1 vega for different vol levels in asset 1: 15.534849 36.212192 38.794348 Asset 2 vega for different vol levels in asset 1: 29.437036 7.133657 -0.557852
Изменение цены и vega в отношении волатильности первого актива показано ниже. Можно заметить, что по мере увеличения волатильности первого актива цена опциона спреда также увеличивается. Также изменения в vega указывают на то, что цена опциона спреда становится более чувствительной к волатильности первого актива и менее чувствительной к волатильности второго актива.
figure; % Plot price for BJS model subplot(2, 1, 1); plot(PriceBJS, 'Color', 'red'); title('Price (BJS)'); legend('Price', 'Location', 'EastOutside'); xlabel('Vol of Asset 1'); ax = gca; ax.XTick = 1:3; ax.XTickLabel = Vol1; ylabel('Price'); % Plot of vega for BJS model subplot(2, 1, 2); plot(VegaBJS(:,1), 'Color', 'red'); hold on; plot(VegaBJS(:,2), 'Color', 'blue'); hold off; title('Vega (BJS)'); legend('Asset 1', 'Asset 2', 'Location', 'EastOutside'); xlabel('Vol of Asset 1'); ax = gca; ax.XTick = 1:3; ax.XTickLabel = Vol1; ax.YLim = [-1 40]; ylabel('Vega');

В этом примере европейские и американские варианты спреда оцениваются и анализируются с использованием различных методов. Toolbox™ финансовых инструментов предоставляет функции для двух типов решений закрытой формы (Kirk, BJS), метода конечных разниц и метода моделирования Монте-Карло. Решения закрытой формы хорошо подходят для ценообразования и расчета чувствительности европейских вариантов спреда, потому что они быстры. Однако они не могут оценить опционы американского спреда. Метод конечных разниц и метод Монте-Карло могут стоить как европейские, так и американские варианты. Однако они не так быстры в ценообразовании европейских вариантов спреда по сравнению с решениями закрытой формы.
[1] Кармона, Рене, Дуррлеман, Вальдо. «Опционы ценообразования и хеджирования спредов». Обзор СИАМ. Том 45, № 4, 2003, стр. 627-685.
[2] Уилмотт, Пол, Дьюинн, Джефф, Ховисон, Сам. Ценообразование опционов. Оксфордская финансовая пресса, 1993 год.
[3] Бьерксунд, Петтер, Стенсланд, Гуннар. «Закрытая опционная оценка спреда формы». Департамент финансов, NHH, 2006 год.
[4] Лонгстафф, Фрэнсис А, Шварц, Эдуардо С. «Оценка американских вариантов путем моделирования: простой подход с наименьшими квадратами». Андерсонская высшая школа менеджмента, Лос-Анджелес, 2001.
function displayComparison(model1, model2, price1, price2, delta1, delta2, gamma1, gamma2) % Pad the model name with additional spaces additionalSpaces = numel(model1) - numel(model2); if additionalSpaces > 0 model2 = [model2 repmat(' ', 1, additionalSpaces)]; else model1 = [model1 repmat(' ', 1, abs(additionalSpaces))]; end % Comparison of calculated prices fprintf('Comparison of prices:\n'); fprintf('\n'); fprintf('%s: % f\n', model1, price1); fprintf('%s: % f\n', model2, price2); fprintf('\n'); % Comparison of Delta fprintf('Comparison of delta:\n'); fprintf('\n'); fprintf('%s: % f % f\n', model1, delta1(1), delta1(2)); fprintf('%s: % f % f\n', model2, delta2(1), delta2(2)); fprintf('\n'); % Comparison of Gamma fprintf('Comparison of gamma:\n'); fprintf('\n'); fprintf('%s: % f % f\n', model1, gamma1(1), gamma1(2)); fprintf('%s: % f % f\n', model2, gamma2(1), gamma2(2)); fprintf('\n'); end function displayComparisonPrices(PriceKirk, PriceBJS, PriceFD, Strike) % Comparison of calculated prices fprintf('Prices for range of strikes:\n'); fprintf('\n') fprintf('Kirk \tBJS \tFD \n'); for i = 1:numel(Strike) fprintf('%f\t%f\t%f\n', PriceKirk(i), PriceBJS(i), PriceFD(i)); end end function displaySummary(Vol1, PriceBJS, VegaBJS) % Display price fprintf('Prices for different vol levels in asset 1:\n'); fprintf('\n'); for i = 1:numel(Vol1) fprintf('%f\n', PriceBJS(i)); end fprintf('\n'); % Display vega for first asset fprintf('Asset 1 vega for different vol levels in asset 1:\n'); fprintf('\n'); for i = 1:numel(Vol1) fprintf('%f\n', VegaBJS(i,1)); end fprintf('\n'); % Display vega for second asset fprintf('Asset 2 vega for different vol levels in asset 1:\n'); fprintf('\n'); for i = 1:numel(Vol1) fprintf('%f\n', VegaBJS(i,2)); end end