Ценообразование и хеджирование портфеля с использованием модели Черного-Карасинского

Этот пример иллюстрирует, как MATLAB ® может использоваться, чтобы создать портфель производных по процентным ставкам ценных бумаг и оценить его с помощью модели процентной ставки Black-Karasinski. В примере также показаны некоторые стратегии хеджирования для минимизации подверженности рыночным движениям.

Создайте структуру терминов процентной ставки на основе отчетных данных

Структура RateSpec является структурой терминов процентной ставки, которая определяет начальную спецификацию ставок, из которой получают древовидные ставки. Используйте информацию о годовых нулевых ставках купонов в таблице ниже, чтобы заполнить RateSpec структура.

  From             To           Rate
27 Feb 2007    27 Feb 2008      0.0493
27 Feb 2007    27 Feb 2009      0.0459
27 Feb 2007    27 Feb 2010      0.0450
27 Feb 2007    27 Feb 2012      0.0446
27 Feb 2007    27 Feb 2014      0.0445
27 Feb 2007    27 Feb 2017      0.0450
27 Feb 2007    27 Feb 2027      0.0473

Эти данные могут быть извлечены со страницы Federal Reserve Statistical Release с помощью Datafeed Toolbox™. В этом случае Datafeed Toolbox™ подключается к FRED ® и возвращает ставки следующих казначейских нот.

  Terms    Symbol
 =======   ======
    1   =  DGS1
    2   =  DGS2
    3   =  DGS3
    5   =  DGS5
    7   =  DGS7
    10  =  DGS10
    20  =  DGS20

Создайте объект подключения:

  c = fred;

Создайте список выборки символов:

FredNames   = { ...    
  'DGS1'; ...      % 1  Year
  'DGS2'; ...      % 2  Year
  'DGS3'; ...      % 3  Year
  'DGS5'; ...      % 5  Year
  'DGS7'; ...      % 7  Year
  'DGS10'; ...     % 10 Year
  'DGS20'};        % 20 Year

Определите Условия:

Terms = [ 1; ...      % 1  Year
          2; ...      % 2  Year
          3; ...      % 3  Year
          5; ...      % 5  Year
          7; ...      % 7  Year
         10; ...      % 10 Year
         20];         % 20 Year

Установите StartDate по 27 февраля 2007 года:

  StartDate = datenum('Feb-27-2007');
  FredRet = fetch(c,FredNames,StartDate); 

Установите ValuationDate на основе StartDate:

  ValuationDate = StartDate;
  EndDates = [];
  Rates =[];

Создайте EndDates:

  for idx = 1:length(FredRet)    
   %Pull the rates associated with Feb 27, 2007. All the Fred Rates come
   %back as percents
   Rates = [Rates; ...
       FredRet(idx).Data(1,2) / 100];
    %Determine the EndDates by adding the Term to the year of the
    %StartDate      
    EndDates = [EndDates; ...
       round(datenum(...
           year(StartDate)+ Terms(idx,1), ...
           month(StartDate),...
           day(StartDate)))];
  end

Используйте функцию intenvset чтобы создать RateSpec со следующими данными:

Compounding = 1;
StartDate = '27-Feb-2007';
Rates = [0.0493; 0.0459; 0.0450; 0.0446; 0.0446; 0.0450; 0.0473];
EndDates = {'27-Feb-2008'; '27-Feb-2009';'27-Feb-2010'; '27-Feb-2012';...   
            '27-Feb-2014' ; '27-Feb-2017'; '27-Feb-2027'};  
ValuationDate = StartDate;

RateSpec = intenvset('Compounding',Compounding,'StartDates', StartDate,...
                     'EndDates', EndDates, 'Rates', Rates,'ValuationDate', ValuationDate)
RateSpec = struct with fields:
           FinObj: 'RateSpec'
      Compounding: 1
             Disc: [7x1 double]
            Rates: [7x1 double]
         EndTimes: [7x1 double]
       StartTimes: [7x1 double]
         EndDates: [7x1 double]
       StartDates: 733100
    ValuationDate: 733100
            Basis: 0
     EndMonthRule: 1

Задайте модель волатильности

Создайте структуру VolSpec который задает процесс волатильности со следующими данными.

Volatility = [0.011892; 0.01563; 0.02021; 0.02125; 0.02165; 0.02065; 0.01803];
Alpha = [0.0001];
VolSpec = bkvolspec(ValuationDate, EndDates, Volatility, EndDates(end), Alpha)
VolSpec = struct with fields:
             FinObj: 'BKVolSpec'
      ValuationDate: 733100
           VolDates: [7x1 double]
           VolCurve: [7x1 double]
         AlphaCurve: 1.0000e-04
         AlphaDates: 740405
    VolInterpMethod: 'linear'

Задайте временную структуру дерева

Структура TimeSpec определяет структуру времени для дерева процентных ставок. Эта структура определяет отображение между временем наблюдения на каждом уровне дерева и соответствующими датами.

TimeSpec = bktimespec(ValuationDate, EndDates)
TimeSpec = struct with fields:
           FinObj: 'BKTimeSpec'
    ValuationDate: 733100
         Maturity: [7x1 double]
      Compounding: -1
            Basis: 0
     EndMonthRule: 1

Создайте дерево BK

Используйте ранее вычисленные значения для RateSpec, VolSpec, и TimeSpec для создания дерева BK.

BKTree = bktree(VolSpec, RateSpec, TimeSpec)
BKTree = struct with fields:
      FinObj: 'BKFwdTree'
     VolSpec: [1x1 struct]
    TimeSpec: [1x1 struct]
    RateSpec: [1x1 struct]
        tObs: [0 1 2 3 5 7 10]
        dObs: [733100 733465 733831 734196 734926 735657 736753]
      CFlowT: {1x7 cell}
       Probs: {1x6 cell}
     Connect: {1x6 cell}
     FwdTree: {1x7 cell}

Визуализируйте эволюцию процентной ставки вдоль дерева, посмотрев на структуру output BKTree. Функция bktree возвращает дерево обратной скидки, которое можно преобразовать в дерево процентных ставок с помощью cvtree функция.

BKTreeR = cvtree(BKTree)
BKTreeR = struct with fields:
      FinObj: 'BKRateTree'
     VolSpec: [1x1 struct]
    TimeSpec: [1x1 struct]
    RateSpec: [1x1 struct]
        tObs: [0 1 2 3 5 7 10]
        dObs: [733100 733465 733831 734196 734926 735657 736753]
      CFlowT: {1x7 cell}
       Probs: {1x6 cell}
     Connect: {1x6 cell}
    RateTree: {1x7 cell}

Посмотрите на верхний, средний и нижний пути ветви дерева.

OldFormat = get(0, 'format');  
format short

%Rate at root node:
RateRoot      = trintreepath(BKTreeR, 0) 
RateRoot = 0.0481
%Rates along upper branch:
RatePathUp    = trintreepath(BKTreeR, [1 1 1 1 1 1]) 
RatePathUp = 7×1

    0.0481
    0.0425
    0.0446
    0.0478
    0.0510
    0.0555
    0.0620

%Rates along middle branch:
RatePathMiddle = trintreepath(BKTreeR, [2 2 2 2 2 2]) 
RatePathMiddle = 7×1

    0.0481
    0.0416
    0.0423
    0.0430
    0.0436
    0.0449
    0.0484

%Rates along lower branch:
RatePathDown = trintreepath(BKTreeR, [3 3 3 3 3 3])
RatePathDown = 7×1

    0.0481
    0.0408
    0.0401
    0.0388
    0.0373
    0.0363
    0.0378

Можно также отобразить графическое представление дерева, чтобы в интерактивном режиме изучить скорости в узлах дерева до зрелости. Функция treeviewer отображает структуру дерева скоростей в левом окне. Древовидная визуализация в правом окне пуста, но, выбрав Таблица/Схема и щелкнув по узлам, можно изучить скорости вдоль путей.

treeviewer(BKTreeR);

Figure Tree Viewer contains 2 axes and other objects of type uicontrol. Axes 1 contains 137 objects of type line. Axes 2 is empty.

Создайте портфолио приборов

Создайте портфель, состоящий из двух инструментов облигаций и опции на 5% облигацию.

% Two Bonds
CouponRate = [0.04;0.05]; 
Settle = '27 Feb 2007'; 
Maturity = {'27 Feb 2009';'27 Feb 2010'};
Period = 1;

% American Option on the 5% Bond
OptSpec = {'call'};
Strike = 98;
ExerciseDates = '27 Feb 2010';
AmericanOpt = 1;

InstSet = instadd('Bond', CouponRate, Settle,  Maturity, Period);
InstSet = instadd(InstSet,'OptBond', 2, OptSpec, Strike, ExerciseDates, AmericanOpt);

% Assign Names and Holdings
Holdings = [10; 15;3];
Names = {'4% Bond'; '5% Bond'; 'Option 98'};

InstSet = instsetfield(InstSet, 'Index',1:3, 'FieldName', {'Quantity'}, 'Data', Holdings );
InstSet = instsetfield(InstSet, 'Index',1:3, 'FieldName', {'Name'}, 'Data', Names );

Исследуйте набор инструментов, содержащихся в переменной InstSet.

instdisp(InstSet)
Index Type CouponRate Settle         Maturity       Period Basis EndMonthRule IssueDate FirstCouponDate LastCouponDate StartDate Face Quantity Name     
1     Bond 0.04       27-Feb-2007    27-Feb-2009    1      0     1            NaN       NaN             NaN            NaN       100  10       4% Bond  
2     Bond 0.05       27-Feb-2007    27-Feb-2010    1      0     1            NaN       NaN             NaN            NaN       100  15       5% Bond  
 
Index Type    UnderInd OptSpec Strike ExerciseDates  AmericanOpt Quantity Name     
3     OptBond 2        call    98     27-Feb-2010    1           3        Option 98
 

Оцените портфолио с помощью модели BK

Вычислим цену каждого инструмента в портфолио.

[Price, PTree] = bkprice(BKTree, InstSet)
Price = 3×1

   98.8841
  101.3470
    3.3470

PTree = struct with fields:
     FinObj: 'BKPriceTree'
      PTree: {1x8 cell}
     AITree: {1x8 cell}
     ExTree: {1x8 cell}
       tObs: [0 1 2 3 5 7 10 20]
    Connect: {[2]  [2 3 4]  [2 3 4 5 6]  [2 3 3 4 5 5 6]  [2 3 4 5 6 7 8]  [1x9 double]}
      Probs: {1x6 cell}

Цены в векторе выхода Price соответствуют ценам при наблюдении начального момента времени (tObs = 0), которая определяется как дата оценки дерева процентных ставок.

В Price вектор, первый элемент, 98,884, представляет цену первого инструмента (4% облигации); второй элемент, 101.347, представляет цену второго инструмента (5% Bond), а 3.347 представляет цену американского вызова опции.

Вы также можете просмотреть графическое представление дерева цен, чтобы изучить цены в узлах дерева до зрелости.

treeviewer(PTree,InstSet);

Figure Tree Viewer contains 2 axes and other objects of type uicontrol. Axes 1 contains 155 objects of type line. Axes 2 is empty.

Добавление дополнительных инструментов в существующее портфолио

Добавьте инструменты к существующему портфелю: прописная буква, floor, floating rate note, vanilla swap и puttable и callable bond.

% Cap
StrikeC =0.035;
InstSet = instadd(InstSet,'Cap', StrikeC, Settle, '27 Feb 2010');

% Floor
StrikeF =0.05;
InstSet = instadd(InstSet,'Floor', StrikeF, Settle, '27 Feb 2009');

% Floating Rate Note
InstSet = instadd(InstSet,'Float', 30, Settle, '27 Feb 2009');

% Vanilla Swap
 LegRate =[0.04 5];
 InstSet = instadd(InstSet,'Swap', LegRate, Settle, '27 Feb 2010');

% Puttable and Callable Bonds
InstSet = instadd(InstSet,'OptEmBond', CouponRate, Settle, '27 Feb 2010', {'put';'call'},...
                  Strike, '27 Feb 2010','AmericanOpt', 1, 'Period', 1);

% Process Names and Holdings
Holdings = [15 ;5 ;8; 7; 9; 4];
Names = {'3.5% Cap';'5% Floor';'30BP Float';'4%/5BP Swap'; 'PuttBond'; 'CallBond' };

InstSet = instsetfield(InstSet, 'Index',4:9, 'FieldName', {'Quantity'}, 'Data', Holdings );
InstSet = instsetfield(InstSet, 'Index',4:9, 'FieldName', {'Name'}, 'Data', Names );

Исследуйте набор инструментов, содержащихся в переменной InstSet.

instdisp(InstSet)
Index Type CouponRate Settle         Maturity       Period Basis EndMonthRule IssueDate FirstCouponDate LastCouponDate StartDate Face Quantity Name     
1     Bond 0.04       27-Feb-2007    27-Feb-2009    1      0     1            NaN       NaN             NaN            NaN       100  10       4% Bond  
2     Bond 0.05       27-Feb-2007    27-Feb-2010    1      0     1            NaN       NaN             NaN            NaN       100  15       5% Bond  
 
Index Type    UnderInd OptSpec Strike ExerciseDates  AmericanOpt Quantity Name     
3     OptBond 2        call    98     27-Feb-2010    1           3        Option 98
 
Index Type Strike Settle         Maturity       CapReset Basis Principal Quantity Name       
4     Cap  0.035  27-Feb-2007    27-Feb-2010    1        0     100       15       3.5% Cap   
 
Index Type  Strike Settle         Maturity       FloorReset Basis Principal Quantity Name       
5     Floor 0.05   27-Feb-2007    27-Feb-2009    1          0     100       5        5% Floor   
 
Index Type  Spread Settle         Maturity       FloatReset Basis Principal EndMonthRule CapRate FloorRate Quantity Name       
6     Float 30     27-Feb-2007    27-Feb-2009    1          0     100       1            Inf     -Inf      8        30BP Float 
 
Index Type LegRate   Settle         Maturity       LegReset Basis Principal LegType EndMonthRule StartDate Quantity Name       
7     Swap [0.04  5] 27-Feb-2007    27-Feb-2010    [NaN]    0     100       [NaN]   1            NaN       7        4%/5BP Swap
 
Index Type      CouponRate Settle         Maturity       OptSpec Strike ExerciseDates                Period Basis EndMonthRule IssueDate FirstCouponDate LastCouponDate StartDate Face AmericanOpt Quantity Name       
8     OptEmBond 0.04       27-Feb-2007    27-Feb-2010    put     98     27-Feb-2007   27-Feb-2010    1      0     1            NaN       NaN             NaN            NaN       100  1           9        PuttBond   
9     OptEmBond 0.05       27-Feb-2007    27-Feb-2010    call    98     27-Feb-2007   27-Feb-2010    1      0     1            NaN       NaN             NaN            NaN       100  1           4        CallBond   
 

Хеджирование

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

Вычислите чувствительности с помощью модели BK.

[Delta, Gamma, Vega, Price] = bksens(BKTree, InstSet);

Получите текущие портфельные активы.

Holdings = instget(InstSet, 'FieldName', 'Quantity');

Создайте матрицу чувствительности.

Sensitivities = [Delta Gamma Vega];

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

format bank
disp([Price  Holdings  Sensitivities])
         98.88         10.00       -185.47        528.47             0
        101.35         15.00       -277.51       1045.05             0
          3.35          3.00       -223.52      11843.32             0
          2.77         15.00        250.04       2921.11         -0.00
          0.75          5.00       -132.97      11566.69             0
        100.56          8.00         -0.80          2.02             0
         -1.53          7.00       -272.08       1027.85          0.00
         98.60          9.00       -168.92      21712.82             0
         98.00          4.00        -53.99     -10798.27             0

Первый столбец выше - это долларовый модуль цена каждого инструмента, второй столбец - количество контрактов каждого инструмента, а третий, четвертый и пятый столбцы - это дельта доллара, гамма и чувствительность веги.

Текущие чувствительности портфеля являются взвешенным средним значением инструментов в портфеле.

TargetSens  = Holdings' * Sensitivities
TargetSens = 1×3

      -7249.21     317573.92         -0.00

Получите портфель нейтральной чувствительности с помощью hedgeslf

Предположим, вы хотите получить дельта, гамма и вега нейтральный портфель. Функция hedgeslf находит перераспределение в портфеле финансовых инструментов, ближайших к самофинансированию (поддержание постоянного значения портфеля).

[Sens, Value1, Quantity]= hedgeslf(Sensitivities, Price,Holdings)
Sens = 3×1

          0.00
         -0.00
         -0.00

Value1 = 
       4637.54

Quantity = 9×1

         10.00
          5.26
         -5.11
          7.06
         -3.05
         12.45
         -7.36
          8.47
         10.37

Функция hedgeslf возвращает чувствительность портфеля к доллару (Sens), значение восстановленного портфеля (Value1) и новое распределение для каждого инструмента (Quantity). Если Value0 и Value1 представление стоимости портфеля до и после ребалансировки можно проверить стоимость путем сравнения значений портфеля.

Value0 = Holdings' * Price
Value0 = 
       4637.54

В этом примере портфель полностью хеджируется (одновременно дельта, гамма и вега нейтралитет) и самофинансируется (значения портфеля до и после балансировки (Value0 и Value1) те же самые.

Добавление ограничений к хеджированию портфеля

Предположим, что вы хотите разместить верхнюю и нижнюю границы на отдельных инструментах в портфеле. Допустим, вы хотите связать позицию всех инструментов с контрактами +/-11.

Применение этих ограничений запрещает использование текущих позиций в пятом и восьмом инструментах. Все другие инструменты в настоящее время находятся в пределах верхней/нижней границы.

% Specify the lower and upper bounds
LowerBounds = [-11  -11  -11  -11  -11  -11  -11  -11  -11];
UpperBounds = [ 11   11   11   11   11   11   11   11   11];

% Use the function portcons to build the constraints
ConSet = portcons('AssetLims', LowerBounds, UpperBounds);

% Apply the constraints to the portfolio
[Sens, Value, Quantity1] = hedgeslf(Sensitivities, Price, Holdings, [], ConSet)
Sens = 3×1

             0
             0
             0

Value = 
             0

Quantity1 = 9×1

             0
             0
             0
             0
             0
             0
             0
             0
             0

Заметьте, что hedgeslf функция обеспечивает соблюдение ограничений по пятому и восьмому инструментам, и портфель по-прежнему полностью хеджируется и самофинансируется.

set(0, 'format', OldFormat);

См. также

|

Похожие примеры

Подробнее о