exponenta event banner

hwcalbyfloor

Калибровка белого дерева корпуса с использованием полов

Описание

пример

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

Функции калибровки корпуса и белого (hwcalbyfloor и hwcalbycap) поддерживают три модели: Black (по умолчанию), Bachelier или Normal и Shaded Black. Дополнительные сведения см. в дополнительных аргументах для Shift и Model.

пример

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

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

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

пример

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

Примеры

свернуть все

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

Данные о минимальной волатильности рынка, охватывающие два удара за 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] = hwcalbyfloor(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 hwcalbyfloor at 81 

Alpha =

    0.0835


Sigma =

    0.0145

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

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

         0
    0.2659
    0.0010
    0.5426
    0.0021
    0.6841
    0.0042
    0.7947
    0.0081
    0.8970
    0.0128
    0.9947
    0.0217
    1.1145
    0.0340
    1.2448
    0.0402
    1.3415
    0.0610
    1.4947
    0.0827
    1.6458
    0.1071
    1.7951

Настройка дерева 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 = floorbyhw(HWTree, AllStrikes(:), Settle, AllMaturities(:), Reset, Basis) 
HWPrices =

         0
    0.2644
    0.0067
    0.5404
    0.0101
    0.6924
    0.0169
    0.7974
    0.0236
    0.8919
    0.0320
    0.9919
    0.0460
    1.1074
    0.0649
    1.2340
    0.0829
    1.3558
    0.1096
    1.4957
    0.1406
    1.6418
    0.1724
    1.7877

Постройте график черных цен по отношению к калиброванным ценам Халл-Белое дерево.

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

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

Рассмотрим пол со следующими параметрами:

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

Полеты и рыночные данные для этого примера определяются следующим образом:

floorletDates = cfdates(Settle, Maturity, Reset, Basis);
datestr(floorletDates')
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.00595; 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.003210;-0.003020;-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);

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

format short
o=optimoptions('lsqnonlin','TolFun',100*eps);
warning ('off','fininst:hwcalbycapfloor:NoConverge')
[Alpha, Sigma, OptimOut] = hwcalbyfloor(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.3410
OptimOut = struct with fields:
     resnorm: 1.9233e-04
    residual: [5x1 double]
    exitflag: 2
      output: [1x1 struct]
      lambda: [1x1 struct]
    jacobian: [5x2 double]

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

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

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

[FloorPrice, Floorlets] = floorbynormal(RateSpec, Strike, Settle, Maturity, FlatVol,...
'Reset', Reset, 'Basis', Basis, 'Principal', Principal); 
Floorlets = Floorlets(2:end)'
Floorlets = 5×1

    4.7637
    6.7180
    8.1833
    9.5825
   10.6090

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

OptimFloorlets = Floorlets+OptimOut.residual;

disp('   ');
   
disp(' Bachelier   Calibrated Floorlets');
 Bachelier   Calibrated Floorlets
disp([Floorlets        OptimFloorlets])
    4.7637    4.7685
    6.7180    6.7263
    8.1833    8.1878
    9.5825    9.5795
   10.6090   10.6007
plot(MarketMatNum(2:end), Floorlets, 'or', MarketMatNum(2:end), OptimFloorlets, '*b');
datetick('x', 2)
xlabel('Floorlet Maturity');
ylabel('Floorlet Price');
ylim ([0 16]);
title('Bachelier and Calibrated Floorlets');
h = legend('Bachelier Floorlets', 'Calibrated Floorlets');
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 Floorlets contains 2 objects of type line. These objects represent Bachelier Floorlets, Calibrated Floorlets.

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

свернуть все

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

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

Забастовка на рынке, указанная как NINSTоколо-1 вектор.

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

Даты погашения минимального рыночного уровня, указанные как NINSTоколо-1 вектор.

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

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

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

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

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

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

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

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

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

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

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

Пример: [Alpha,Sigma,OptimOut] = hwcalbyfloor(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' и 2около-1 вектор нижних границ, определяемый как [LBSigma; LBAlpha], используется в функции алгоритма поиска. Дополнительные сведения см. в разделе lsqnonlin.

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

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

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

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

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

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

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

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

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

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

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

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

свернуть все

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

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

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

Представлен в R2009a