exponenta event banner

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

Эти данные можно получить со страницы статистического выпуска Федеральной резервной системы с помощью Toolbox™ Datafeed. В этом случае Toolbox™ Datafeed подключится к 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}

Визуализация изменения процентной ставки вдоль дерева путем просмотра структуры вывода 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% Bond); второй элемент, 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.

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

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

% 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

Предположим, вы хотите получить дельта, гамма и 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

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

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

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

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

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

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

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

Примечание

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

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

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

свернуть все

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

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

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

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