Этот пример иллюстрирует, как 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
Используйте ранее вычисленные значения для 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: {[2] [2 3 4] [2 3 4 5 6] [2 3 3 4 5 5 6] [2 3 4 5 6 7 8] [2 2 ... ]}
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: {[2] [2 3 4] [2 3 4 5 6] [2 3 3 4 5 5 6] [2 3 4 5 6 7 8] [2 2 ... ]}
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
Вычислите цену каждого инструмента в портфеле.
[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] [2 2 3 ... ]}
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];
Каждая строка 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
Первый столбец выше является долларовой ценой за единицу товара каждого инструмента, второй столбец является количеством контрактов каждого инструмента, и третьи, четвертые, и пятые колонны являются долларовой дельтой, гаммой и vega чувствительностью.
Текущая чувствительность портфеля является взвешенным средним инструментов в портфеле.
TargetSens = Holdings' * Sensitivities
TargetSens = 1×3
-0.0725 3.1757 -0.0000
hedgeslf
Предположим, что вы хотите получить дельту, гамму и vega нейтральный портфель. Функциональный hedgeslf
находит перераспределение в портфеле финансовых инструментов самым близким к тому, чтобы быть самофинансирующимся (поддержание постоянной стоимости портфеля).
[Sens, Value1, Quantity]= hedgeslf(Sensitivities, Price,Holdings)
Sens = 3×1
-0.0023
-0.2910
-0.4055
Value1 = 4637.54
Quantity = 9×1
10.0000
5.2594
-5.1132
7.0586
-3.0470
12.4533
-7.3591
8.4721
10.3732
Функциональный 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);