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