exponenta event banner

Создание объекта IRFuntsCurve

Чтобы создать объект IRFuntsCurve, см. следующие опции.

Подгонка объекта IRFuntsCurve с помощью дескриптора функции

Можно использовать конструктор 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

Подгонка объекта IRFфункциональная кривая методом Нельсона-Сигеля

Используйте метод, 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')

Подгонка объекта IRFuntsCurve методом Свенссона

Используйте метод, 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')

Фитинг объекта IRFuntsCurve с использованием метода сглаживания сплайна

Используйте метод, 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')

Использование fitFunction для создания пользовательской функции фитинга

При использовании 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')

См. также

| | |

Связанные примеры

Подробнее

Внешние веб-сайты