В этом примере показано, как оценить опцию колебания с помощью симуляции Монте-Карло и метода Лонгштафф-Шварца. Нейтральная к риску симуляция базовой цены на природный газ проводится с помощью возвращающейся среднее значение модели. Результаты симуляции используются, чтобы оценить опцию колебания на основе метода Лонгштафф-Шварца [6]. Этот подход использует метод регрессии, чтобы аппроксимировать значение продолжения опции. Сравнение сделано между полиномом и основанием сплайна соответствовать регрессии. Наконец, получившиеся цены анализируются против более низких и верхних ценовых контуров, выведенных из стандартных европейских и американских опций.
Опции Swing являются популярными финансовыми инструментами на энергетическом рынке, которые обеспечивают гибкость в объеме поставленного актива. Для энергетических потребителей, чтобы защитить себя от колебаний цен на энергоносители, они хотят привязать цену путем покупки форвардного контракта, названного baseload форвардным контрактом. Однако потребители не знают точно, сколько энергии будет использоваться в будущем, и энергетические предметы потребления, такие как электричество и газ не могут легко храниться. Поэтому потребитель хочет, чтобы гибкость изменила сумму энергии, которая поставляется в каждую дату поставки. Опции Swing обеспечивают эту гибкость. Таким образом полный контракт состоит из двух частей: baseload форвардный контракт и компонент опции колебания.
Опции Swing являются обычно внебиржевыми (OTC) контрактами, которые могут быть высоко настроены. Поэтому существует много различных типов ограничений и штрафов (см. [5] для получения дополнительной информации). В этом примере оценена опция колебания, где единственное ограничение является ежедневным объемом, который известен как Ежедневное количество контракта (DCQ). Когда право колебания реализовано, объем не может понизиться минимальный DCQ (minDCQ
), или выйдите за предел максимального DCQ (maxDCQ
).
Существует несколько методов, чтобы оценить опции колебания, такие как конечные разности, симуляция и динамическое программирование на основе деревьев [5]. Этот пример использует основанный на симуляции подход с методом Лонгштафф-Шварца. Преимущество основанного на симуляции подхода - то, что движущие силы, используемые, чтобы симулировать цену базового актива, разделяются от алгоритма оценки. В конечной разности и основанных на дереве методах, должен быть изменен алгоритм оценки для того, чтобы считать оценку с различной базовой ценой динамической.
В этом примере природный газ используется в качестве базового актива со следующим средним возвращением, динамическим [8]:
где стандартное Броуновское движение. Применение Леммы ITO к логарифму цены приводит к процессу Orstein-Uhlenbeck:
где , , и задан как:
уровень возвращения к среднему уровню, который определяет значение, в котором симулированные значения вернутся к в конечном счете. скорость возвращения к среднему уровню, которая определяет, как быстро это возвращение происходит. энергозависимость . Мы сначала продолжаем путем симуляции логарифма цены. Впоследствии, экспоненциал симулированных значений взяты, чтобы получить цены.
Продолжительность симуляции в течение одного периода года с начальной ценой 3,9 долларов на млн БТЕ. Симуляция Монте-Карло проводится для 1 000 испытаний с ежедневными периодами. На практике эти параметры калибруются против данных о рынке. В этом примере, , , и . HWV
объект от Financial Toolbox™ используется, чтобы симулировать возвращающуюся среднее значение динамику цены на природный газ.
% Settlement date Settle = '01-Jun-2014'; % Maturity Date Maturity = '01-Jun-2015'; % Actual/Actual basis Basis = 0; % Initial log(price in $/MMBtu) X0 = log(3.9); % Volatility of log(price) Sigma = 0.59; % Number of trials in the Monte Carlo simulation NumTrials =1000; % Number of periods (daily) NumPeriods = daysdif(Settle, Maturity, Basis); % Daily time step dt = 1/NumPeriods; % Mean reversion speed of log(price) Kappa = 1.2; % Mean reversion level of log(price) Theta = 1.7; % Create HWV object hwvobj = hwv(Kappa, Theta, Sigma, 'StartState', X0);
Симуляция запущена и построена ниже.
% Set random number generator seed savedState = rng(0, 'twister'); % Simulate gas prices [Paths, Times] = hwvobj.simBySolution(NumPeriods, 'NTRIALS', NumTrials, ... 'DeltaTime', dt); Paths = squeeze(exp(Paths)); % Restore random number generator state rng(savedState); % Plot paths figure; plot(Times, Paths); title('Natural Gas Risk-Neutral Price Simulation'); xlabel('Time'); ylabel('Price');
В этом примере природный газ используется в качестве базового актива с динамическим средним возвращением. Однако алгоритм Лонгштафф-Шварца может использоваться в других базовых активах, таких как электричество, с любой базовой динамической ценой.
Мы рассматриваем возможность колебания с пятью правами колебания в забастовке $4.69/млн БТЕ, которые могут осуществляться ежедневно между на следующий день после расчетного дня и даты погашения. Количество Контракта The Daily (DCQ) составляет 10 000 млн БТЕ, который является средним количеством природного газа, который потребитель ожидает покупать в данный день. У потребителя есть гибкость, чтобы уменьшать объем покупки (спад) за один день к минимальному DCQ 2 500 млн БТЕ или увеличить покупку (подъем) до 15 000 млн БТЕ. Постоянно составляемый ежегодный безрисковый уровень составляет 1%.
RateSpec
используется, чтобы представлять структуру термина процентной ставки. Ради простоты мы рассматриваем плоскую структуру термина процентной ставки в этом примере. Значения RateSpec
может быть изменен, чтобы разместить любую кривую процентной ставки. Функциональный hswingbyls
в этом примере принимает ежедневное осуществление если ExerciseDates
вход пуст.
% Define RateSpec rfrate = 0.01; Compounding = -1; RateSpec = intenvset('ValuationDate', Settle, 'StartDates', Settle, ... 'EndDates', Maturity, 'Rates', rfrate, ... 'Compounding', Compounding, 'Basis', Basis); % Daily exercise % hswingbyls assumes daily exercise for empty ExerciseDates ExerciseDates = []; % Number of swings NumSwings = 5; % Daily Contract Quantity in MMBtu DCQ = 10000; % Minimum DCQ constraint in MMBtu minDCQ = 2500; % Maximum DCQ constraint in MMBtu maxDCQ = 15000; % Strike Strike = 4.69;
Метод Лонгштафф-Шварца является обратным алгоритмом итерации, который продвигается назад вовремя с даты погашения. В каждую дату осуществления алгоритм аппроксимирует значение продолжения, которое является значением опции, если это не осуществлено. Это сделано путем подбора кривой регрессии против значений симулированных цен и обесцененного будущего значения опции в следующую дату осуществления. Будущее значение опции известно, когда алгоритм перемещается назад вовремя. Значение продолжения сравнивается с суммой выплаты от мгновенного осуществления (спад или подъем) и значение продолжения опции колебания с одним меньшим правом колебания. Если эта сумма меньше, оптимальная стратегия держателя опции не состоит в том, чтобы тренироваться в ту дату. Функциональный hswingbyls
в этом примере использует этот метод, чтобы определить оптимальную стратегию осуществления и цену за опции колебания [1,2,7].
Как обсуждено ранее, единственным ограничением, рассмотренным в этом примере, является минимальный и максимальный DCQ. В этом случае оптимальная ранняя стратегия осуществления имеет тип "скорострельного оружия". Это означает, что, когда это оптимально к подъему или спаду в определенную дату осуществления, держатель опции должен всегда тренироваться в максимальном или минимальном DCQ, чтобы максимизировать прибыль. Осуществление "скорострельного оружия" не было бы оптимальной стратегией если, например, существует терминальный штраф на основе объема. Алгоритм оценки должен был бы затем дополнительно отслеживать все возможные уровни громкости, который значительно добавляет к стоимости производительности во время выполнения.
Во-первых, опция колебания оценена с помощью 3-го полинома порядка, чтобы соответствовать регрессии метода Лонгштафф-Шварца. Функциональный hswingbyls
также генерирует график регрессии между базовой ценой и значением продолжения в дату осуществления перед зрелостью.
% Price swing option using 3rd order polynomial to fit Longstaff-Schwartz % regression tic; useSpline = false; SwingPrice = hswingbyls(Paths, Times, RateSpec, Settle, Maturity, ... Strike, ExerciseDates, NumSwings, DCQ, minDCQ, maxDCQ, useSpline, ... [], true)
SwingPrice = 5.6943e+04
lsPolyTime = toc;
Вышеупомянутый график подгонки регрессии показывает, что 3-й полином порядка не соответствует значению продолжения отлично, особенно около стержня и в экстремальных точках. Мы теперь используем csaps
функционируйте, чтобы соответствовать регрессии с помощью кубического сплайна сглаживания параметром сглаживания 0,7. Curve Fitting Toolbox™ требуется запустить остаток от примера.
% Price swing option using smoothed splines to fit Longstaff-Schwartz % regression tic; useSpline = true; smoothingParam = 0.7; SwingPriceSpline = hswingbyls(Paths, Times, RateSpec, Settle, Maturity, ... Strike, ExerciseDates, NumSwings, DCQ, minDCQ, maxDCQ, useSpline, ... smoothingParam, true)
SwingPriceSpline = 6.0729e+04
lsSplineTime = toc;
График регрессии показывает, что кубический сплайн сглаживания имеет лучшую подгонку против данных, таким образом получая более точное значение для значений продолжения. Однако сравнение ниже показов, что использование кубического сплайна сглаживания занимает больше времени, чем 3-й полином порядка.
% Print comparison of running times
displayRunningTimes(lsPolyTime, lsSplineTime)
Comparison of running times: 3rd order polynomial: 3.33 sec Spline : 9.16 sec
Кроме того, важно отметить, что цена представляет только компонент возможностей. Следовательно, цена baseload форвардного контракта не включена в вышеупомянутую расчетную цену. Поскольку мы использовали фиксированную цену исполнения опциона, контракт baseload имеет ненулевое значение, которое может быть вычислено:
где даты осуществления (см. [3] для получения дополнительной информации). Полная цена контракта, включая baseload и опцию колебания, вычисляется ниже использования цены опции колебания от сглаживавшего кубического сплайна.
% Obtain discount factors RS2 = intenvset(RateSpec, 'StartTimes', 0, 'EndTimes', Times(2:end)); D = intenvget(RS2,'Disc'); % Calculate baseload price BaseLoadPrice = DCQ.*mean(Paths(2:end,:)-Strike,2)'*D; % Calculate full contract price, based on results from cubic spline LS FullContractPrice = BaseLoadPrice + SwingPriceSpline
FullContractPrice = 1.2479e+05
Нижняя граница для опции колебания является полосой европейских опций, и верхняя граница является полосой американских опций [4]. По сравнению с европейскими опциями опции колебания имеют раннюю премию осуществления в каждую дату осуществления, таким образом цена должна быть выше. Цена ниже, чем американские полосы опции, потому что только одно право колебания может быть реализовано в каждую дату осуществления. Больше чем одна полоса может быть осуществлена в один день с помощью американских опций.
Цены на полосы нижних и верхних границ вычисляются ниже, чтобы проверять, что цены опции колебания в этих границах. Европейские цены полосы вычисляются против последних пяти дат осуществления.
% Obtain discount factor for the last NumSwings exercise dates D = D(end-NumSwings+1:end); % European lower bound idx = size(Paths, 1):-1:(size(Paths, 1) - NumSwings + 1); putEuro = D'*mean(max(Strike - Paths(idx,:), 0),2); callEuro = D'*mean(max(Paths(idx,:) - Strike, 0),2); lowerBound = ((DCQ-minDCQ).*putEuro+(maxDCQ-DCQ).*callEuro); % American upper bound [putAmer, callAmer] = hamericanPrice(Paths, Times, RateSpec, Strike); upperBound = NumSwings.*((DCQ-minDCQ).*putAmer+(maxDCQ-DCQ).*callAmer); % Print price and lower/upper bounds displaySummary(SwingPriceSpline, lowerBound, upperBound);
Comparison to lower and upper bounds: Lower bound (European) : 44412.14 Swing Option Price : 60729.00 Upper bound (American) : 68181.42
Цены вычислили, использование алгоритма Лонгштафф-Шварца в нижних и верхних границах. График ниже показов сравнение между опцией колебания и верхними и нижними границами как количество увеличений колебания. Когда количеством колебания является 1
, опция колебания эквивалентна американской опции. В случае ежедневной возможности осуществления (NumSwings = 365
), опция колебания эквивалентна полосе европейских опций с ежедневной зрелостью.
Пример показывает использование метода Лонгштафф-Шварца, чтобы оценить опцию колебания, где базовый актив следует за динамическим средним возвращением. 3-й полином порядка и сглаживавший кубический сплайн используются, чтобы приспособить регрессию в алгоритме Лонгштафф-Шварца, чтобы аппроксимировать значение продолжения. Было показано, что сглаживавший кубический сплайн соответствует данным лучше за счет более медленной производительности. Наконец, получившиеся цены опции колебания проверялись по нижней границе полосы европейских опций и верхней границы полосы американских опций.
[1] Boogert, A., Де Йонг, C., Газовая оценка устройства хранения данных с помощью Метода Монте-Карло. Журнал Производных, 15 (3):81-98, 2008.
[2] Dorr, Уве, Оценка Опций Swing и Оценка стратегий Осуществления Методами Монте-Карло, Оксфордом, 2002.
[3] Оболочка, Джон К., опции, фьючерсы, и другие производные, шестой выпуск, Pearson Education, Inc., 2006.
[4] Jaillet, P., Ronn, E. I. Tompaidis, S., Оценка основанных на товаре опций колебания, Науки управления, 50 (7):909-921, 2004.
[5] Loland, янтарь, Lindqvist, Ola, оценка основанных на товаре опций Swing: обзор, Норск, Regnesentral, 2008.
[6] Longstaff, Фрэнсис А., Шварц, Эдуардо С, оценивая американские опции симуляцией: простой подход наименьших квадратов, анализ финансовых исследований, 14 (1):113-147, 2001.
[7] Meinshausen, N., Hambly, B.M., Методы Монте-Карло для оценки нескольких опций осуществления, Математической Науки, 14:557-583, 2004.
[8] Шварц, Эдуардо С, стохастическое поведение товарных цен: последствия для оценки и хеджирования, журнала финансов, 52 (3):923-973, 1997.
function displaySummary(SwingPriceSpline, lowerBound, upperBound) fprintf('Comparison to lower and upper bounds:\n'); fprintf('\n') fprintf('Lower bound (European) : %.2f\n', lowerBound); fprintf('Swing Option Price : %.2f\n', SwingPriceSpline); fprintf('Upper bound (American) : %.2f\n\n', upperBound); end function displayRunningTimes(lsPolyTime, lsSplineTime) fprintf('Comparison of running times:\n'); fprintf('\n') fprintf('3rd order polynomial: %.2f sec\n', lsPolyTime); fprintf('Spline : %.2f sec\n\n', lsSplineTime); end
asianbykv
| asianbylevy
| asianbyls
| asiansensbykv
| asiansensbylevy
| asiansensbyls
| lookbackbycvgsg
| lookbackbyls
| lookbacksensbycvgsg
| lookbacksensbyls
| optpricebysim
| optstockbyblk
| optstockbyls
| optstocksensbyblk
| optstocksensbyls
| spreadbybjs
| spreadbyfd
| spreadbykirk
| spreadbyls
| spreadsensbybjs
| spreadsensbyfd
| spreadsensbykirk
| spreadsensbyls