В этом примере показано, как 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
Использовать ранее вычисленные значения для 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);

Создайте портфель, состоящий из двух инструментов облигаций и опциона на 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
Рассчитайте цену каждого инструмента в портфеле.
[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);

Добавить инструменты к существующему портфелю: кэп, пол, нота с плавающей ставкой, ванильный своп и опечатываемая и вызываемая облигация.
% 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);