hwcalbycap

Калибровка дерева Hull-White с помощью прописных букв

Описание

пример

[Alpha,Sigma,OptimOut] = hwcalbycap(RateSpec,MarketStrikeMarketMaturity,MarketVolatility) калибрует Alpha (средняя реверсия) и Sigma (волатильность) с использованием данных рынка прописной буквы и модели Халла-Уайта с использованием всей поверхности прописной буквы.

Калибровочные функции Халла-Уайта (hwcalbycap и hwcalbyfloor) поддерживают три модели: Black (по умолчанию), Bachelier или Normal и Shitted Black. Для получения дополнительной информации см. дополнительные аргументы для Shift и Model.

пример

[Alpha,Sigma,OptimOut = hwcalbycap(RateSpec,MarketStrikeMarketMaturity,MarketVolatility,Strike,Settle,Maturity) оценивает Alpha (средняя реверсия) и Sigma (волатильность) использование рыночных данных прописной буквы и модели Халла-Уайта для оценки прописной буквы с определенной зрелостью/волатильностью с помощью дополнительных необязательных входных параметров для Strike, Settle, и Maturity.

Strike, Settle, и Maturity аргументы заданы для калибровки к определенной точке на поверхности волатильности рынка. Если калибровка опущена, она выполняется по всем рыночным инструментам

Для примера калибровки с использованием модели Халла-Уайта с Strike, Settle, и Maturity входные параметры, см. Калибровка модели корпуса-белого с использованием рыночных данных.

пример

[Alpha,Sigma,OptimOut] = hwcalbycap(___,Name,Value) добавляет необязательные аргументы пары "имя-значение".

Примеры

свернуть все

В этом примере показано, как использовать hwcalbycap входные параметры для MarketStrike, MarketMaturity, и MarketVolatility калибровка модели HW с использованием всей поверхности летучести прописной буквы.

Прописные буквы волатильности, охватывающие две забастовки в течение 12 дат погашения.

Reset = 4;
MarketStrike = [0.0590; 0.0790];

MarketMaturity = {'21-Mar-2008'; '21-Jun-2008'; '21-Sep-2008'; '21-Dec-2008';
    '21-Mar-2009'; '21-Jun-2009'; '21-Sep-2009'; '21-Dec-2009';
    '21-Mar-2010'; '21-Jun-2010'; '21-Sep-2010'; '21-Dec-2010'};
MarketMaturity = datenum(MarketMaturity);

MarketVolaltility = [0.1533 0.1731 0.1727 0.1752 0.1809 0.1800 0.1805 0.1802...
    0.1735 0.1757 0.1755 0.1755;
    0.1526 0.1730 0.1726 0.1747 0.1808 0.1792 0.1797 0.1794...
    0.1733 0.1751 0.1750 0.1745];

Постройте поверхность волатильности рынка.

[AllMaturities,AllStrikes] = meshgrid(MarketMaturity,MarketStrike);
figure;
surf(AllMaturities,AllStrikes,MarketVolaltility)
datetick
xlabel('Maturity')
ylabel('Strike')
zlabel('Volatility')
title('Market Volatility Data')

Установите структуру терминов процентной ставки и создайте RateSpec.

Settle = '21-Jan-2008';
Compounding = 4;
Basis = 0;
Rates= [0.0627; 0.0657; 0.0691; 0.0717; 0.0739; 0.0755; 0.0765; 0.0772;
    0.0779; 0.0783; 0.0786; 0.0789];
EndDates = {'21-Mar-2008';'21-Jun-2008';'21-Sep-2008';'21-Dec-2008';...
    '21-Mar-2009';'21-Jun-2009';'21-Sep-2009';'21-Dec-2009';....
    '21-Mar-2010';'21-Jun-2010';'21-Sep-2010';'21-Dec-2010'};
RateSpec = intenvset('ValuationDate', Settle, 'StartDates', Settle,...
    'EndDates', EndDates,'Rates', Rates, 'Compounding', Compounding,...
    'Basis',Basis)
RateSpec = 

           FinObj: 'RateSpec'
      Compounding: 4
             Disc: [12x1 double]
            Rates: [12x1 double]
         EndTimes: [12x1 double]
       StartTimes: [12x1 double]
         EndDates: [12x1 double]
       StartDates: 733428
    ValuationDate: 733428
            Basis: 0
     EndMonthRule: 1

Калибровка модели Халла-Уайта по рыночным данным.

o = optimoptions('lsqnonlin','TolFun',1e-5,'Display','off');

[Alpha, Sigma] = hwcalbycap(RateSpec, MarketStrike, MarketMaturity,...
    MarketVolaltility, 'Reset', Reset,'Basis', Basis, 'OptimOptions', o)
Warning: LSQNONLIN did not converge to an optimal solution. It exited with exitflag = 3.
 
> In hwcalbycapfloor>optimizeOverCapSurface at 232
  In hwcalbycapfloor at 79
  In hwcalbycap at 81 

Alpha =

    0.0943


Sigma =

    0.0146

Сравните с черными ценами.

BlkPrices = capbyblk(RateSpec,AllStrikes(:), Settle, AllMaturities(:),...
    MarketVolaltility(:),'Reset',Reset,'Basis',Basis);
BlkPrices =

    0.0604
         0
    0.2729
    0.0006
    0.6498
    0.0412
    1.1121
    0.1426
    1.6426
    0.3131
    2.1869
    0.4998
    2.7056
    0.6894
    3.2124
    0.8815
    3.7311
    1.0686
    4.2246
    1.2790
    4.7027
    1.4810
    5.1877
    1.6919

Setup дерева Hull-White с использованием калиброванных параметров, альфа и сигмы.

VolDates    = EndDates;
VolCurve    = Sigma*ones(numel(EndDates),1);
AlphaDates  = EndDates;
AlphaCurve  = Alpha*ones(numel(EndDates),1);
HWVolSpec   = hwvolspec(Settle, VolDates, VolCurve, AlphaDates, AlphaCurve);

HWTimeSpec  = hwtimespec(Settle, EndDates, Compounding);
HWTree = hwtree(HWVolSpec, RateSpec, HWTimeSpec, 'Method', 'HW2000')
HWTree = 

      FinObj: 'HWFwdTree'
     VolSpec: [1x1 struct]
    TimeSpec: [1x1 struct]
    RateSpec: [1x1 struct]
        tObs: [0 0.6593 1.6612 2.6593 3.6612 4.6593 5.6612 6.6593 7.6612 8.6593 9.6612 10.6593]
        dObs: [733428 733488 733580 733672 733763 733853 733945 734037 734128 734218 734310 734402]
      CFlowT: {1x12 cell}
       Probs: {1x11 cell}
     Connect: {1x11 cell}
     FwdTree: {1x12 cell}

Вычислите цены Hull-White на основе калиброванного дерева.

HWPrices = capbyhw(HWTree, AllStrikes(:), Settle, AllMaturities(:), Reset, Basis)
HWPrices =

    0.0601
         0
    0.2788
         0
    0.6580
    0.0518
    1.1254
    0.1485
    1.6591
    0.3123
    2.2076
    0.5022
    2.7319
    0.6883
    3.2459
    0.8774
    3.7771
    1.0900
    4.2769
    1.2875
    4.7645
    1.4845
    5.2572
    1.6921

Граф Черные цены относительно калиброванных цен на дерево Халл-Уайт.

figure;
plot(AllMaturities(:), BlkPrices, 'or', AllMaturities(:), HWPrices, '*b');
datetick('x', 2)
xlabel('Maturity');
ylabel('Price');
title('Black and Calibrated (HW) Prices');
legend('Black Price', 'Calibrated HW Tree Price','Location', 'NorthWest');
grid on

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

Рассмотрим прописную букву с этими параметрами:

Settle = 'Dec-30-2016';
Maturity = 'Dec-30-2019';
Strike = -0.001075;
Reset = 2;
Principal = 100;
Basis = 0;

Кэплеты и рыночные данные для этого примера определяются как:

capletDates = cfdates(Settle, Maturity, Reset, Basis);
datestr(capletDates')
ans = 6x11 char array
    '30-Jun-2017'
    '30-Dec-2017'
    '30-Jun-2018'
    '30-Dec-2018'
    '30-Jun-2019'
    '30-Dec-2019'

% Market data information
MarketStrike = [-0.0013; 0];
MarketMat =  {'30-Jun-2017';'30-Dec-2017';'30-Jun-2018'; '30-Dec-2018';'30-Jun-2019'; '30-Dec-2019'};
MarketVol = [0.184 0.2329 0.2398 0.2467 0.2906 0.3348;   % First row in table corresponding to Strike 1 
             0.217 0.2707 0.2760 0.2814 0.3160 0.3508];  % Second row in table corresponding to Strike 2

Определите RateSpec.

Rates= [-0.002210;-0.002020;-0.00182;-0.001343;-0.001075];
ValuationDate = 'Dec-30-2016';
EndDates = {'30-Jun-2017';'Dec-30-2017';'30-Jun-2018';'Dec-30-2018';'Dec-30-2019'};
Compounding = 2;
Basis = 0;

RateSpec = intenvset('ValuationDate', ValuationDate, ...
'StartDates', ValuationDate, 'EndDates', EndDates, ...
'Rates', Rates, 'Compounding', Compounding, 'Basis', Basis);

Использование hwcalbycap чтобы найти значения параметров волатильности Alpha и Sigma использование модели Normal (Bachelier).

format short
o=optimoptions('lsqnonlin','TolFun',100*eps);
warning ('off','fininst:hwcalbycapfloor:NoConverge')
[Alpha, Sigma, OptimOut] = hwcalbycap(RateSpec, MarketStrike, MarketMat,...
MarketVol, Strike, Settle, Maturity, 'Reset', Reset, 'Principal', Principal,...
'Basis', Basis, 'OptimOptions', o, 'model', 'normal')
Local minimum possible.
lsqnonlin stopped because the size of the current step is less than
the value of the step size tolerance.
Alpha = 1.0000e-06
Sigma = 0.3384
OptimOut = struct with fields:
     resnorm: 1.5181e-04
    residual: [5x1 double]
    exitflag: 2
      output: [1x1 struct]
      lambda: [1x1 struct]
    jacobian: [5x2 double]

The OptimOut.residual поле OptimOut структура является невязкой оптимизации. Это значение содержит различие между каплетами Normal (Bachelier) и caplets, рассчитанными во время оптимизации. Используйте OptimOut.residual значение, чтобы вычислить процентное различие (ошибку) по сравнению с ценами на каплеты Normal (Bachelier), а затем решить, является ли невязка приемлемым. Есть почти всегда какой-то остаточный, поэтому решите, приемлемо ли параметризовать рынок с одним значением Alpha и Sigma.

Оцените caplets с помощью рыночных данных и модели Normal (Bachelier), чтобы получить ссылочные значения caplet. Чтобы определить эффективность оптимизации, вычислите эталонные каплетные значения с помощью формулы Normal (Bachelier) и рыночных данных. Обратите внимание, что сначала необходимо интерполировать рыночные данные, чтобы получить каплеты для вычисления.

MarketMatNum = datenum(MarketMat);
[Mats, Strikes] = meshgrid(MarketMatNum, MarketStrike);
FlatVol = interp2(Mats, Strikes, MarketVol, datenum(Maturity), Strike, 'spline');

[CapPrice, Caplets] = capbynormal(RateSpec, Strike, Settle, Maturity, FlatVol,...
'Reset', Reset, 'Basis', Basis, 'Principal', Principal); 
Caplets = Caplets(2:end)'
Caplets = 5×1

    4.7392
    6.7799
    8.2609
    9.6136
   10.6455

Сравните оптимизированные значения и значения Normal (Bachelier) и отобразите результаты графически. После вычисления ссылочных значений для каплетов сравните значения аналитически и графически, чтобы определить, вычислены ли отдельные значения Alpha и Sigma обеспечивают адекватное приближение.

OptimCaplets = Caplets+OptimOut.residual;

disp('   ');
   
disp(' Bachelier   Calibrated Caplets');
 Bachelier   Calibrated Caplets
disp([Caplets        OptimCaplets])
    4.7392    4.7453
    6.7799    6.7851
    8.2609    8.2657
    9.6136    9.6112
   10.6455   10.6379
plot(MarketMatNum(2:end), Caplets, 'or', MarketMatNum(2:end), OptimCaplets, '*b');
datetick('x', 2)
xlabel('Caplet Maturity');
ylabel('Caplet Price');
ylim ([0 16]);
title('Bachelier and Calibrated Caplets');
h = legend('Bachelier Caplets', 'Calibrated Caplets');
set(h, 'color', [0.9 0.9 0.9]);
set(h, 'Location', 'SouthEast');
set(gcf, 'NumberTitle', 'off')
grid on

Figure contains an axes. The axes with title Bachelier and Calibrated Caplets contains 2 objects of type line. These objects represent Bachelier Caplets, Calibrated Caplets.

Входные параметры

свернуть все

Спецификация процентной ставки для кривой начальной ставки, заданная RateSpec получен из intenvset. Для получения информации о спецификации процентной ставки смотрите intenvset.

Типы данных: struct

Забастовка прописной буквы, заданная как NINST-by- 1 вектор.

Типы данных: double

Даты погашения прописной буквы, заданные как NINST-by- 1 вектор.

Типы данных: double

Рыночная плоская волатильность, заданная как NSTRIKES-by- NMATS матрица рыночных плоских волатильностей, где NSTRIKES количество ударов caplet из MarketStrike и NMATS дата зрелости caplet от MarketMaturity.

Типы данных: double

(Необязательно) Скорость, с которой выполняется прописная буква, заданная как десятичное скалярное значение.

Типы данных: single

(Необязательно) Дата расчета прописной буквы, заданная как скалярный серийный номер даты или символ даты.

Типы данных: single | char

(необязательно) Дата погашения прописной буквы, заданная как скалярный серийный номер даты или вектор символов даты.

Типы данных: single | char

Аргументы в виде пар имя-значение

Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

Пример: [Alpha,Sigma,OptimOut] = hwcalbycap(RateSpec,MarketStrike,MarketMaturity,MarketVolaltility,'Reset',2,'Principal',100000,'Basis',3,'OptimOptions',o)

Частота платежей в год, заданная как разделенная разделенными запятой парами, состоящая из 'Reset' и скалярное числовое значение.

Типы данных: double

Условная основная сумма, заданная как разделенная разделенными запятой парами, состоящая из 'Principal' и скаляр неотрицательное целое число.

Типы данных: single

Базис отсчета дней, используемый при аннуализации входной скорости передачи, заданный как разделенная разделенными запятой парами, состоящая из 'Basis' и скалярное значение. Значения:

  • 0 = факт/факт

  • 1 = 30/360 (SIA)

  • 2 = факт/360

  • 3 = факт/365

  • 4 = 30/360 (PSA)

  • 5 = 30/360 (ISDA)

  • 6 = 30/360 (европейский)

  • 7 = факт/365 (японский)

  • 8 = факт/факт (ICMA)

  • 9 = факт/360 (ICMA)

  • 10 = факт/365 (ICMA)

  • 11 = 30/360E (ICMA)

  • 12 = факт/365 (ISDA)

  • 13 = BUS/252

Для получения дополнительной информации см. раздел Базиса.

Типы данных: single

Нижние границы, заданные как разделенная разделенными запятой парами, состоящая из 'LB' и a 2-by- 1 вектор нижних границ, заданный как [LBSigma; LBAlpha], используемый в функции алгоритма поиска. Для получения дополнительной информации см. lsqnonlin.

Типы данных: double

Верхние границы, заданные как разделенная разделенными запятой парами, состоящая из 'UB' и a 2-by- 1 вектор верхних границ, заданный как [UBSigma; LBAlpha], используемый в функции алгоритма поиска. Для получения дополнительной информации см. lsqnonlin.

Типы данных: double

Начальные значения, заданные как разделенная разделенными запятой парами, состоящая из 'XO' и a 2-by- 1 вектор начальных значений, заданный как [Sigma0; Alpha0], используемый в функции алгоритма поиска. Для получения дополнительной информации см. lsqnonlin.

Типы данных: double

Параметры оптимизации, заданные как разделенная разделенными запятой парами, состоящая из 'OptimOptions' и структуру, заданную при помощи optimoptions.

Типы данных: struct

Сдвиг десятичных чисел для сдвинутой модели Black, заданный как разделенная разделенными запятой парами, состоящая из 'Shift' и скаляр положительное десятичное значение. Установите этот параметр положительный сдвиг десятичных чисел, чтобы добавить положительный сдвиг к прямой скорости и Strike, который эффективно устанавливает отрицательную нижнюю границу для прямой скорости и Strike. Для примера, a Shift значение 0.01 равен 1% сдвигу.

Типы данных: single

Индикатор для модели, используемой для стандартной программы калибровки, задается как разделенная разделенными запятой парами, состоящая из 'Model' и скалярный вектор символов со значением normal или lognormal.

Типы данных: char

Выходные аргументы

свернуть все

Среднее значение реверсии, полученное при калибровке прописной буквы с использованием рыночной информации, возвращенной в виде скалярного значения.

Значение волатильности, полученное при калибровке прописной буквы с использованием рыночной информации, возвращенной в виде скаляра.

Результаты оптимизации, возвращенные как структура.

Введенный в R2009a