Этот пример показывает, как оценить и вычислить чувствительность для европейских и американских опций спреда с помощью различных методов. Во-первых, цена и чувствительность для европейской опции спреда вычисляются с помощью решений закрытой формы. Затем цена и чувствительности для опции американского спреда вычисляются с помощью симуляции конечного различия и симуляции Монте-Карло. Наконец, последующий анализ проводится по опциям распространения с другой областью значений входов.
Опции спреда - это опции на различие двух базовых цен активов. Например, опция вызова для спреда между двумя активами имеет следующую выплату на срок:
где - цена первого базового актива, является ценой второго базового актива, и - цена доставки. В зрелости, если спред больше, чем цена доставки держатель опции использует опцию и получает различие между спредом и ценой страйка. Если спред меньше 0, держатель опций не использует опцию, и выплата равна 0. Опции спреда часто торгуются на энергетическом рынке. Двумя примерами являются:
Спреды трещин: Опции на спреде между нефтепереработанными продуктами и сырой нефтью. Спред представляет собой запас на переработку, произведенный нефтеперерабатывающим заводом путем «крекинга» сырой нефти в нефтеперерабатываемый нефтяной продукт.
Искровые спреды: Опции по распространению между электричеством и некоторыми видами топлива. Спред представляет запас степени объекта, который берет топливо, чтобы запустить свой генератор, чтобы произвести электроэнергию.
Существует несколько методов ценового спреда- опций, как обсуждается в [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'};
Financial Instruments Toolbox™ содержит два типа приближений закрытой формы для вычисления цены и чувствительности европейских опций спреда: приближение Кирка (spreadbykirk
, spreadsensbykirk
) и модель Бьерксунда и Стенсленда (spreadbybjs
, spreadsensbybjs
) [3].
Функция spreadsensbykirk
вычисляет цены и чувствительность для европейского спреда опции используя приближение Kirk's.
% 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
вычисляет цены и чувствительности для европейского спред- опцию с помощью модели Bjerksund и Stensland. В [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
Сравнение рассчитанных цен показывает, что две модели закрытой формы дают одинаковые результаты для цены и чувствительности. В сложение с дельтой и гаммой функции могут также вычислять theta, вегу, лямбду и rho.
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
Хотя приближения закрытой формы быстро и хорошо подходят для ценообразования европейских опций спреда, они не могут оценить американские опции спреда. Используя метод конечного различия и метод Монте-Карло, можно оценить американскую опцию спреда. В этом примере опция американского спреда оценивается с теми же атрибутами, что и опция выше.
Метод конечного различия численно решает УЧП путем дискретизации базовых переменных цены и времени в сетку. 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');
Американская опция стиля может быть оценена методами Монте-Карло с помощью метода наименьших квадратов Longstaff и Schwartz [4]. В Financial Instruments 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, различие между приближением Кирка и конечным различием (красная линия) увеличивается, в то время как различие между моделью Бьерксунда и Stensland и конечным различием (синяя линия) остается на одном уровне. Как указано в [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
. Для этого анализа используется модель Bjerksund и Stensland.
% 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
Изменение цены и веги в отношении волатильности первого актива показано ниже. Можно заметить, что по мере увеличения волатильности первого актива увеличивается и цена опции спреда. Также изменения в веге свидетельствуют о том, что цена опция становится более чувствительной к волатильности первого актива и менее чувствительной к волатильности второго актива.
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');
В этом примере европейские и американские опции спреда оцениваются и анализируются с помощью различных методов. Financial Instruments Toolbox™ обеспечивает функции для двух типов решений закрытой формы (Kirk, BJS), метод конечного различия и метод симуляции Монте-Карло. Решения закрытой формы хорошо подходят для расчета цен и чувствительности европейских опций спреда, потому что они быстрые. Однако они не могут оценить американские опции спреда. Метод конечного различия и метод Монте-Карло могут стоить как европейские так и американские опции. Тем не менее, они не так быстро ценят европейские опции спреда по сравнению с закрытыми формами решений.
[1] Кармона, Рене, Дуррлеман, Валдо. «Ценообразование и хеджирование спред- Опции». Обзор СИАМ. Том 45, № 4, 2003, стр. 627-685.
[2] Уилмотт, Пол, Дьюин, Джефф, Ховисон, Сам. опционное ценообразование. Oxford Financial Press, 1993.
[3] Бьерксунд, Петтер, Стенсленд, Гуннар. «Оценка опции спреда закрытой формы». Министерство финансов, NHH, 2006.
[4] Longstaff, Francis A, Schwartz, Eduardo S. «Оценка американских опций по симуляции: простой подход методом наименьших квадратов». Высшая школа управления Андерсона, Калифорния Лос-Анджелес, 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