Определение цен барьерных опционов с помощью сеток. Часть первая – постоянные барьеры - Использование кода
ОГЛАВЛЕНИЕ
Использование кода
Код для случая постоянного барьера содержится в классе по имени AdjustedBarrier. Он реализован в файле AdjustedBarrier.h и основан на оптимизированном алгоритме триномиального дерева. Корректировка вероятности применяется по мере перемещения по сетке. Главный цикл для колл-опциона с нижней границей следующий:
// Двигаться обратно по дереву
// с помощью "ползучего триномиального" алгоритма
for (int i = (nlevels-1); i >= 0; i--)
{
index = outerindex;
for (int j = 0; j <= (2*i); j++)
{
_tree[j].option = (dUp * _tree[j+2].option +
dMid * _tree[j+1].option +
dDown * _tree[j].option) * discount;
// корректировка вероятности перехода
if (_tree[index].spot > dbarrier)
{
pUpAdj = ProbAdjust(_tree[index].spot, _tree[index+1].spot, dvol, dt, dbarrier);
pMidAdj = ProbAdjust(_tree[index].spot, _tree[index].spot, dvol, dt, dbarrier);
pDownAdj = ProbAdjust(_tree[index].spot, _tree[index-1].spot, dvol, dt, dbarrier);
_tree[j].option = (dUp * (1.0 - pUpAdj) * _tree[j+2].option +
dMid * (1.0 - pMidAdj) * _tree[j+1].option +
dDown * (1.0 - pDownAdj) * _tree[j].option) * discount;
}
else
_tree[j].option = 0.0;
index++;
}
outerindex++;
}
Использовать класс очень просто. Передаются требуемые параметры опциона, как в следующем примере:
// тестовые значения
int levels = 800;
double spot = 100;
double strike = 100;
double volatility = 25;
double rate = 10;
double maturity = 1;
double barrier = 95;
// Определить цену колл-опциона с нижней границей
double DownOutOption = AdjustedBarrier::PriceBarrierOption(levels, spot, strike,
volatility, rate, maturity, barrier);
Вывод отправляется на консоль и содержит цену вместе со временем расчета, требуемым для базового дерева и дерева опциона:
Final option price from ADJUSTED PROBABILITY method is: 7.087516
(requiring 0.000000 microseconds or 0.000000 seconds for the underlying tree
and 1071541.000000 microseconds or 1.071541 seconds for the option tree)
Total calculation time: 1071541.000000 microseconds (1.071541 seconds)
Option price from HAUG FORMULA is: 7.049658
Press any key to continue . . .
Скорость и сходимость
Для тестирования кода сравнивается сходимость данного метода со сходимостью триномиальной модели Кокса-Росса-Рубинштейна (CRR). Результаты для сходимости двух методов показаны на рисунке 2, вместе с "истинным" (или аналитическим) значением опциона:
Рисунок 2: Сравнение и анализ сходимости
Рисунок 2 показывает быструю сходимость модели корректировки вероятности по сравнению со стандартной триномиальной сеткой без коррекции. Увеличение точности налицо, и сходимость к расчетному значению (отмечено красным) весьма быстрая по сравнению с моделью CRR. Однако некоторые колебания в приближении цены остаются после 500 делений сетки. Причина в том, что, хотя корректируются вероятности сетки, дискретизация сетки все же приводит к некоторой неточности. Ради крайне обобщенного алгоритма приходится мириться с некоторой неточностью. Для повышения точности можно выбрать большое число делений сетки, но из-за этого увеличится время выполнения.
Рисунок 3
Рисунок 3 показывает таблицу, представляющую результаты для поведения цены колл-опциона с нижней границей, когда биржевой курс близок к границе. Последний столбец содержит цену колл-опциона с нижней границей с использованием аналитического решения. Цены в квадратных скобках получены из стандартной модели. Цены, помеченные “-”, не удалось вычислить с помощью стандартного метода перемещения узла – то есть числа использованных делений не хватило для выработки приближения для расчетной цены.
Рисунок 3 показывает сравнение между моделью корректировки вероятности и стандартной моделью сетки. Записи, помеченные "-", показывают неудачу стандартной модели. То есть традиционная модель сетки не может выработать приближение цены. Однако представленная в статье модель всегда дает приближение цены опциона.
Рисунок 4
Рисунок 4 показывает выполнения для алгоритма для сеток базового актива и опциона (левая ось – в секундах, правая ось - в микросекундах). Левая ось обозначает дерево опциона (сплошная линия), тогда как правая ось означает базовое дерево (пунктирная линия). После 3.000 делений сетки время расчета быстро возрастает. При 10.000 делениях оно приближается к 1 минуте. Все вычисления выполнялись на процессоре 1.83 Ггц с 2 гб оперативной памяти. Типовой расчет для 1000 делений сетки и постоянного барьера требует примерно 3 секунд.
Заключение
Был описан простой метод выжимания большей пользы из существующих триномиальных и биномиальных деревьев. Корректировка вероятности позволила достичь значительного прироста точности и сходимости по сравнению с существующими методами на базе сетки для барьерных опционов. Однако некоторая неточность в приближении цены остается из-за ошибки дискретизации сетки и, скорее всего, не может быть устранена полностью. Тем не менее, этот метод позволяет определять цены опционов с параметрами, вызывающими крах других методов. Кроме того, этот метод требует лишь простого изменения существующих алгоритмов сетки, что делает реализацию быстрой и легкой.