Чтобы создать объект IRFuntsCurve, см. следующие опции.
Подгонка объекта IRFфункциональная кривая методом Нельсона-Сигеля
Фитинг объекта IRFuntsCurve с использованием метода сглаживания сплайна
Использование fitFunction для создания пользовательской функции фитинга
Можно использовать конструктор IRFunctionCurve с помощью функции MATLAB ® для определения кривой процентных ставок. Дополнительные сведения об определении дескриптора функции см. в документации по основам программирования MATLAB.
В этом примере используется FunctionHandle аргумент со значением @(t) t.^2 для построения кривой процентных ставок:
rr = IRFunctionCurve('Zero',today,@(t) t.^2)
rr =
Properties:
FunctionHandle: @(t)t.^2
Type: 'Zero'
Settle: 733600
Compounding: 2
Basis: 0Используйте метод, fitNelsonSiegelдля модели Нельсона-Сигеля, которая соответствует эмпирической форме кривой доходности с заранее определенной функциональной формой спотовых ставок, которая является функцией времени до погашения облигаций.
Модель Нельсона-Сигеля представляет динамическую трехфакторную модель: уровень, уклон и кривизну. Однако факторы Нельсона-Сигеля являются ненаблюдаемыми или скрытыми, что допускает погрешность измерения, а связанные нагрузки имеют экономические ограничения (форвардные ставки всегда положительные, а дисконтный коэффициент приближается к нулю по мере увеличения срока погашения). Для получения дополнительной информации см. «Кривые доходности нулевого купона: техническая документация», BIS Papers, Bank for International Settlements, Number 25, October 2005.
В этом примере используется IRFunctionCurve для моделирования структуры процентных ставок в Соединенном Королевстве, свободной от дефолта.
Загрузите данные:
load ukdata20080430Перевести ставки репо в эквивалентные нулевые купонные облигации:
RepoCouponRate = repmat(0,size(RepoRates)); RepoPrice = bndprice(RepoRates, RepoCouponRate, RepoSettle, RepoMaturity);
Агрегируйте данные:
Settle = [RepoSettle;BondSettle];
Maturity = [RepoMaturity;BondMaturity];
CleanPrice = [RepoPrice;BondCleanPrice];
CouponRate = [RepoCouponRate;BondCouponRate];
Instruments = [Settle Maturity CleanPrice CouponRate];
InstrumentPeriod = [repmat(0,6,1);repmat(2,31,1)];
CurveSettle = datenum('30-Apr-2008'); IRFunctionCurve объект обеспечивает возможность подгонки кривой Нельсона-Сигеля к наблюдаемым рыночным данным с помощью fitNelsonSiegel способ. Фитинг выполняется путем вызова функции lsqnonlin. Этот метод имеет требуемые входные данные Type, Settleи матрица данных прибора.
NSModel = IRFunctionCurve.fitNelsonSiegel('Zero',CurveSettle,... Instruments,'Compounding',-1,'InstrumentPeriod',InstrumentPeriod);
Постройте график процентной ставки Нельсона-Сигеля для форвардных ставок:
PlottingDates = CurveSettle+20:30:CurveSettle+365*25;
TimeToMaturity = yearfrac(CurveSettle,PlottingDates);
NSForwardRates = getForwardRates(NSModel, PlottingDates);
plot(TimeToMaturity,NSForwardRates)
title('Nelson Siegel model of UK instantaneous nominal forward curve')
Используйте метод, fitSvensson, для модели Свенссона, чтобы улучшить гибкость кривых и подгонку для модели Нельсона-Сигеля. В 1994 году Свенссон расширил функцию Нельсона и Зигеля, добавив ещё один термин, позволяющий использовать второй «горб.» Дополнительная точность достигается за счет добавления еще двух параметров, β3 и β2, которые должны быть оценены.
В этом примере использования fitSvensson способ, IRFitOptions структура, ранее определенная с помощью IRFitOptions используется конструктор. Таким образом, необходимо указать FitType, InitialGuess, UpperBound, LowerBound, и OptOptions параметры оптимизации для lsqnonlin.
Загрузите данные:
load ukdata20080430Перевести ставки репо в эквивалентные нулевые купонные облигации:
RepoCouponRate = repmat(0,size(RepoRates)); RepoPrice = bndprice(RepoRates, RepoCouponRate, RepoSettle, RepoMaturity);
Агрегируйте данные:
Settle = [RepoSettle;BondSettle];
Maturity = [RepoMaturity;BondMaturity];
CleanPrice = [RepoPrice;BondCleanPrice];
CouponRate = [RepoCouponRate;BondCouponRate];
Instruments = [Settle Maturity CleanPrice CouponRate];
InstrumentPeriod = [repmat(0,6,1);repmat(2,31,1)];
CurveSettle = datenum('30-Apr-2008');
Определить OptOptions для IRFitOptions конструктор:
OptOptions = optimoptions('lsqnonlin','MaxFunEvals',1000); fIRFitOptions = IRFitOptions([5.82 -2.55 -.87 0.45 3.9 0.44],... 'FitType','durationweightedprice','OptOptions',OptOptions,... 'LowerBound',[0 -Inf -Inf -Inf 0 0],'UpperBound',[Inf Inf Inf Inf Inf Inf]);
Подгоните кривую процентных ставок с использованием модели Свенссона:
SvenssonModel = IRFunctionCurve.fitSvensson('Zero',CurveSettle,... Instruments,'IRFitOptions', fIRFitOptions, 'Compounding',-1,... 'InstrumentPeriod',InstrumentPeriod)
Local minimum possible. lsqnonlin stopped because the final change in the sum of squares relative to its initial value is less than the default value of the function tolerance. SvenssonModel = Type: Zero Settle: 733528 (30-Apr-2008) Compounding: -1 Basis: 0 (actual/actual)
Сообщение о состоянии, вывод из lsqnonlin, указывает, что оптимизация для поиска параметров уравнения Свенссона успешно завершена.
Постройте график процентной ставки Свенссона для форвардных ставок:
PlottingDates = CurveSettle+20:30:CurveSettle+365*25;
TimeToMaturity = yearfrac(CurveSettle,PlottingDates);
SvenssonForwardRates = getForwardRates(SvenssonModel, PlottingDates);
plot(TimeToMaturity,SvenssonForwardRates)
title('Svensson model of UK instantaneous nominal forward curve')
Используйте метод, fitSmoothingSplineдля моделирования структуры терминов сплайном, в частности, структура терминов представляет прямую кривую кубическим сплайном.
Примечание
Для использования программного обеспечения Toolbox™ фитинга кривой необходимо иметь лицензию fitSmoothingSpline способ.
IRFunctionCurve объект используется для размещения сглаживающего сплайнового представления прямой кривой с функцией штрафа. Требуемые входные данные: Type, Settle, матрица Instruments, и Lambdafun, дескриптор функции, содержащий функцию штрафа
Загрузите данные:
load ukdata20080430Перевести ставки репо в эквивалентные нулевые купонные облигации:
RepoCouponRate = repmat(0,size(RepoRates)); RepoPrice = bndprice(RepoRates, RepoCouponRate, RepoSettle, RepoMaturity);
Агрегируйте данные:
Settle = [RepoSettle;BondSettle];
Maturity = [RepoMaturity;BondMaturity];
CleanPrice = [RepoPrice;BondCleanPrice];
CouponRate = [RepoCouponRate;BondCouponRate];
Instruments = [Settle Maturity CleanPrice CouponRate];
InstrumentPeriod = [repmat(0,6,1);repmat(2,31,1)];
CurveSettle = datenum('30-Apr-2008');
Выберите параметры для Lambdafun:
L = 9.2; S = -1; mu = 1;
Определите Lambdafun функция штрафа:
lambdafun = @(t) exp(L - (L-S)*exp(-t/mu)); t = 0:.1:25; y = lambdafun(t); figure semilogy(t,y); title('Penalty Function for VRP Approach') ylabel('Penalty') xlabel('Time')

Используйте fitSmoothinSpline метод для соответствия кривой процентной ставки и модели Lambdafun функция штрафа:
VRPModel = IRFunctionCurve.fitSmoothingSpline('Forward',CurveSettle,... Instruments,lambdafun,'Compounding',-1, 'InstrumentPeriod',InstrumentPeriod);
Постройте график сглаживающей сплайн кривой процентных ставок для форвардных ставок:
PlottingDates = CurveSettle+20:30:CurveSettle+365*25;
TimeToMaturity = yearfrac(CurveSettle,PlottingDates);
VRPForwardRates = getForwardRates(VRPModel, PlottingDates);
plot(TimeToMaturity,VRPForwardRates)
title('Smoothing Spline model of UK instantaneous nominal forward curve')
При использовании IRFunctionCurve , можно создать пользовательскую функцию фитинга с помощью fitFunction способ. Использовать fitFunction, необходимо определить FunctionHandle. Кроме того, необходимо также использовать конструктор IRFitOptions определить IRFitOptionsObj для поддержки InitialGuess для параметров функции кривой.
Следующий пример демонстрирует использование fitFunction с FunctionHandle и IRFitOptionsObj:
Settle = repmat(datenum('30-Apr-2008'),[6 1]); Maturity = [datenum('07-Mar-2009');datenum('07-Mar-2011');... datenum('07-Mar-2013');datenum('07-Sep-2016');... datenum('07-Mar-2025');datenum('07-Mar-2036')]; CleanPrice = [100.1;100.1;100.8;96.6;103.3;96.3]; CouponRate = [0.0400;0.0425;0.0450;0.0400;0.0500;0.0425]; Instruments = [Settle Maturity CleanPrice CouponRate]; CurveSettle = datenum('30-Apr-2008');
Определите FunctionHandle:
functionHandle = @(t,theta) polyval(theta,t);
Определите OptOptions для IRFitOptions:
OptOptions = optimoptions('lsqnonlin','display','iter');
Определить fitFunction:
CustomModel = IRFunctionCurve.fitFunction('Zero', CurveSettle, ... functionHandle,Instruments, IRFitOptions([.05 .05 .05],'FitType','price',... 'OptOptions',OptOptions));
Norm of First-order
Iteration Func-count f(x) step optimality CG-iterations
0 4 38036.7 4.92e+04
1 8 38036.7 10 4.92e+04 0
2 12 38036.7 2.5 4.92e+04 0
3 16 38036.7 0.625 4.92e+04 0
4 20 38036.7 0.15625 4.92e+04 0
5 24 30741.5 0.0390625 1.72e+05 0
6 28 30741.5 0.078125 1.72e+05 0
7 32 30741.5 0.0195312 1.72e+05 0
8 36 28713.6 0.00488281 2.33e+05 0
9 40 20323.3 0.00976562 9.47e+05 0
10 44 20323.3 0.0195312 9.47e+05 0
11 48 20323.3 0.00488281 9.47e+05 0
12 52 20323.3 0.0012207 9.47e+05 0
13 56 19698.8 0.000305176 1.08e+06 0
14 60 17493 0.000610352 7e+06 0
15 64 17493 0.0012207 7e+06 0
16 68 17493 0.000305176 7e+06 0
17 72 15455.1 7.62939e-05 2.25e+07 0
18 76 15455.1 0.000177499 2.25e+07 0
19 80 13317.1 3.8147e-05 3.18e+07 0
20 84 12865.3 7.62939e-05 7.83e+07 0
21 88 11779.8 7.62939e-05 7.58e+06 0
22 92 11747.6 0.000152588 1.45e+05 0
23 96 11720.9 0.000305176 2.33e+05 0
24 100 11667.2 0.000610352 1.48e+05 0
25 104 11558.6 0.0012207 3.55e+05 0
26 108 11335.5 0.00244141 1.57e+05 0
27 112 10863.8 0.00488281 6.36e+05 0
28 116 9797.14 0.00976562 2.53e+05 0
29 120 6882.83 0.0195312 9.18e+05 0
30 124 6882.83 0.0373993 9.18e+05 0
31 128 3218.45 0.00934981 1.96e+06 0
32 132 612.703 0.0186996 3.01e+06 0
33 136 13.0998 0.0253882 3.05e+06 0
34 140 0.0762922 0.00154002 5.05e+04 0
35 144 0.0731652 3.61102e-06 29.9 0
36 148 0.0731652 6.32335e-08 0.063 0
Local minimum possible.
lsqnonlin stopped because the final change in the sum of squares relative to
its initial value is less than the default value of the function tolerance.
Постройте график пользовательской функции, определенной с помощью fitFunction:
Yields = bndyield(CleanPrice,CouponRate,Settle(1),Maturity); scatter(Maturity,Yields); PlottingPoints = min(Maturity):30:max(Maturity); hold on; plot(PlottingPoints, getParYields(CustomModel, PlottingPoints),'r'); datetick legend('Market Yields','Fitted Yield Curve') title('Custom Function fit to Market Data')

IRBootstrapOptions | IRDataCurve | IRFitOptions | IRFunctionCurve