hedgeslf

Хеджирование с самофинансированием

Описание

пример

[PortSens,PortValue,PortHolds] = hedgeslf(Sensitivities,Price,CurrentHolds) выделяет хеджирование с самофинансированием из набора инструментов. hedgeslf находит перераспределение в портфеле финансовых инструментов, который хеджирует портфель против рыночных движений и который наиболее близок к тому, чтобы быть самофинансированным (поддержание постоянного значения портфеля). По умолчанию первый введенный инструмент хеджируется вместе с другими инструментами.

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

пример

[PortSens,PortValue,PortHolds] = hedgeslf(___,FixedInd,ConSet) добавляет дополнительные необязательные аргументы.

Примеры

свернуть все

Этот пример иллюстрирует, как 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);

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

свернуть все

Чувствительность каждого инструмента, заданная как ряд инструментов (NINST) по количеству чувствительности (NSENS) матрица чувствительности к доллару. Каждая строка представляет другой инструмент. Каждый столбец представляет разную чувствительность.

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

Цены на приборы, указанные как NINST-by- 1 вектор.

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

Контракты, присвоенные каждому инструменту, указываются как NINST-by- 1 вектор.

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

(Необязательно) Количество фиксированных инструментов, заданное как NFIXED-by- 1 вектор индексов приборов для фиксации. Для примера, чтобы сохранить первый и третий инструменты портфеля 10 инструментов без изменений, установите FixedInd = [1 3]. Значение по умолчанию является FixedInd = 1; владения в первом инструменте фиксируются. Если никакие инструменты не должны фиксироваться, введите FixedInd = [ ].

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

(Необязательно) Дополнительные условия перераспределения портфеля, заданные как ряд ограничений (NCONS) по количеству приборов (NINST) матрица дополнительных условий по перераспределениям портфеля. Подходящее NINST-by- 1 вектор контрактных владений, PortWts, удовлетворяет всем неравенствам A*PortWts <= b, где A = ConSet(:,1:end-1) и b = ConSet(:,end).

Примечание

Ограничения PortHolds(FixedInd) = CurrentHolds(FixedInd) добавляются к любым переданным ограничениям ConSet. Передайте FixedInd = [ ] чтобы задать все ограничения через ConSet. Ограничения по умолчанию, сгенерированные portcons неуместны, поскольку требуют, чтобы сумма всех холдингов была положительной и равной 1.

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

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

свернуть все

Чувствительность портфеля к доллару, возвращаемая как число точек NSENS-by- 1 вектор. Когда существует совершенное хеджирование, PortSens - нули. В противном случае выбирается лучшее хеджирование.

Общая стоимость портфеля, возвращенная в виде скалярного значения. Когда существует совершенно самофинансируемое хеджирование, PortValue равно значению dot(Price,CurrentHolds) первоначального портфеля.

Контракты, выделенные каждому инструменту, возвращенные в качестве NINST-by- 1 вектор. Это перераспределенный портфель.

Представлено до R2006a