Оценка и хеджирование портфеля Используя черную-Karasinski модель

Этот пример иллюстрирует, как MATLAB® может использоваться, чтобы создать портфель ценных бумаг производных процентной ставки и оценить его с помощью Черной-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 отображает структуру дерева уровня в левом окне. Древовидная визуализация в правильном окне является пробелом, но путем выбора Table/Diagram и нажатия на узлы можно исследовать уровни вдоль путей.

treeviewer(BKTreeR);

Создайте инструментальный портфель

Создайте портфель, состоящий из двух инструментов связей и опции на 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: {1x6 cell}
      Probs: {1x6 cell}

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

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

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

treeviewer(PTree,InstSet);

Добавьте больше инструментов в существующий портфель

Добавьте инструменты в существующий портфель: дно, пол, долговое обязательство с плавающей ставкой, подкачка ванили и и вызываемая связь с правом досрочного погашения.

% 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];

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

Отобразите информацию.

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

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

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

TargetSens  = Holdings' * Sensitivities
TargetSens = 1×3

      -7249.21     317573.92         -0.00

Получите нейтральный портфель чувствительности

Предположим, что вы хотите получить дельту, гамму и vega нейтральный портфель. Функциональный 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

В этом примере портфель полностью застрахован (одновременная дельта, гамма и vega нейтралитет) и самофинансирующийся (значения портфеля до и после балансировки (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);