Самофинансирующаяся преграда
[
выделяет самофинансирующуюся преграду среди набора инструментов. PortSens
,PortValue
,PortHolds
] = hedgeslf(Sensitivities
,Price
,CurrentHolds
)hedgeslf
находит перераспределение в портфеле финансовых инструментов, который страхует портфель против перемещений рынка, и это является самым близким к тому, чтобы быть самофинансирующимся (поддержание постоянной стоимости портфеля). По умолчанию первый вводимый инструмент застрахован с другими инструментами.
hedgeslf
попытки найти выделения портфеля, который сделает его самым близким к тому, чтобы быть самофинансирующимся при сокращении чувствительности к нулю. Если никакое решение не найдено, hedgeslf
находит выделения, которые минимизируют чувствительность. Если получившийся портфель является самофинансирующимся, PortValue
равно значению исходного портфеля.
Этот пример иллюстрирует, как 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: {[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
Оцените портфель Используя модель 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] [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);
Sensitivities
— Чувствительность каждого инструментаЧувствительность каждого инструмента в виде многих инструментов (NINST
) количеством чувствительности (NSENS
) матрица долларовой чувствительности. Каждая строка представляет различный инструмент. Каждый столбец представляет различную чувствительность.
Типы данных: double
Price
— Цены на инструментыЦены на инструменты в виде NINST
- 1
вектор.
Типы данных: double
CurrentHolds
— Контракты выделяются каждому инструментуКонтракты, выделенные каждому инструменту в виде NINST
- 1
вектор.
Типы данных: double
FixedInd
— Количество фиксированных инструментов
(значение по умолчанию) | вектор(Необязательно) Количество фиксированных инструментов в виде NFIXED
- 1
вектор из индексов инструментов, чтобы содержать зафиксированный. Например, чтобы содержать первые и третьи инструменты 10 инструментальных неизменных портфелей, набор FixedInd = [1 3]
. Значением по умолчанию является FixedInd
= 1 ; активы в первом инструменте считаются зафиксированные. Если никакие инструменты не должны считаться зафиксированные, введите
FixedInd
= [ ]
.
Типы данных: double
ConSet
— Дополнительные условия на перераспределениях портфеля[ ]
(значение по умолчанию) | матрица(Необязательно) Дополнительные условия на перераспределениях портфеля в виде многих ограничений (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
PortSens
— Долларовая чувствительность портфеляДолларовая чувствительность портфеля, возвращенная как ряд вопросов NSENS
- 1
вектор. Когда совершенная преграда существует, PortSens
нули. В противном случае лучшая возможная преграда выбрана.
PortValue
— Общая стоимость портфеляОбщая стоимость портфеля, возвращенная как скалярное значение. Когда совершенно самофинансирующаяся преграда существует, PortValue
равно значению dot(Price,CurrentHolds)
из начального портфеля.
PortHolds
— Контракты выделяются каждому инструментуКонтракты выделяются каждому инструменту, возвращенному как NINST
- 1
вектор. Это - перераспределенный портфель.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.